Instead of bailing out of parsing when we encounter an invalid template-name or template arguments in a template-id, produce an annotation token describing the invalid construct. This avoids duplicate errors and generally allows us to recover better. In principle we should be able to extend this to store some kinds of invalid template-id in the AST for tooling use, but that isn't handled as part of this change.
21 lines
686 B
C++
21 lines
686 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
template<typename T,
|
|
int I,
|
|
template<typename> class TT>
|
|
class A; // expected-note 3 {{template is declared here}}
|
|
|
|
template<typename> class X;
|
|
|
|
A<int, 0, X> * a1;
|
|
|
|
A<float, 1, X, double> *a2; // expected-error{{too many template arguments for class template 'A'}}
|
|
A<float, 1> *a3; // expected-error{{too few template arguments for class template 'A'}}
|
|
A a4; // expected-error{{use of class template 'A' requires template arguments}}
|
|
|
|
namespace test0 {
|
|
template <class t> class foo {};
|
|
template <class t> class bar {
|
|
bar(::test0::foo<tee> *ptr) {} // expected-error {{use of undeclared identifier 'tee'}}
|
|
};
|
|
}
|