1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 333529: Function instance as template argument.

This commit is contained in:
Markus Schorn 2011-01-07 14:44:54 +00:00
parent 91c157b041
commit ed13e97f59
2 changed files with 31 additions and 28 deletions

View file

@ -5193,4 +5193,12 @@ public class AST2TemplateTests extends AST2BaseTest {
public void testDefaultTmplArgumentOfFunctionTemplate_Bug333325() throws Exception {
parseAndCheckBindings();
}
// template <void (*Func)()> class X {};
// template <typename T> void Y();
// X< Y<int> > x; // Problem on X< Y<int> >
public void testFunctionInstanceAsTemplateArg_Bug333529() throws Exception {
parseAndCheckBindings();
}
}

View file

@ -564,35 +564,30 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
final IASTNamedTypeSpecifier namedDeclspec = (IASTNamedTypeSpecifier) declspec;
IASTName name= namedDeclspec.getName();
if (name.contains(typeId)) {
// A template-id cannot be used in an id-expression as a template argument
// 5.1-11 A template-id shall be used as an unqualified-id only as specified in
// 14.7.2, 14.7, and 14.5.4.
if (!(name.getLastName() instanceof ICPPASTTemplateId)) {
IToken typeIdEnd= mark();
IASTIdExpression idExpr= setRange(nodeFactory.newIdExpression(name), name);
try {
IASTExpression expression = expression(ExprKind.eAssignment, exprCtx, idExpr);
boolean isAmbiguous= (expression == idExpr);
if (LT(1) == IToken.tELLIPSIS) {
IToken ellipsis= consume();
if (isAmbiguous) {
addPackExpansion(typeId, ellipsis);
}
expression= addPackExpansion(expression, ellipsis);
}
if (isAmbiguous) {
ICPPASTAmbiguousTemplateArgument ambiguity= createAmbiguousTemplateArgument();
ambiguity.addTypeId(typeId);
ambiguity.addIdExpression(expression);
return ambiguity;
}
return expression;
} catch (BacktrackException e) {
// Use the typeId
}
backup(typeIdEnd);
namedDeclspec.setName(name);
IToken typeIdEnd= mark();
IASTIdExpression idExpr= setRange(nodeFactory.newIdExpression(name), name);
try {
IASTExpression expression = expression(ExprKind.eAssignment, exprCtx, idExpr);
boolean isAmbiguous= (expression == idExpr);
if (LT(1) == IToken.tELLIPSIS) {
IToken ellipsis= consume();
if (isAmbiguous) {
addPackExpansion(typeId, ellipsis);
}
expression= addPackExpansion(expression, ellipsis);
}
if (isAmbiguous) {
ICPPASTAmbiguousTemplateArgument ambiguity= createAmbiguousTemplateArgument();
ambiguity.addTypeId(typeId);
ambiguity.addIdExpression(expression);
return ambiguity;
}
return expression;
} catch (BacktrackException e) {
// Use the typeId
}
backup(typeIdEnd);
namedDeclspec.setName(name);
}
}
// There is no ambiguity, use the type-id