From ed13e97f5929790715e536b8ca924b3f8c94da2e Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 7 Jan 2011 14:44:54 +0000 Subject: [PATCH] Bug 333529: Function instance as template argument. --- .../parser/tests/ast2/AST2TemplateTests.java | 8 +++ .../dom/parser/cpp/GNUCPPSourceParser.java | 51 +++++++++---------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 8b274ae9492..a9e92744003 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5193,4 +5193,12 @@ public class AST2TemplateTests extends AST2BaseTest { public void testDefaultTmplArgumentOfFunctionTemplate_Bug333325() throws Exception { parseAndCheckBindings(); } + + // template class X {}; + // template void Y(); + // X< Y > x; // Problem on X< Y > + public void testFunctionInstanceAsTemplateArg_Bug333529() throws Exception { + parseAndCheckBindings(); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index f8b5ed8540f..950b0979d57 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -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