diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java index 6be6f35ccd3..5cee2cbb004 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java @@ -65,13 +65,18 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId, I private IASTNode [] templateArguments = null; private IBinding binding = null; + private boolean resolving = false; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() */ public IBinding resolveBinding() { - if( binding == null ) - binding = CPPTemplates.createBinding( this ); + if (binding == null && !resolving) { + // protect for infinite recursion + resolving = true; + binding = CPPTemplates.createBinding( this ); + resolving = false; + } return binding; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index 54eddf1aa53..f5b40b5c255 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -255,9 +255,8 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { Object obj = set.keyAt( i ); if( obj instanceof IASTName ){ IASTName n = (IASTName) obj; - binding = n.getBinding(); - if( binding != null || forceResolve ){ - binding = n.resolveBinding(); + binding = forceResolve ? n.resolveBinding() : n.getBinding(); + if( binding != null ) { set.remove( n ); set.put( binding ); i--;