From bdbfa25c7b6fb5be8a09399b46f322996b60cd73 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 17 Jul 2013 15:21:16 -0700 Subject: [PATCH] Bug 400073. Avoid premature removal from recusion protection sets. --- .../core/dom/parser/cpp/CPPClassSpecialization.java | 6 +++--- .../core/dom/parser/cpp/semantics/CPPVisitor.java | 9 +++++---- .../composite/cpp/CompositeCPPClassSpecialization.java | 6 +++--- .../core/pdom/dom/cpp/PDOMCPPClassSpecialization.java | 6 +++--- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index b4ccaec3a2d..70c14f98b0b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -179,10 +179,10 @@ public class CPPClassSpecialization extends CPPSpecialization IBinding result; Set recursionProtectionSet= fInProgress.get(); - try { - if (!recursionProtectionSet.add(original)) - return RecursionResolvingBinding.createFor(original, point); + if (!recursionProtectionSet.add(original)) + return RecursionResolvingBinding.createFor(original, point); + try { result= CPPTemplates.createSpecialization(this, original, point); } finally { recursionProtectionSet.remove(original); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 2c87aa7d3ec..c5a2c471daa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -2009,11 +2009,12 @@ public class CPPVisitor extends ASTQueries { private static IType createAutoType(final IASTDeclSpecifier declSpec, IASTDeclarator declarator) { Set recursionProtectionSet = autoTypeDeclSpecs.get(); + if (!recursionProtectionSet.add(declSpec)) { + // Detected a self referring auto type, e.g.: auto x = x; + return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE); + } + try { - if (!recursionProtectionSet.add(declSpec)) { - // Detected a self referring auto type, e.g.: auto x = x; - return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE); - } if (declarator instanceof ICPPASTFunctionDeclarator) { return createAutoFunctionType(declSpec, (ICPPASTFunctionDeclarator) declarator); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java index 040e3868534..61452b0f8bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java @@ -116,10 +116,10 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple IBinding newSpec; Set recursionProtectionSet= fInProgress.get(); - try { - if (!recursionProtectionSet.add(original)) - return RecursionResolvingBinding.createFor(original, point); + if (!recursionProtectionSet.add(original)) + return RecursionResolvingBinding.createFor(original, point); + try { newSpec= CPPTemplates.createSpecialization(this, original, point); } finally { recursionProtectionSet.remove(original); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index 354fa48f920..e27d0f3fcb5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -145,10 +145,10 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements IBinding newSpec; Set recursionProtectionSet= fInProgress.get(); - try { - if (!recursionProtectionSet.add(original)) - return RecursionResolvingBinding.createFor(original, point); + if (!recursionProtectionSet.add(original)) + return RecursionResolvingBinding.createFor(original, point); + try { newSpec= CPPTemplates.createSpecialization(this, original, point); } finally { recursionProtectionSet.remove(original);