From 852f5e9d31c745bbd06f114f9e22e230dda8e6ff Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 27 Jan 2010 13:18:01 +0000 Subject: [PATCH] Bug 300978: Template parameter without name. --- .../tests/IndexCPPTemplateResolutionTest.java | 21 +++++++++++++++++++ .../dom/parser/cpp/CPPTemplateParameter.java | 16 +++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 4e82a76857a..1489c8241c8 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -1700,4 +1700,25 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa getBindingFromASTName("Noder1", 11, ICPPClassSpecialization.class); getBindingFromASTName("Noder2", 11, ICPPClassSpecialization.class); } + + + // template struct CT; + // template struct CT { + // T f; + // }; + // struct X { + // int x; + // }; + + // void test() { + // CT p; + // p.f.x; + // } + public void testTemplateParameterWithoutName_300978() throws Exception { + getBindingFromASTName("x;", 1, ICPPField.class); + ICPPClassSpecialization ctx = getBindingFromASTName("CT", 5, ICPPClassSpecialization.class); + ICPPClassTemplate ct= (ICPPClassTemplate) ctx.getSpecializedBinding(); + assertEquals("T", ct.getTemplateParameters()[0].getName()); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java index 16e30c90055..86e2f7f1181 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; @@ -92,15 +93,24 @@ public abstract class CPPTemplateParameter extends PlatformObject /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IBinding#getName() */ - public String getName() { + public final String getName() { return new String(getNameCharArray()); } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray() */ - public char[] getNameCharArray() { - return declarations[0].getSimpleID(); + public final char[] getNameCharArray() { + // Search for the first declaration that has a name. + for (IASTName decl : declarations) { + if (decl == null) + break; + + final char[] result= decl.getSimpleID(); + if (result.length > 0) + return result; + } + return CharArrayUtils.EMPTY; } public int getParameterID() {