| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
| |
the EnumDecl when the enum type is complete. This allows us to detect
redefinitions of enums.
llvm-svn: 39300
|
|
|
|
|
|
|
|
| |
t.c:2:6: warning: ISO C forbids forward references to 'enum' types
enum foo22* X;
^
llvm-svn: 39299
|
|
|
|
| |
llvm-svn: 39297
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
t.c:10:15: warning: 'bonk' may not be nested in a struct due to flexible array member
struct bink bonk;
^
t.c:13:14: error: 'struct bink' may not be used as an array element due to flexible array member
struct bink A[123];
^
for:
struct bink {
struct bink *a;
int X[]; // ok.
};
struct foo {
int A;
struct bink bonk;
};
struct bink A[123];
llvm-svn: 39296
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct bork {
int X[];
};
struct bink {
struct bink a;
int X[]; // ok.
};
to:
t.c:3:7: error: flexible array 'X' not allowed in otherwise empty struct
int X[];
^
t.c:7:15: error: field 'a' has incomplete type
struct bink a;
^
llvm-svn: 39295
|
|
|
|
|
|
|
|
| |
t.c:5:8: error: field 'foo' declared as a function
void foo();
^
llvm-svn: 39294
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
like:
struct S { struct S {} X; };
with:
t.c:2:19: error: nested redefinition of 'struct'
struct S { struct S {} X; };
^
t.c:2:1: error: previous definition is here
struct S { struct S {} X; };
^
llvm-svn: 39292
|
|
|
|
| |
llvm-svn: 39291
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Diagnose redefintion of tag types, e.g.:
t.c:7:8: error: redefinition of 'blah'
struct blah {};
^
t.c:1:8: error: previous definition is here
struct blah {
^
2 diagnostics generated.
llvm-svn: 39286
|
|
|
|
|
|
| |
converting a declspec with TST = struct/union. Pretty print as well.
llvm-svn: 39284
|
|
|
|
| |
llvm-svn: 39283
|
|
|
|
|
|
| |
Use it to hold the declaration object for a struct/union.
llvm-svn: 39282
|
|
|
|
| |
llvm-svn: 39278
|
|
|
|
|
|
| |
rename it to ParseTag.
llvm-svn: 39277
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct blah * P;
union blah *P2;
we now emit:
t.c:2:1: error: redefinition of 'blah' with tag that does not match previous use
union blah *P2;
^
t.c:1:8: error: previous use is here
struct blah * P;
^
llvm-svn: 39275
|
|
|
|
|
|
|
| |
or a definition/declaration of a tag. This is required to handle
C99 6.7.2.3p11 properly.
llvm-svn: 39274
|
|
|
|
|
|
|
|
|
| |
catch the bad
case and handle identifiers in the same namespace correctly. This implements
test/Parser/c-namespace.c
llvm-svn: 39272
|
|
|
|
|
|
| |
byeliminating the 'next' pointer from the ctor, and add initial support forparsing struct/union tags.
llvm-svn: 39266
|
|
|
|
|
|
|
| |
eliminating the 'next' pointer from the ctor, and add initial support for
parsing struct/union tags.
llvm-svn: 39265
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Detect and emit errors when names are redefined in the same scope, e.g.
test/Parser/argument_redef.c, which now emits:
argument_redef.c:4:22: error: redefinition of 'A'
int foo(int A) { int A; }
^
argument_redef.c:4:13: error: previous definition is here
int foo(int A) { int A; }
^
llvm-svn: 39257
|
|
|
|
| |
llvm-svn: 39256
|
|
|
|
|
|
|
| |
inserting them into the function body scope and registering them with the
corresponding FunctionDecl.
llvm-svn: 39253
|
|
|
|
|
|
| |
reinterpret_cast, and static_cast. Patch by Bill!
llvm-svn: 39247
|
|
|
|
| |
llvm-svn: 39242
|
|
|
|
|
|
| |
diagnosing malformed K&R function definitions.
llvm-svn: 39241
|
|
|
|
|
|
| |
void foo(void (*q)(a,b,c)) {}
llvm-svn: 39240
|
|
|
|
|
|
|
|
| |
void bar(int X, int X);
void blah(X, Y, X) int X, Y; {}
llvm-svn: 39239
|
|
|
|
| |
llvm-svn: 39238
|
|
|
|
|
|
|
| |
This allows us to handle typedefs of void correctly. This implements
clang/test/Sema/void_arg.c
llvm-svn: 39236
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This lets us pretty print stuff like this:
void foo() {
int X;
X = sizeof(void (*(*)())());
X = sizeof(int(*)(int, float, ...));
X = sizeof(void (*(int arga, void (*argb)(double Y)))(void* Z));
as:
X = sizeof(void (*(*)())())
X = sizeof(int (*)(int, float, ...))
X = sizeof(void (*(int, void (*)(double)))(void *))
Ah the wonders of 'modern' C syntax!
llvm-svn: 39232
|
|
|
|
| |
llvm-svn: 39231
|
|
|
|
|
|
|
|
| |
the info. Also, call Actions.ParseParamDeclaratorType instead of
Actions.ParseDeclarator for parameter type lists: we don't want declaration
objects created when parsing a function declarator, we just want type info.
llvm-svn: 39230
|
|
|
|
|
|
|
|
|
| |
parameters: build an array of ParamInfo structures and pass it to the
declarator for safe keeping (it owns the list).
Next step: actually populate the arg array with useful stuff.
llvm-svn: 39229
|
|
|
|
|
|
| |
for things like 'short _Complex'.
llvm-svn: 39227
|
|
|
|
| |
llvm-svn: 39223
|
|
|
|
| |
llvm-svn: 39222
|
|
|
|
| |
llvm-svn: 39221
|
|
|
|
|
|
| |
the containing function. This avoids leaking decls.
llvm-svn: 39197
|
|
|
|
|
|
| |
called before and one which is called after function definition parsing.
llvm-svn: 39196
|
|
|
|
|
|
|
|
| |
int A() {
return X();
}
llvm-svn: 39194
|
|
|
|
| |
llvm-svn: 39193
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
typedef int X;
int A() {
return X;
}
int B() {
return Y;
}
as:
/Users/sabre/test.c:5:10: error: unexpected type name 'X': expected expression
return X;
^
/Users/sabre/test.c:9:10: error: use of undeclared 'Y' value
return Y;
^
llvm-svn: 39192
|
|
|
|
| |
llvm-svn: 39191
|
|
|
|
|
|
|
|
| |
typedef int G;
X = sizeof(const G);
X = sizeof(restrict G);
llvm-svn: 39190
|
|
|
|
|
|
|
|
|
|
| |
allows us to handle stuff like:
typedef int G;
..
X = sizeof(G);
llvm-svn: 39189
|
|
|
|
|
|
| |
typedef.
llvm-svn: 39188
|
|
|
|
| |
llvm-svn: 39187
|
|
|
|
| |
llvm-svn: 39186
|
|
|
|
| |
llvm-svn: 39185
|
|
|
|
| |
llvm-svn: 39184
|