mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 02:36:01 +02:00
Bug 400073. Avoid premature removal from recusion protection sets.
This commit is contained in:
parent
508bc8720d
commit
bdbfa25c7b
4 changed files with 14 additions and 13 deletions
|
@ -179,10 +179,10 @@ public class CPPClassSpecialization extends CPPSpecialization
|
||||||
|
|
||||||
IBinding result;
|
IBinding result;
|
||||||
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
||||||
try {
|
|
||||||
if (!recursionProtectionSet.add(original))
|
if (!recursionProtectionSet.add(original))
|
||||||
return RecursionResolvingBinding.createFor(original, point);
|
return RecursionResolvingBinding.createFor(original, point);
|
||||||
|
|
||||||
|
try {
|
||||||
result= CPPTemplates.createSpecialization(this, original, point);
|
result= CPPTemplates.createSpecialization(this, original, point);
|
||||||
} finally {
|
} finally {
|
||||||
recursionProtectionSet.remove(original);
|
recursionProtectionSet.remove(original);
|
||||||
|
|
|
@ -2009,11 +2009,12 @@ public class CPPVisitor extends ASTQueries {
|
||||||
|
|
||||||
private static IType createAutoType(final IASTDeclSpecifier declSpec, IASTDeclarator declarator) {
|
private static IType createAutoType(final IASTDeclSpecifier declSpec, IASTDeclarator declarator) {
|
||||||
Set<IASTDeclSpecifier> recursionProtectionSet = autoTypeDeclSpecs.get();
|
Set<IASTDeclSpecifier> recursionProtectionSet = autoTypeDeclSpecs.get();
|
||||||
try {
|
|
||||||
if (!recursionProtectionSet.add(declSpec)) {
|
if (!recursionProtectionSet.add(declSpec)) {
|
||||||
// Detected a self referring auto type, e.g.: auto x = x;
|
// Detected a self referring auto type, e.g.: auto x = x;
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
if (declarator instanceof ICPPASTFunctionDeclarator) {
|
if (declarator instanceof ICPPASTFunctionDeclarator) {
|
||||||
return createAutoFunctionType(declSpec, (ICPPASTFunctionDeclarator) declarator);
|
return createAutoFunctionType(declSpec, (ICPPASTFunctionDeclarator) declarator);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,10 +116,10 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple
|
||||||
|
|
||||||
IBinding newSpec;
|
IBinding newSpec;
|
||||||
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
||||||
try {
|
|
||||||
if (!recursionProtectionSet.add(original))
|
if (!recursionProtectionSet.add(original))
|
||||||
return RecursionResolvingBinding.createFor(original, point);
|
return RecursionResolvingBinding.createFor(original, point);
|
||||||
|
|
||||||
|
try {
|
||||||
newSpec= CPPTemplates.createSpecialization(this, original, point);
|
newSpec= CPPTemplates.createSpecialization(this, original, point);
|
||||||
} finally {
|
} finally {
|
||||||
recursionProtectionSet.remove(original);
|
recursionProtectionSet.remove(original);
|
||||||
|
|
|
@ -145,10 +145,10 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements
|
||||||
|
|
||||||
IBinding newSpec;
|
IBinding newSpec;
|
||||||
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
Set<IBinding> recursionProtectionSet= fInProgress.get();
|
||||||
try {
|
|
||||||
if (!recursionProtectionSet.add(original))
|
if (!recursionProtectionSet.add(original))
|
||||||
return RecursionResolvingBinding.createFor(original, point);
|
return RecursionResolvingBinding.createFor(original, point);
|
||||||
|
|
||||||
|
try {
|
||||||
newSpec= CPPTemplates.createSpecialization(this, original, point);
|
newSpec= CPPTemplates.createSpecialization(this, original, point);
|
||||||
} finally {
|
} finally {
|
||||||
recursionProtectionSet.remove(original);
|
recursionProtectionSet.remove(original);
|
||||||
|
|
Loading…
Add table
Reference in a new issue