forked from OSchip/llvm-project
Properly disambiguate between an elaborated-type-specifier and a
type-parameter within a template parameter list. Found by inspection. llvm-svn: 105462
This commit is contained in:
parent
878bdccea6
commit
71b209dea6
|
@ -341,8 +341,37 @@ Parser::ParseTemplateParameterList(unsigned Depth,
|
|||
/// \brief Determine whether the parser is at the start of a template
|
||||
/// type parameter.
|
||||
bool Parser::isStartOfTemplateTypeParameter() {
|
||||
if (Tok.is(tok::kw_class))
|
||||
return true;
|
||||
if (Tok.is(tok::kw_class)) {
|
||||
// "class" may be the start of an elaborated-type-specifier or a
|
||||
// type-parameter. Per C++ [temp.param]p3, we prefer the type-parameter.
|
||||
switch (NextToken().getKind()) {
|
||||
case tok::equal:
|
||||
case tok::comma:
|
||||
case tok::greater:
|
||||
case tok::greatergreater:
|
||||
case tok::ellipsis:
|
||||
return true;
|
||||
|
||||
case tok::identifier:
|
||||
// This may be either a type-parameter or an elaborated-type-specifier.
|
||||
// We have to look further.
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (GetLookAheadToken(2).getKind()) {
|
||||
case tok::equal:
|
||||
case tok::comma:
|
||||
case tok::greater:
|
||||
case tok::greatergreater:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (Tok.isNot(tok::kw_typename))
|
||||
return false;
|
||||
|
|
|
@ -14,4 +14,9 @@ template<typename T, typename X<T>::type Value> struct Y1;
|
|||
// A storage class shall not be specified in a template-parameter declaration.
|
||||
template<static int Value> struct Z; // FIXME: expect an error
|
||||
|
||||
// Make sure that we properly disambiguate non-type template parameters that
|
||||
// start with 'class'.
|
||||
class X1 { };
|
||||
template<class X1 *xptr> struct Y2 { };
|
||||
|
||||
// FIXME: add the example from p2
|
||||
|
|
Loading…
Reference in New Issue