mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug 408470 - Introduce static ProblemType instances for more problem types
Change-Id: Ib025e61aaf70f68bfe655527add2c441b9f647d7
This commit is contained in:
parent
882f8e95a9
commit
88e19bfee6
2 changed files with 19 additions and 15 deletions
|
@ -20,10 +20,14 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
* Implementation of problem types.
|
* Implementation of problem types.
|
||||||
*/
|
*/
|
||||||
public class ProblemType implements IProblemType, ISerializableType {
|
public class ProblemType implements IProblemType, ISerializableType {
|
||||||
public static final IType UNRESOLVED_NAME = new ProblemType(TYPE_UNRESOLVED_NAME);
|
public static final IType AUTO_FOR_NON_STATIC_FIELD = new ProblemType(TYPE_AUTO_FOR_NON_STATIC_FIELD);
|
||||||
public static final IType UNKNOWN_FOR_EXPRESSION = new ProblemType(TYPE_UNKNOWN_FOR_EXPRESSION);
|
public static final IType CANNOT_DEDUCE_AUTO_TYPE = new ProblemType(TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
||||||
|
public static final IType CANNOT_DEDUCE_DECLTYPE_AUTO_TYPE = new ProblemType(TYPE_CANNOT_DEDUCE_DECLTYPE_AUTO_TYPE);
|
||||||
public static final IType ENUMERATION_EXPECTED = new ProblemType(TYPE_ENUMERATION_EXPECTED);
|
public static final IType ENUMERATION_EXPECTED = new ProblemType(TYPE_ENUMERATION_EXPECTED);
|
||||||
|
public static final IType NO_NAME = new ProblemType(TYPE_NO_NAME);
|
||||||
public static final IType RECURSION_IN_LOOKUP = new ProblemType(BINDING_RECURSION_IN_LOOKUP);
|
public static final IType RECURSION_IN_LOOKUP = new ProblemType(BINDING_RECURSION_IN_LOOKUP);
|
||||||
|
public static final IType UNKNOWN_FOR_EXPRESSION = new ProblemType(TYPE_UNKNOWN_FOR_EXPRESSION);
|
||||||
|
public static final IType UNRESOLVED_NAME = new ProblemType(TYPE_UNRESOLVED_NAME);
|
||||||
|
|
||||||
private final int fID;
|
private final int fID;
|
||||||
|
|
||||||
|
|
|
@ -2040,7 +2040,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
|
|
||||||
public static IType createType(IASTDeclarator declarator) {
|
public static IType createType(IASTDeclarator declarator) {
|
||||||
if (declarator == null)
|
if (declarator == null)
|
||||||
return new ProblemType(ISemanticProblem.TYPE_NO_NAME);
|
return ProblemType.NO_NAME;
|
||||||
|
|
||||||
declarator= findOutermostDeclarator(declarator);
|
declarator= findOutermostDeclarator(declarator);
|
||||||
IASTNode parent = declarator.getParent();
|
IASTNode parent = declarator.getParent();
|
||||||
|
@ -2101,7 +2101,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (initializerClause instanceof IASTExpression) {
|
if (initializerClause instanceof IASTExpression) {
|
||||||
return getDeclType((IASTExpression) initializerClause);
|
return getDeclType((IASTExpression) initializerClause);
|
||||||
}
|
}
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_DECLTYPE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_DECLTYPE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IASTInitializerClause getInitializerClauseForDecltypeAuto(IASTDeclarator declarator) {
|
private static IASTInitializerClause getInitializerClauseForDecltypeAuto(IASTDeclarator declarator) {
|
||||||
|
@ -2135,7 +2135,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
Set<IASTDeclSpecifier> recursionProtectionSet = autoTypeDeclSpecs.get();
|
Set<IASTDeclSpecifier> recursionProtectionSet = autoTypeDeclSpecs.get();
|
||||||
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 ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -2179,7 +2179,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
beginExpr= new CPPASTFunctionCallExpression(new CPPASTIdExpression(name), beginCallArguments);
|
beginExpr= new CPPASTFunctionCallExpression(new CPPASTIdExpression(name), beginCallArguments);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoInitClause= new CPPASTUnaryExpression(IASTUnaryExpression.op_star, beginExpr);
|
autoInitClause= new CPPASTUnaryExpression(IASTUnaryExpression.op_star, beginExpr);
|
||||||
|
@ -2188,7 +2188,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
} else if (parent instanceof IASTCompositeTypeSpecifier &&
|
} else if (parent instanceof IASTCompositeTypeSpecifier &&
|
||||||
declSpec.getStorageClass() != IASTDeclSpecifier.sc_static) {
|
declSpec.getStorageClass() != IASTDeclSpecifier.sc_static) {
|
||||||
// Non-static auto-typed class members are not allowed.
|
// Non-static auto-typed class members are not allowed.
|
||||||
return new ProblemType(ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD);
|
return ProblemType.AUTO_FOR_NON_STATIC_FIELD;
|
||||||
} else {
|
} else {
|
||||||
IASTInitializer initClause= declarator.getInitializer();
|
IASTInitializer initClause= declarator.getInitializer();
|
||||||
if (initClause instanceof IASTEqualsInitializer) {
|
if (initClause instanceof IASTEqualsInitializer) {
|
||||||
|
@ -2211,7 +2211,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
IASTDeclarator declarator) {
|
IASTDeclarator declarator) {
|
||||||
// C++0x: 7.1.6.4
|
// C++0x: 7.1.6.4
|
||||||
if (initClause == null) {
|
if (initClause == null) {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
IType type = AutoTypeResolver.AUTO_TYPE;
|
IType type = AutoTypeResolver.AUTO_TYPE;
|
||||||
|
@ -2221,12 +2221,12 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (initClause instanceof ICPPASTInitializerList) {
|
if (initClause instanceof ICPPASTInitializerList) {
|
||||||
initializer_list_template = get_initializer_list(declSpec);
|
initializer_list_template = get_initializer_list(declSpec);
|
||||||
if (initializer_list_template == null) {
|
if (initializer_list_template == null) {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
type = (IType) CPPTemplates.instantiate(initializer_list_template,
|
type = (IType) CPPTemplates.instantiate(initializer_list_template,
|
||||||
new ICPPTemplateArgument[] { new CPPTemplateTypeArgument(type) }, initClause);
|
new ICPPTemplateArgument[] { new CPPTemplateTypeArgument(type) }, initClause);
|
||||||
if (type instanceof IProblemBinding) {
|
if (type instanceof IProblemBinding) {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
type = decorateType(type, declSpec, declarator);
|
type = decorateType(type, declSpec, declarator);
|
||||||
|
@ -2234,7 +2234,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
initType= evaluation.getType(declarator);
|
initType= evaluation.getType(declarator);
|
||||||
valueCat= evaluation.getValueCategory(declarator);
|
valueCat= evaluation.getValueCategory(declarator);
|
||||||
if (initType == null || initType instanceof ISemanticProblem) {
|
if (initType == null || initType instanceof ISemanticProblem) {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
ICPPFunctionTemplate template = new AutoTypeResolver(type);
|
ICPPFunctionTemplate template = new AutoTypeResolver(type);
|
||||||
CPPTemplateParameterMap paramMap = new CPPTemplateParameterMap(1);
|
CPPTemplateParameterMap paramMap = new CPPTemplateParameterMap(1);
|
||||||
|
@ -2242,7 +2242,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
Collections.singletonList(valueCat), paramMap, initClause);
|
Collections.singletonList(valueCat), paramMap, initClause);
|
||||||
ICPPTemplateArgument argument = paramMap.getArgument(0, 0);
|
ICPPTemplateArgument argument = paramMap.getArgument(0, 0);
|
||||||
if (argument == null) {
|
if (argument == null) {
|
||||||
return new ProblemType(ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE);
|
return ProblemType.CANNOT_DEDUCE_AUTO_TYPE;
|
||||||
}
|
}
|
||||||
type = argument.getTypeValue();
|
type = argument.getTypeValue();
|
||||||
IType t = SemanticUtil.substituteTypedef(type, initType);
|
IType t = SemanticUtil.substituteTypedef(type, initType);
|
||||||
|
@ -2261,7 +2261,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
private static IType createAutoFunctionType(IASTDeclSpecifier declSpec, ICPPASTFunctionDeclarator declarator) {
|
private static IType createAutoFunctionType(IASTDeclSpecifier declSpec, ICPPASTFunctionDeclarator declarator) {
|
||||||
IASTTypeId id= declarator.getTrailingReturnType();
|
IASTTypeId id= declarator.getTrailingReturnType();
|
||||||
if (id == null)
|
if (id == null)
|
||||||
return new ProblemType(ISemanticProblem.TYPE_NO_NAME);
|
return ProblemType.NO_NAME;
|
||||||
|
|
||||||
IType t= createType(id.getAbstractDeclarator());
|
IType t= createType(id.getAbstractDeclarator());
|
||||||
t= qualifyType(t, declSpec);
|
t= qualifyType(t, declSpec);
|
||||||
|
@ -2297,7 +2297,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
if (name == null)
|
if (name == null)
|
||||||
return new ProblemType(ISemanticProblem.TYPE_NO_NAME);
|
return ProblemType.NO_NAME;
|
||||||
|
|
||||||
IBinding binding = name.resolvePreBinding();
|
IBinding binding = name.resolvePreBinding();
|
||||||
if (!(binding instanceof IProblemBinding)) {
|
if (!(binding instanceof IProblemBinding)) {
|
||||||
|
@ -2307,7 +2307,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (binding instanceof IType)
|
if (binding instanceof IType)
|
||||||
return (IType) binding;
|
return (IType) binding;
|
||||||
}
|
}
|
||||||
return new ProblemType(ISemanticProblem.TYPE_UNRESOLVED_NAME);
|
return ProblemType.UNRESOLVED_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IType decorateType(IType type, IASTDeclSpecifier declSpec, IASTDeclarator declarator) {
|
private static IType decorateType(IType type, IASTDeclSpecifier declSpec, IASTDeclarator declarator) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue