From cb77b3d8b5face4267fbe0c80615715c6cef3b12 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 2 Jan 2012 14:21:31 +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 f0e44dc1fd0..7beced2470d 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 @@ -5522,7 +5522,16 @@ public class AST2TemplateTests extends AST2BaseTest { // int main() { // foo(0); // } - public void testSFINE_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(); } } 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 763a3d6be0f..81cc7eb6017 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 @@ -96,6 +96,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; @@ -1130,7 +1131,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,