diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-09 18:46:07 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-09 18:46:07 +0000 |
commit | 8bf4205c703aecfe28a8b4e3ae796e5b40be4672 (patch) | |
tree | 8e840fbe7de62cd7fbb0425a3810095c9e44e608 /clang/lib/Parse/Parser.cpp | |
parent | 1df2bbe7f9fde4a57ee5c088241007e4401f4061 (diff) | |
download | bcm5719-llvm-8bf4205c703aecfe28a8b4e3ae796e5b40be4672.tar.gz bcm5719-llvm-8bf4205c703aecfe28a8b4e3ae796e5b40be4672.zip |
Start processing template-ids as types when the template-name refers
to a class template. For example, the template-id 'vector<int>' now
has a nice, sugary type in the type system. What we can do now:
- Parse template-ids like 'vector<int>' (where 'vector' names a
class template) and form proper types for them in the type system.
- Parse icky template-ids like 'A<5>' and 'A<(5 > 0)>' properly,
using (sadly) a bool in the parser to tell it whether '>' should
be treated as an operator or not.
This is a baby-step, with major problems and limitations:
- There are currently two ways that we handle template arguments
(whether they are types or expressions). These will be merged, and,
most likely, TemplateArg will disappear.
- We don't have any notion of the declaration of class template
specializations or of template instantiations, so all template-ids
are fancy names for 'int' :)
llvm-svn: 64153
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index f28767a0fdb..7b09d2105c2 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -20,7 +20,8 @@ using namespace clang; Parser::Parser(Preprocessor &pp, Action &actions) - : PP(pp), Actions(actions), Diags(PP.getDiagnostics()) { + : PP(pp), Actions(actions), Diags(PP.getDiagnostics()), + GreaterThanIsOperator(true) { Tok.setKind(tok::eof); CurScope = 0; NumCachedScopes = 0; @@ -785,10 +786,15 @@ bool Parser::TryAnnotateTypeOrScopeToken() { } // If this is a template-id, annotate the template-id token. - if (NextToken().is(tok::less)) - if (DeclTy *Template = - Actions.isTemplateName(*Tok.getIdentifierInfo(), CurScope, &SS)) - AnnotateTemplateIdToken(Template, &SS); + if (NextToken().is(tok::less)) { + DeclTy *Template; + if (TemplateNameKind TNK + = Actions.isTemplateName(*Tok.getIdentifierInfo(), + CurScope, Template, &SS)) { + AnnotateTemplateIdToken(Template, TNK, &SS); + return true; + } + } // We either have an identifier that is not a type name or we have // just created a template-id that might be a type name. Both |