1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Bug 312423: Replace null-types with problem types.

This commit is contained in:
Markus Schorn 2010-10-12 08:18:03 +00:00
parent 9ed8866605
commit 7f684f342a
9 changed files with 28 additions and 25 deletions

View file

@ -42,7 +42,6 @@ import org.eclipse.cdt.internal.core.dom.parser.c.CASTTypeId;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTypeId; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTypeId;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
@ -246,9 +245,6 @@ public class ASTTypeUtil {
result.append(Keywords.cpRBRACKET); result.append(Keywords.cpRBRACKET);
} else if (type instanceof IBasicType) { } else if (type instanceof IBasicType) {
IBasicType basicType= (IBasicType) type; IBasicType basicType= (IBasicType) type;
if (basicType.getModifiers() == CPPBasicType.UNIQUE_TYPE_QUALIFIER) {
return "@" + String.valueOf(basicType.hashCode()); //$NON-NLS-1$
}
final Kind kind = basicType.getKind(); final Kind kind = basicType.getKind();
if (basicType.isSigned()) { if (basicType.isSigned()) {
// 3.9.1.2: signed integer types // 3.9.1.2: signed integer types

View file

@ -24,6 +24,7 @@ public interface ISemanticProblem {
int TYPE_AUTO_FOR_NON_STATIC_FIELD = 10002; int TYPE_AUTO_FOR_NON_STATIC_FIELD = 10002;
int TYPE_CANNOT_DEDUCE_AUTO_TYPE = 10003; int TYPE_CANNOT_DEDUCE_AUTO_TYPE = 10003;
int TYPE_UNKNOWN_FOR_EXPRESSION = 10004; int TYPE_UNKNOWN_FOR_EXPRESSION = 10004;
int TYPE_NOT_PERSISTED = 10005;
/** /**
* Returns the ID of the problem. * Returns the ID of the problem.

View file

@ -13,6 +13,9 @@ package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
@ -22,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICQualifierType;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
public class CQualifierType implements ICQualifierType, ITypeContainer, ISerializableType { public class CQualifierType implements ICQualifierType, ITypeContainer, ISerializableType {
@ -91,23 +95,26 @@ public class CQualifierType implements ICQualifierType, ITypeContainer, ISeriali
* @see org.eclipse.cdt.core.dom.ast.IQualifierType#getType() * @see org.eclipse.cdt.core.dom.ast.IQualifierType#getType()
*/ */
private IType resolveType(ICASTDeclSpecifier declSpec) { private IType resolveType(ICASTDeclSpecifier declSpec) {
IType t = null; IBinding b = null;
if (declSpec instanceof ICASTTypedefNameSpecifier) { if (declSpec instanceof ICASTTypedefNameSpecifier) {
ICASTTypedefNameSpecifier nameSpec = (ICASTTypedefNameSpecifier) declSpec; ICASTTypedefNameSpecifier nameSpec = (ICASTTypedefNameSpecifier) declSpec;
t = (IType) nameSpec.getName().resolveBinding(); b = nameSpec.getName().resolveBinding();
} else if (declSpec instanceof IASTElaboratedTypeSpecifier) { } else if (declSpec instanceof IASTElaboratedTypeSpecifier) {
IASTElaboratedTypeSpecifier elabTypeSpec = (IASTElaboratedTypeSpecifier) declSpec; IASTElaboratedTypeSpecifier elabTypeSpec = (IASTElaboratedTypeSpecifier) declSpec;
t = (IType) elabTypeSpec.getName().resolveBinding(); b = elabTypeSpec.getName().resolveBinding();
} else if (declSpec instanceof IASTCompositeTypeSpecifier) { } else if (declSpec instanceof IASTCompositeTypeSpecifier) {
IASTCompositeTypeSpecifier compTypeSpec = (IASTCompositeTypeSpecifier) declSpec; IASTCompositeTypeSpecifier compTypeSpec = (IASTCompositeTypeSpecifier) declSpec;
t = (IType) compTypeSpec.getName().resolveBinding(); b = compTypeSpec.getName().resolveBinding();
} else if (declSpec instanceof IASTEnumerationSpecifier) { } else if (declSpec instanceof IASTEnumerationSpecifier) {
t = new CEnumeration(((IASTEnumerationSpecifier) declSpec).getName()); return new CEnumeration(((IASTEnumerationSpecifier) declSpec).getName());
} else { } else {
t = new CBasicType((ICASTSimpleDeclSpecifier) declSpec); return new CBasicType((ICASTSimpleDeclSpecifier) declSpec);
} }
return t; if (b instanceof IType && !(b instanceof IProblemBinding))
return (IType) b;
return new ProblemType(ISemanticProblem.TYPE_UNRESOLVED_NAME);
} }
public IType getType() { public IType getType() {

View file

@ -27,14 +27,12 @@ import org.eclipse.core.runtime.CoreException;
* Integral c++ type. * Integral c++ type.
*/ */
public class CPPBasicType implements ICPPBasicType, ISerializableType { public class CPPBasicType implements ICPPBasicType, ISerializableType {
// mstodo replace with problem type
public static int UNIQUE_TYPE_QUALIFIER= -1;
private final Kind fKind; private final Kind fKind;
private final int fModifiers; private final int fModifiers;
private IASTExpression fExpression; private IASTExpression fExpression;
public CPPBasicType(Kind kind, int qualifiers, IASTExpression expression) { public CPPBasicType(Kind kind, int qualifiers, IASTExpression expression) {
if (kind == Kind.eUnspecified && qualifiers != UNIQUE_TYPE_QUALIFIER) { if (kind == Kind.eUnspecified) {
if ( (qualifiers & (IS_COMPLEX | IS_IMAGINARY)) != 0) { if ( (qualifiers & (IS_COMPLEX | IS_IMAGINARY)) != 0) {
fKind= Kind.eFloat; fKind= Kind.eFloat;
} else if ( (qualifiers & (IS_LONG | IS_SHORT | IS_SIGNED | IS_UNSIGNED | IS_LONG_LONG)) != 0 ) { } else if ( (qualifiers & (IS_LONG | IS_SHORT | IS_SIGNED | IS_UNSIGNED | IS_LONG_LONG)) != 0 ) {
@ -102,9 +100,6 @@ public class CPPBasicType implements ICPPBasicType, ISerializableType {
if (object == this) if (object == this)
return true; return true;
if (fModifiers == UNIQUE_TYPE_QUALIFIER)
return false;
if (object instanceof ITypedef) if (object instanceof ITypedef)
return object.isSameType(this); return object.isSameType(this);

View file

@ -1974,7 +1974,7 @@ public class CPPTemplates {
if (map != null && pType != null) { if (map != null && pType != null) {
pType= instantiateType(pType, map, -1, null); pType= instantiateType(pType, map, -1, null);
} }
if (argType instanceof ICPPUnknownType || isNonTypeArgumentConvertible(pType, argType)) { if (argType instanceof ICPPUnknownType || argType instanceof ISemanticProblem || isNonTypeArgumentConvertible(pType, argType)) {
return new CPPTemplateArgument(arg.getNonTypeValue(), pType); return new CPPTemplateArgument(arg.getNonTypeValue(), pType);
} }
return null; return null;

View file

@ -81,6 +81,7 @@ public class ParserMessages {
case ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD: return "ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD"; case ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD: return "ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD";
case ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE: return "ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE"; case ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE: return "ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE";
case ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION: return "ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION"; case ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION: return "ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION";
case ISemanticProblem.TYPE_NOT_PERSISTED: return "ISemanticProblem.TYPE_NOT_PERSISTED";
} }
return null; return null;
} }

View file

@ -71,4 +71,7 @@ ISemanticProblem.TYPE_UNRESOLVED_NAME=Type depends on an unresolved name
ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD=Illegally auto-typed static field ISemanticProblem.TYPE_AUTO_FOR_NON_STATIC_FIELD=Illegally auto-typed static field
ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE=Failure to determine auto-type ISemanticProblem.TYPE_CANNOT_DEDUCE_AUTO_TYPE=Failure to determine auto-type
ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION=Failure to determine type of expression ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION=Failure to determine type of expression
ISemanticProblem.TYPE_NOT_PERSISTED=Failure to store type in the index

View file

@ -10,11 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
@ -94,7 +94,7 @@ public class PDOMCPPArgumentList {
for (int i=0; i<len; i++) { for (int i=0; i<len; i++) {
IType type= linkage.loadType(rec); IType type= linkage.loadType(rec);
if (type == null) { if (type == null) {
type= new CPPBasicType(Kind.eUnspecified,CPPBasicType.UNIQUE_TYPE_QUALIFIER); type= new ProblemType(ISemanticProblem.TYPE_NOT_PERSISTED);
} }
final long nonTypeValRec= db.getRecPtr(rec+VALUE_OFFSET); final long nonTypeValRec= db.getRecPtr(rec+VALUE_OFFSET);
if (nonTypeValRec != 0) { if (nonTypeValRec != 0) {

View file

@ -10,12 +10,12 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.Database;
@ -146,7 +146,7 @@ public class PDOMCPPTemplateParameterMap {
throws CoreException { throws CoreException {
IType type= linkage.loadType(rec + TYPE_OFFSET); IType type= linkage.loadType(rec + TYPE_OFFSET);
if (type == null) { if (type == null) {
type= new CPPBasicType(Kind.eUnspecified, CPPBasicType.UNIQUE_TYPE_QUALIFIER); type= new ProblemType(ISemanticProblem.TYPE_NOT_PERSISTED);
} }
final long nonTypeValRec= db.getRecPtr(rec+VALUE_OFFSET); final long nonTypeValRec= db.getRecPtr(rec+VALUE_OFFSET);
ICPPTemplateArgument arg; ICPPTemplateArgument arg;