1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-28 19:35:36 +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 { public void testDefaultTmplArgumentOfFunctionTemplate_Bug333325() throws Exception {
parseAndCheckBindings(); 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; final IASTNamedTypeSpecifier namedDeclspec = (IASTNamedTypeSpecifier) declspec;
IASTName name= namedDeclspec.getName(); IASTName name= namedDeclspec.getName();
if (name.contains(typeId)) { if (name.contains(typeId)) {
// A template-id cannot be used in an id-expression as a template argument IToken typeIdEnd= mark();
// 5.1-11 A template-id shall be used as an unqualified-id only as specified in IASTIdExpression idExpr= setRange(nodeFactory.newIdExpression(name), name);
// 14.7.2, 14.7, and 14.5.4. try {
if (!(name.getLastName() instanceof ICPPASTTemplateId)) { IASTExpression expression = expression(ExprKind.eAssignment, exprCtx, idExpr);
IToken typeIdEnd= mark(); boolean isAmbiguous= (expression == idExpr);
IASTIdExpression idExpr= setRange(nodeFactory.newIdExpression(name), name); if (LT(1) == IToken.tELLIPSIS) {
try { IToken ellipsis= consume();
IASTExpression expression = expression(ExprKind.eAssignment, exprCtx, idExpr); if (isAmbiguous) {
boolean isAmbiguous= (expression == idExpr); addPackExpansion(typeId, ellipsis);
if (LT(1) == IToken.tELLIPSIS) { }
IToken ellipsis= consume(); expression= addPackExpansion(expression, ellipsis);
if (isAmbiguous) { }
addPackExpansion(typeId, ellipsis); if (isAmbiguous) {
} ICPPASTAmbiguousTemplateArgument ambiguity= createAmbiguousTemplateArgument();
expression= addPackExpansion(expression, ellipsis); ambiguity.addTypeId(typeId);
} ambiguity.addIdExpression(expression);
if (isAmbiguous) { return ambiguity;
ICPPASTAmbiguousTemplateArgument ambiguity= createAmbiguousTemplateArgument(); }
ambiguity.addTypeId(typeId); return expression;
ambiguity.addIdExpression(expression); } catch (BacktrackException e) {
return ambiguity; // Use the typeId
}
return expression;
} catch (BacktrackException e) {
// Use the typeId
}
backup(typeIdEnd);
namedDeclspec.setName(name);
} }
backup(typeIdEnd);
namedDeclspec.setName(name);
} }
} }
// There is no ambiguity, use the type-id // There is no ambiguity, use the type-id