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:
parent
91c157b041
commit
ed13e97f59
2 changed files with 31 additions and 28 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue