From 282daa7a8e604fb0611daa8a3db0ef3bcc32388b Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 2 Jan 2012 14:05:58 +0100 Subject: [PATCH] Bug 365981: Detect syntax error replacing pointer to member. --- .../cdt/core/parser/tests/ast2/AST2TemplateTests.java | 11 ++++++++++- .../core/dom/parser/cpp/semantics/CPPTemplates.java | 3 ++- 2 files changed, 12 insertions(+), 2 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 30e3cbde285..83a901a3d23 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 @@ -5644,10 +5644,19 @@ public class AST2TemplateTests extends AST2BaseTest { // int main() { // foo(0); // } - public void testSyntaxFailureInstantiatingFunctionTemplate_365981() throws Exception { + public void testSyntaxFailureInstantiatingFunctionTemplate_365981a() throws Exception { parseAndCheckBindings(); } + // template bool bar(T); + // template bool bar(T, void(T::*)() = 0); + // void test() { + // bar(0); + // } + public void testSyntaxFailureInstantiatingFunctionTemplate_365981b() throws Exception { + parseAndCheckBindings(); + } + // template class vector {}; // template struct bar { // void foo() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 7bd216f78b4..c8255cfca5a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -98,6 +98,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; +import org.eclipse.cdt.internal.core.dom.parser.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPArrayType; @@ -1143,7 +1144,7 @@ public class CPPTemplates { IType newMemberOfClass = instantiateType(memberOfClass, tpMap, packOffset, within); if (!(newMemberOfClass instanceof ICPPClassType || newMemberOfClass instanceof UniqueType || newMemberOfClass instanceof ICPPUnknownBinding)) { - newMemberOfClass = memberOfClass; + return new ProblemType(ISemanticProblem.BINDING_INVALID_TYPE); } if (newNestedType != nestedType || newMemberOfClass != memberOfClass) { return new CPPPointerToMemberType(newNestedType, newMemberOfClass,