diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java | 14 |
1 files changed, 12 insertions, 2 deletions
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 f1f1d1d5dec..3806b7a1b41 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 @@ -289,8 +289,18 @@ public class CPPTemplates { if (node.getPropertyInParent() == IASTCompositeTypeSpecifier.TYPE_NAME) return null; if (node instanceof IASTFunctionDefinition) { - name= ASTQueries.findInnermostDeclarator(((IASTFunctionDefinition) node).getDeclarator()).getName().getLastName(); - scope= CPPVisitor.getContainingScope(name); + IASTName functionName= ASTQueries.findInnermostDeclarator(((IASTFunctionDefinition) node).getDeclarator()).getName().getLastName(); + // 'name' may be inside the qualifier of a method name in a out-of-line method definition. + // In such a case, calling getContainingScope() on the method name will attempt to + // resolve the qualifier, which will attempt to resolve 'name', which will get into + // a recursion as 'name' is currently being resolved. Since an out-of-line method + // definition cannot be inside a template scope, we can accurately return null + // in this case. + if (functionName.getParent() instanceof ICPPASTQualifiedName + && ASTQueries.isAncestorOf(functionName.getParent(), name)) { + return null; + } + scope= CPPVisitor.getContainingScope(functionName); break; } if (node instanceof ICPPASTCompositeTypeSpecifier) { |