]> granicus.if.org Git - clang/commit
Improve parser recovery when we encounter a dependent template name
authorDouglas Gregor <dgregor@apple.com>
Fri, 21 May 2010 23:18:07 +0000 (23:18 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 21 May 2010 23:18:07 +0000 (23:18 +0000)
commit1fd6d44d7ca97631497551bbf98866263143d706
treed55684a3629ba44cddbe0b9d29897c19e6663f3f
parentdb3f847cb883fdb19d79c7223fa032e7266c0ee5
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
12 files changed:
include/clang/Basic/DiagnosticParseKinds.td
include/clang/Parse/Action.h
include/clang/Parse/Parser.h
lib/Parse/MinimalAction.cpp
lib/Parse/ParseExprCXX.cpp
lib/Parse/ParseTemplate.cpp
lib/Parse/Parser.cpp
lib/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaTemplate.cpp
test/SemaTemplate/dependent-template-recover.cpp [new file with mode: 0644]