Chris Lattner
ff65b6bc85
Unstack identifiers more carefully when poping scope. Add assertion to catch the bad
...
case and handle identifiers in the same namespace correctly. This implements
test/Parser/c-namespace.c
llvm-svn: 39272
2007-01-23 01:33:16 +00:00
Chris Lattner
d0ee402a43
Make name lookup properly obey C namespaces, simplify decl construction byeliminating the 'next' pointer from the ctor, and add initial support forparsing struct/union tags.
...
llvm-svn: 39266
2007-01-22 07:39:30 +00:00
Chris Lattner
18b196282f
Make name lookup properly obey C namespaces, simplify decl construction by
...
eliminating the 'next' pointer from the ctor, and add initial support for
parsing struct/union tags.
llvm-svn: 39265
2007-01-22 07:39:13 +00:00
Chris Lattner
ec040b1d89
make Decl::getName() not crash if the decl is unnamed (e.g. an unnamed argument)
...
llvm-svn: 39260
2007-01-21 23:09:50 +00:00
Chris Lattner
99d3177103
Change scopes to maintain decls, not identifiers.
...
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
2007-01-21 22:37:37 +00:00
Chris Lattner
f61c8a805d
Handle C99 6.7.5.3p10, fixing test/Parser/attributes.c
...
llvm-svn: 39256
2007-01-21 19:04:43 +00:00
Chris Lattner
8f5bf2f233
avoid allocating memory for empty arg lists
...
llvm-svn: 39255
2007-01-21 19:04:10 +00:00
Chris Lattner
c5cdf4d092
Next big step in function parsing: create decl objects for parameters,
...
inserting them into the function body scope and registering them with the
corresponding FunctionDecl.
llvm-svn: 39253
2007-01-21 07:42:07 +00:00
Chris Lattner
29375654b6
Add support for parsing and pretty printing const_cast, dynamic_cast,
...
reinterpret_cast, and static_cast. Patch by Bill!
llvm-svn: 39247
2006-12-04 18:06:35 +00:00
Chris Lattner
2114d5e948
add some comments
...
llvm-svn: 39242
2006-12-04 07:40:24 +00:00
Chris Lattner
5c5fbccc96
Scrutinize K&R parameter declarations. This implements C99 6.9.1p6, correctly
...
diagnosing malformed K&R function definitions.
llvm-svn: 39241
2006-12-03 08:41:30 +00:00
Chris Lattner
0d89d5a638
Enforce C99 6.7.5.3p3, rejecting code like:
...
void foo(void (*q)(a,b,c)) {}
llvm-svn: 39240
2006-12-03 07:14:39 +00:00
Chris Lattner
969ca15b41
Diagnose errors like:
...
void bar(int X, int X);
void blah(X, Y, X) int X, Y; {}
llvm-svn: 39239
2006-12-03 06:29:03 +00:00
Chris Lattner
53e776c1e4
reject int(const void).
...
llvm-svn: 39238
2006-12-03 03:07:05 +00:00
Chris Lattner
726f97b435
implement a fixme: make BuiltinType have an enum, specifying which type it is,
...
instead of having a string.
llvm-svn: 39237
2006-12-03 02:57:32 +00:00
Chris Lattner
c81f079d7e
move void argument checking from the parser to the semantic analysis stage.
...
This allows us to handle typedefs of void correctly. This implements
clang/test/Sema/void_arg.c
llvm-svn: 39236
2006-12-03 02:43:54 +00:00
Chris Lattner
d2e97c1f80
Handle void correctly in the argument list for a function. For:
...
X = sizeof(int (void a));
X = sizeof(int (int, void));
X = sizeof(int (void, ...));
We now emit:
t.c:6:24: error: void argument may not have a name
X = sizeof(int (void a));
^
t.c:7:24: error: 'void' must be the first and only parameter if specified
X = sizeof(int (int, void));
^
t.c:8:19: error: 'void' must be the first and only parameter if specified
X = sizeof(int (void, ...));
^
And we pretty print this correctly (even though void isn't stored in the
arg list of the function type):
X = sizeof(int (void));
However, this approach will have to change to handle typedefs of void.
llvm-svn: 39235
2006-12-03 02:03:33 +00:00
Chris Lattner
c6ad8131dd
implement AST representation for function types with and without a prototype.
...
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
2006-12-02 07:52:18 +00:00
Chris Lattner
216d8654fd
implement ParseParamDeclaratorType in the ast builder
...
llvm-svn: 39231
2006-12-02 06:47:41 +00:00
Chris Lattner
cbc426d4f7
Next step of retaining information about function prototypes: actually retain
...
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
2006-12-02 06:43:02 +00:00
Chris Lattner
edc9e39d88
First step towards accurately retaining information about function
...
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
2006-12-02 06:21:46 +00:00
Chris Lattner
b20e89449f
capture sourcelocation info for type specifiers. This improves diagnostics
...
for things like 'short _Complex'.
llvm-svn: 39227
2006-11-28 05:30:29 +00:00
Chris Lattner
353f5740b1
Finish converting DeclSpec to use accessors.
...
llvm-svn: 39223
2006-11-28 04:50:12 +00:00
Chris Lattner
a925dc66e4
Convert more code to use DeclSpec accessors
...
llvm-svn: 39222
2006-11-28 04:33:46 +00:00
Chris Lattner
f055d43211
add accessors to DeclSpec, start moving clients over to use them.
...
llvm-svn: 39221
2006-11-28 04:28:12 +00:00
Chris Lattner
740b2f30c7
When a decl is popped from its current scope, link it to the decl chain for
...
the containing function. This avoids leaking decls.
llvm-svn: 39197
2006-11-21 01:32:20 +00:00
Chris Lattner
229ce60fc9
split the ParseFunctionDefinition action into two actions, one which is
...
called before and one which is called after function definition parsing.
llvm-svn: 39196
2006-11-21 01:21:07 +00:00
Chris Lattner
ac18be9ad2
Add support for C90 implicitly defined functions, e.g.:
...
int A() {
return X();
}
llvm-svn: 39194
2006-11-20 06:49:47 +00:00
Chris Lattner
5efbb33a6b
remember referenced decls in our AST's
...
llvm-svn: 39193
2006-11-20 05:01:40 +00:00
Chris Lattner
17ed487947
parse identifier expressions properly. This allows us diagnose this:
...
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
2006-11-20 04:58:19 +00:00
Chris Lattner
0d8b1a1eff
remember and pretty-print cast types
...
llvm-svn: 39191
2006-11-20 04:34:45 +00:00
Chris Lattner
f0a40e7ef4
correctly handle stuff like:
...
typedef int G;
X = sizeof(const G);
X = sizeof(restrict G);
llvm-svn: 39190
2006-11-20 04:17:27 +00:00
Chris Lattner
d0342e5989
Create a new TypeNameType class, which represents typedefs as types. This
...
allows us to handle stuff like:
typedef int G;
..
X = sizeof(G);
llvm-svn: 39189
2006-11-20 04:02:15 +00:00
Chris Lattner
2ebe4bb64d
when a typedef name is parsed as part of declspecs, remember the decl for the
...
typedef.
llvm-svn: 39188
2006-11-20 01:29:42 +00:00
Chris Lattner
5ca17df626
decls should all have types
...
llvm-svn: 39187
2006-11-19 23:32:49 +00:00
Chris Lattner
591a675b1c
remove #include of clang/Parse/DeclSpec.h from clang/AST/Decl.h
...
llvm-svn: 39186
2006-11-19 23:16:18 +00:00
Chris Lattner
da8aa7b3a8
implement RTTI for Decl objects, eliminate some hokey virtual methods.
...
llvm-svn: 39185
2006-11-19 23:12:30 +00:00
Chris Lattner
200bdc3b90
add an action method for declspecs without declarators, like "struct foo;".
...
llvm-svn: 39184
2006-11-19 02:43:37 +00:00
Chris Lattner
302b4be4c2
build TypedefDecl objects when parsing typedefs.
...
Add a parsing fastpath for when we see typedef at the top-level.
llvm-svn: 39182
2006-11-19 02:31:38 +00:00
Chris Lattner
33e8a55ed0
Parse and remember types enough that we can pretty print:
...
void foo(int X) {
X = __alignof(int);
X = sizeof(const int** restrict ** volatile*);
}
as:
x = __alignof(int)
x = sizeof(int const **restrict **volatile *)
llvm-svn: 39181
2006-11-19 01:48:02 +00:00
Chris Lattner
558cb292da
add an action for parsing type names.
...
llvm-svn: 39180
2006-11-19 01:31:06 +00:00
Chris Lattner
9dfdb3c70d
rearrange the type printing code so that we can do the horrible C "inside out"
...
thing properly. This allows us to print types like:
int (*A)[restrict static 4][6];
properly, in addition to representing them properly. :)
llvm-svn: 39178
2006-11-13 07:38:09 +00:00
Chris Lattner
d235d162d0
change print methods to render into a string, which is more useful for diagnostics
...
and for handling precedence of types more accurately
llvm-svn: 39177
2006-11-13 06:22:30 +00:00
Chris Lattner
7ccecb90d4
Implement parsing, printing and AST'ing of array types (except for the bounds).
...
This allows us to handle:
int (*A)[restrict static 4][6];
for example.
llvm-svn: 39176
2006-11-12 08:50:50 +00:00
Chris Lattner
47814666e1
Implement and use isa/dyncast/cast etc for Type classes.
...
llvm-svn: 39175
2006-11-12 00:56:20 +00:00
Chris Lattner
d5973ebbe2
Teach ASTContext to delete all created types in its dtor.
...
Teach getPointerType to (stupidly) memoize all created pointers.
Give types an enum so we can implement classof.
llvm-svn: 39174
2006-11-12 00:53:46 +00:00
Chris Lattner
970e54e3ac
Build ASTs for the pointer qualifiers on declarators. This allows us to
...
parse (and print) things like:
int* const* restrict* const volatile***
etc.
llvm-svn: 39173
2006-11-12 00:37:36 +00:00
Chris Lattner
aecbefa519
We can now parse and remember the distinction between:
...
'unsigned char' and 'unsigned char const'.
-Chris
llvm-svn: 39172
2006-11-12 00:05:06 +00:00
Chris Lattner
b571a5cbdc
implement conversion of simple declspec base types, and implement TypeRef::dump
...
llvm-svn: 39170
2006-11-11 23:56:48 +00:00
Chris Lattner
f84a79c4e9
restructure code to build the framework for creating types from declarators.
...
llvm-svn: 39166
2006-11-11 22:59:23 +00:00
Chris Lattner
ef51c20065
add the builtin types
...
llvm-svn: 39164
2006-11-10 07:17:23 +00:00
Chris Lattner
ddc135e593
Let ASTContext hold target info, since it's useful
...
llvm-svn: 39162
2006-11-10 06:34:16 +00:00
Chris Lattner
cb6a382b67
introduce a new ASTContext class to hold long-lived ast nodes.
...
llvm-svn: 39161
2006-11-10 06:20:45 +00:00
Chris Lattner
e168f76c2d
move the rest of the expr sema to SemaExpr.cpp and the decl processing stuff
...
to SemaDecl.cpp
llvm-svn: 39159
2006-11-10 05:29:30 +00:00
Chris Lattner
eaafe122b6
move semantic analysis of break/continue out of the parser into the sema class.
...
llvm-svn: 39157
2006-11-10 05:17:58 +00:00
Chris Lattner
af8d581230
move semantic analysis of statements to it's own file.
...
llvm-svn: 39156
2006-11-10 05:07:45 +00:00
Chris Lattner
5b183d882b
split semantic analysis of expressions out to its own file
...
llvm-svn: 39155
2006-11-10 05:03:26 +00:00
Chris Lattner
ddd6fc84cf
move ASTBuilder.h/cpp to be a private Sema.h/cpp files, not part of the
...
interface exported by libast.
llvm-svn: 39154
2006-11-10 04:58:55 +00:00
Chris Lattner
cc67ec1743
rename ASTBuilder to Sema
...
llvm-svn: 39153
2006-11-09 06:54:47 +00:00
Chris Lattner
697e5d692b
Change courses on how we do semantic analysis. Semantic analysis
...
fundamentally requires having an AST around, so move all sema to the
AST library. This is the first step, later steps will be needed to
clean up libast.
llvm-svn: 39150
2006-11-09 06:32:27 +00:00
Chris Lattner
1576870356
pretty print postfix ++/-- nicer
...
llvm-svn: 39137
2006-11-05 23:54:51 +00:00
Chris Lattner
0663d2afd9
start factoring actions into two flavors: minimal and semantic actions.
...
llvm-svn: 39133
2006-11-05 18:39:59 +00:00
Chris Lattner
36ad123dea
print indirect goto correctly
...
llvm-svn: 39122
2006-11-05 01:51:06 +00:00
Chris Lattner
16976d3e83
build ast nodes and print goto/goto*/break/continue.
...
llvm-svn: 39121
2006-11-05 01:46:01 +00:00
Chris Lattner
6c0ff13761
Add ast node support for case/default/label stmts.
...
llvm-svn: 39120
2006-11-05 00:19:50 +00:00
Chris Lattner
f2174b633b
implement AST node for switch stmt
...
llvm-svn: 39119
2006-11-04 20:59:27 +00:00
Chris Lattner
76af84462c
use the StmtNodes.def database to eliminate redundant code.
...
llvm-svn: 39118
2006-11-04 20:54:18 +00:00
Chris Lattner
6fef2fb277
Add a new StmtNodes.def file as a catalog of all the Stmt's. This helps
...
eliminate repetitive code.
llvm-svn: 39117
2006-11-04 20:49:30 +00:00
Chris Lattner
85ed873bdc
implement ast nodes for while and do loops
...
llvm-svn: 39116
2006-11-04 20:40:44 +00:00
Chris Lattner
5d8f494c00
pretty print strings more nicely
...
llvm-svn: 39114
2006-11-04 20:29:31 +00:00
Chris Lattner
71e23ce2e1
Add AST node, AST building, actions, and printing for 'for' stmts.
...
llvm-svn: 39113
2006-11-04 20:18:38 +00:00
Chris Lattner
882f788ef4
Implement the rest of the printer, restoring parity of functionality.
...
llvm-svn: 39111
2006-11-04 18:52:07 +00:00
Chris Lattner
a3bcb7a104
start converting dumper to be a simple visitor
...
llvm-svn: 39109
2006-11-04 07:16:25 +00:00
Chris Lattner
9ea960a220
make visit methods take a reference to a visitor instead of a pointer.
...
Remove all dump_impl methods from Stmt subclasses
llvm-svn: 39108
2006-11-04 07:16:04 +00:00
Chris Lattner
72b7d39d78
remove full locinfo AST nodes for now. They just clutter the implementation
...
and should be implemented with an ASTBuilder subclass anyway.
llvm-svn: 39107
2006-11-04 06:37:16 +00:00
Chris Lattner
2ebe646f00
new file
...
llvm-svn: 39106
2006-11-04 06:33:06 +00:00
Chris Lattner
469d357425
implement visitor chaining.
...
llvm-svn: 39105
2006-11-04 06:32:52 +00:00
Chris Lattner
5e9a878126
add a new StmtVisitor class for traversing Stmt/Expr nodes.
...
llvm-svn: 39104
2006-11-04 06:21:51 +00:00
Chris Lattner
7cee11f078
Export the ASTBuilder class from the AST module.
...
llvm-svn: 39095
2006-11-03 06:42:29 +00:00
Chris Lattner
2abeb12df6
Fix building after the pure virtual function name changed.
...
llvm-svn: 39075
2006-10-28 19:51:26 +00:00
Chris Lattner
05646c7f0e
Fix these to allow clang to be in any dir.
...
llvm-svn: 39055
2006-10-26 04:56:55 +00:00
Chris Lattner
5f84a0648d
add ast node for ifstmt
...
llvm-svn: 39051
2006-10-25 05:55:20 +00:00
Chris Lattner
c52b118676
Handle __extension__ as a unary operator if requested.
...
llvm-svn: 39050
2006-10-25 05:45:55 +00:00
Chris Lattner
0535ebb3bd
only add to LastInGroupList if at the top-level.
...
llvm-svn: 39049
2006-10-25 05:28:22 +00:00
Chris Lattner
6d9a685d75
Make the driver print function bodies at -parse-print-ast
...
llvm-svn: 39048
2006-10-25 05:11:20 +00:00
Chris Lattner
b19f796e97
llvm has no EH by default, no need for these flags.
...
llvm-svn: 39047
2006-10-25 05:09:05 +00:00
Chris Lattner
e5cca06829
Make AST nodes for ReturnStmt's and CompoundStmts
...
llvm-svn: 39046
2006-10-25 04:29:46 +00:00
Chris Lattner
f42cce7a8e
Add new Stmt class
...
llvm-svn: 39045
2006-10-25 04:09:21 +00:00
Chris Lattner
ae31969ad2
Finish removing LexerToken from actions interface
...
llvm-svn: 39044
2006-10-25 03:49:28 +00:00
Chris Lattner
0ba3dc4ec3
Start removing LexerToken from the actions interface.
...
llvm-svn: 39043
2006-10-25 03:38:23 +00:00
Chris Lattner
ae986d5ac7
Remove temporary code
...
llvm-svn: 38999
2006-10-17 02:54:07 +00:00
Chris Lattner
30f910e88e
implement action callbacks for almost all the stmts.
...
llvm-svn: 38993
2006-10-16 05:52:41 +00:00
Chris Lattner
2dacc3ff2e
Changes through out the parser and actions/ast interface to return top-level
...
declarations through the asm streamer. For a testcase like:
int G;
int H, I, *J;
int func() {}
'clang -parse-print-ast' prints:
Read top-level decl: G
Read top-level decl: H
Read top-level decl: I
Read top-level decl: J
Read top-level decl: func
llvm-svn: 38992
2006-10-16 00:33:54 +00:00
Chris Lattner
a11999d83a
start creating proper ast nodes for variables and functions
...
llvm-svn: 38991
2006-10-15 22:34:45 +00:00
Chris Lattner
94b4ce3eae
don't abort
...
llvm-svn: 38965
2006-10-06 05:51:35 +00:00
Chris Lattner
d3e9895b9a
Initial support for semantic analysis and AST building for StringExpr nodes.
...
llvm-svn: 38960
2006-10-06 05:22:26 +00:00
Chris Lattner
26da7302ce
Build AST's for sizeof/alignof with type operands.
...
llvm-svn: 38951
2006-08-24 06:49:19 +00:00
Chris Lattner
e550a4ea12
Build CastExpr AST nodes
...
llvm-svn: 38950
2006-08-24 06:37:51 +00:00
Chris Lattner
26115acb1c
Build AST's for sizeof/alignof an expr.
...
llvm-svn: 38949
2006-08-24 06:10:04 +00:00
Chris Lattner
6f3a117f81
switch MemberExpr to holding a field decl instead of a raw identifier.
...
llvm-svn: 38948
2006-08-24 05:19:28 +00:00
Chris Lattner
98286a4551
Allow expression actions to fail
...
llvm-svn: 38947
2006-08-24 05:02:11 +00:00
Chris Lattner
0eedafed1d
more comments.
...
llvm-svn: 38945
2006-08-24 04:56:27 +00:00
Chris Lattner
879b9ad083
Add initial support for simple-primary exprs, including DeclExprs.
...
llvm-svn: 38944
2006-08-24 04:53:44 +00:00
Chris Lattner
e165d944c2
Add AST nodes for array, call, . and ->.
...
llvm-svn: 38943
2006-08-24 04:40:38 +00:00
Chris Lattner
1b92649857
Add AST nodes and actions for paren exprs and simple unary ops.
...
llvm-svn: 38940
2006-08-23 06:42:10 +00:00
Chris Lattner
9b6d4cb90e
Add (basic) expression AST representation capabilities for int/fp/binops/condexpr.
...
Add callbacks for same.
Add "full locinfo" mode.
llvm-svn: 38939
2006-08-23 05:17:46 +00:00
Chris Lattner
c11438cee1
Implement first cut of ASTBuilder class.
...
llvm-svn: 38938
2006-08-18 05:17:52 +00:00
Chris Lattner
38ba3363ef
Hook up more of the ASTStreamer
...
llvm-svn: 38936
2006-08-17 07:04:37 +00:00
Chris Lattner
73709eda2b
Stub out the ASTStreamer
...
llvm-svn: 38935
2006-08-17 06:28:25 +00:00
Chris Lattner
769044337a
add ast library
...
llvm-svn: 38934
2006-08-17 05:55:28 +00:00
Chris Lattner
3e7bd4ed44
Start adding support for printing out parser callbacks and adding ast building
...
llvm-svn: 38933
2006-08-17 05:51:27 +00:00