summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/Parser.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-09 18:46:07 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-09 18:46:07 +0000
commit8bf4205c703aecfe28a8b4e3ae796e5b40be4672 (patch)
tree8e840fbe7de62cd7fbb0425a3810095c9e44e608 /clang/lib/Parse/Parser.cpp
parent1df2bbe7f9fde4a57ee5c088241007e4401f4061 (diff)
downloadbcm5719-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.cpp16
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
OpenPOWER on IntegriCloud