aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/MinimalAction.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-05-21 23:18:07 +0000
committerDouglas Gregor <dgregor@apple.com>2010-05-21 23:18:07 +0000
commit1fd6d44d7ca97631497551bbf98866263143d706 (patch)
treed55684a3629ba44cddbe0b9d29897c19e6663f3f /lib/Parse/MinimalAction.cpp
parentdb3f847cb883fdb19d79c7223fa032e7266c0ee5 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104406 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/MinimalAction.cpp')
-rw-r--r--lib/Parse/MinimalAction.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/Parse/MinimalAction.cpp b/lib/Parse/MinimalAction.cpp
index 5a03767811..b7205160c1 100644
--- a/lib/Parse/MinimalAction.cpp
+++ b/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;
}