diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-05-21 23:18:07 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-05-21 23:18:07 +0000 |
commit | 786123dc48d80185f3799ddcaab5703108a64169 (patch) | |
tree | 4ee4f890e02acf7f6e4996a3f06684a7828b2b5a /clang/lib/Parse/MinimalAction.cpp | |
parent | 4dc833c607b516ab7794c9ddbc639a9b9d185cb9 (diff) | |
download | bcm5719-llvm-786123dc48d80185f3799ddcaab5703108a64169.tar.gz bcm5719-llvm-786123dc48d80185f3799ddcaab5703108a64169.zip |
Improve parser recovery when we encounter a dependent template name
that is missing the 'template' keyword, e.g.,
t->getAs<T>()
where getAs is a member of an unknown specialization. C++ requires
that we treat "getAs" as a value, but that would fail to parse since T
is the name of a type. We would then fail at the '>', since a type
cannot be followed by a '>'.
This is a very common error for C++ programmers to make, especially
since GCC occasionally allows it when it shouldn't (as does Visual
C++). So, when we are in this case, we use tentative parsing to see if
the tokens starting at "<" can only be parsed as a template argument
list. If so, we produce a diagnostic with a fix-it that states that
the 'template' keyword is needed:
test/SemaTemplate/dependent-template-recover.cpp:5:8: error: 'template' keyword
is required to treat 'getAs' as a dependent template name
t->getAs<T>();
^
template
This is just a start of this patch; I'd like to apply the same
approach to everywhere that a template-id with dependent template name
can be parsed.
llvm-svn: 104406
Diffstat (limited to 'clang/lib/Parse/MinimalAction.cpp')
-rw-r--r-- | clang/lib/Parse/MinimalAction.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/clang/lib/Parse/MinimalAction.cpp b/clang/lib/Parse/MinimalAction.cpp index 5a037678117..b7205160c17 100644 --- a/clang/lib/Parse/MinimalAction.cpp +++ b/clang/lib/Parse/MinimalAction.cpp @@ -194,7 +194,9 @@ MinimalAction::isTemplateName(Scope *S, UnqualifiedId &Name, TypeTy *ObjectType, bool EnteringScope, - TemplateTy &TemplateDecl) { + TemplateTy &TemplateDecl, + bool &MemberOfUnknownSpecialization) { + MemberOfUnknownSpecialization = false; return TNK_Non_template; } |