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 5dc09854a97..53105c6902a 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 @@ -3942,4 +3942,16 @@ public class AST2TemplateTests extends AST2BaseTest { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template class XT { + // operator T() {return 0;} + // void m() { + // XT xt; + // xt.operator T*()->something(); + // } + // }; + public void testDeferredConversionOperator() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 096f48fcf71..45cafeb5d90 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -59,6 +59,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; +import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType.CPPClassTypeProblem; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; @@ -102,7 +103,7 @@ public class ClassTypeHelper { } else { for (IASTDeclarator dtor : dtors) { if (dtor == null) break; - dtor= CPPVisitor.findInnermostDeclarator(dtor); + dtor= ASTQueries.findInnermostDeclarator(dtor); resultSet.put(dtor.getName().resolveBinding()); } } @@ -111,7 +112,7 @@ public class ClassTypeHelper { ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition)decl).getDeclSpecifier(); if (declSpec.isFriend()) { IASTDeclarator dtor = ((IASTFunctionDefinition)decl).getDeclarator(); - dtor= CPPVisitor.findInnermostDeclarator(dtor); + dtor= ASTQueries.findInnermostDeclarator(dtor); resultSet.put(dtor.getName().resolveBinding()); } } @@ -184,7 +185,7 @@ public class ClassTypeHelper { if (decl instanceof IASTSimpleDeclaration) { IASTDeclarator[] dtors = ((IASTSimpleDeclaration)decl).getDeclarators(); for (IASTDeclarator dtor : dtors) { - binding = CPPVisitor.findInnermostDeclarator(dtor).getName().resolveBinding(); + binding = ASTQueries.findInnermostDeclarator(dtor).getName().resolveBinding(); if (binding instanceof ICPPField) result = (ICPPField[]) ArrayUtil.append(ICPPField.class, result, binding); } @@ -256,6 +257,10 @@ public class ClassTypeHelper { if (host.getDefinition() == null) { host.checkForDefinition(); if (host.getDefinition() == null) { + ICPPClassType backup= getBackupDefinition(host); + if (backup != null) + return backup.getDeclaredMethods(); + IASTNode[] declarations= host.getDeclarations(); IASTNode node = (declarations != null && declarations.length > 0) ? declarations[0] : null; return new ICPPMethod[] { new CPPMethod.CPPMethodProblem(node, IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, host.getNameCharArray()) }; @@ -271,13 +276,13 @@ public class ClassTypeHelper { if (decl instanceof IASTSimpleDeclaration) { IASTDeclarator[] dtors = ((IASTSimpleDeclaration)decl).getDeclarators(); for (IASTDeclarator dtor : dtors) { - binding = CPPVisitor.findInnermostDeclarator(dtor).getName().resolveBinding(); + binding = ASTQueries.findInnermostDeclarator(dtor).getName().resolveBinding(); if (binding instanceof ICPPMethod) result = (ICPPMethod[]) ArrayUtil.append(ICPPMethod.class, result, binding); } } else if (decl instanceof IASTFunctionDefinition) { IASTDeclarator dtor = ((IASTFunctionDefinition)decl).getDeclarator(); - dtor = CPPVisitor.findInnermostDeclarator(dtor); + dtor = ASTQueries.findInnermostDeclarator(dtor); binding = dtor.getName().resolveBinding(); if (binding instanceof ICPPMethod) { result = (ICPPMethod[]) ArrayUtil.append(ICPPMethod.class, result, binding); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index ec2680d1789..9b7325c4b02 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -844,6 +844,16 @@ public class CPPSemantics { } catch (DOMException e) { } } + if (b instanceof IVariable) { + try { + IType t= SemanticUtil.getUltimateType(((IVariable) b).getType(), true); + if (t instanceof ICPPUnknownBinding || t instanceof ICPPTemplateDefinition) { + result[0]= true; + return PROCESS_ABORT; + } + } catch (DOMException e) { + } + } if (name instanceof ICPPASTTemplateId) return PROCESS_SKIP; return PROCESS_CONTINUE; @@ -2234,17 +2244,23 @@ public class CPPSemantics { if (t == null) { return new ProblemBinding(astName, IProblemBinding.SEMANTIC_INVALID_TYPE); } + IFunction unknown= null; for (IFunction function : fns) { if (function != null) { try { IType t2= function.getType().getReturnType(); if (t.isSameType(t2)) return function; + if (unknown == null && function instanceof ICPPUnknownBinding) { + unknown= function; + } } catch (DOMException e) { // ignore, try other candidates } } } + if (unknown != null) + return unknown; return new ProblemBinding(astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND); }