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 e1caf59801a..abdbba2cb30 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 @@ -5605,4 +5605,15 @@ public class AST2TemplateTests extends AST2BaseTest { public void testNestedTemplateAmbiguity_363609() throws Exception { parseAndCheckBindings(); } + + // struct A { + // void m() {} + // }; + // template struct B {}; + // void test() { + // B b1; + // } + public void testDefaultArgForNonTypeTemplateParameter_363743() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java index 7240c76ce5e..29f4703398b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; +import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -40,6 +41,7 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements super(name); } + @Override public IASTExpression getDefault() { IASTInitializerClause def= getDefaultClause(); if (def instanceof IASTExpression) { @@ -59,7 +61,7 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements IASTNode parent = name.getParent(); assert parent instanceof IASTDeclarator; if (parent instanceof IASTDeclarator) { - IASTDeclarator dtor = (IASTDeclarator) parent; + IASTDeclarator dtor = ASTQueries.findOutermostDeclarator((IASTDeclarator) parent); IASTInitializer initializer = dtor.getInitializer(); if (initializer instanceof IASTEqualsInitializer) { return ((IASTEqualsInitializer) initializer).getInitializerClause(); @@ -70,6 +72,7 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements return null; } + @Override public ICPPTemplateArgument getDefaultValue() { IASTInitializerClause dc= getDefault(); IASTExpression d= null; @@ -96,6 +99,7 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements return new CPPTemplateArgument(val, t); } + @Override public IType getType() { if (type == null) { IASTNode parent= getPrimaryDeclaration().getParent(); @@ -110,28 +114,36 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements return type; } + @Override public boolean isParameterPack() { return getType() instanceof ICPPParameterPackType; } + @Override public boolean isStatic() { return false; } + @Override public boolean isExtern() { return false; } + @Override public boolean isAuto() { return false; } + @Override public boolean isRegister() { return false; } + @Override public IValue getInitialValue() { return null; } + @Override public boolean isExternC() { return false; } + @Override public boolean isMutable() { return false; }