diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java index 796b7e8bc1c..4c11cd8fa6c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java @@ -66,7 +66,7 @@ import org.osgi.framework.Bundle; */ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { private static final boolean DEBUG= false; - private static final int INDEXER_TIMEOUT_SEC = 360; + private static final int INDEXER_TIMEOUT_SEC = 1200; protected ITestStrategy strategy; public void setStrategy(ITestStrategy strategy) { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 5aafb47c898..ac479f76372 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -18,7 +18,6 @@ import java.util.List; import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; -import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; @@ -1378,11 +1377,11 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // } public void testClassInstanceWithNonTypeArgument_207871() throws Exception { ICPPTemplateInstance c256 = getBindingFromASTName("C<256>", 6, ICPPTemplateInstance.class, ICPPClassType.class); - ObjectMap args= c256.getArgumentMap(); - assertEquals(1, args.size()); - assertInstance(args.keyAt(0), ICPPTemplateNonTypeParameter.class); - ICPPBasicType bt= assertInstance(args.getAt(0), ICPPBasicType.class); - IASTExpression val= bt.getValue(); + ICPPTemplateParameterMap paramMap = c256.getTemplateParameterMap(); + assertEquals(1, paramMap.getAllParameterPositions().length); + ICPPTemplateArgument arg = paramMap.getArgument(0); + assertEquals(Long.valueOf(256), arg.getNonTypeValue().numericalValue()); + assertInstance(arg.getTypeOfNonTypeValue(), ICPPBasicType.class); ICPPFunction foo = getBindingFromASTName("foo(t)", 3, ICPPFunction.class); ICPPFunction bar = getBindingFromASTName("bar(t)", 3, ICPPFunction.class); @@ -2000,7 +1999,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // }; // // typedef A type; - public void _testSFINAE_a() throws Exception { + public void testSFINAE_a() throws Exception { checkBindings(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBasicType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBasicType.java index bc4a3a3e8ca..56aa33d361f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBasicType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBasicType.java @@ -13,26 +13,30 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; +import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.core.runtime.CoreException; /** * Built-in c++ type. */ public class CPPBasicType implements ICPPBasicType, ISerializableType { + private static final int FROM_STRING_LITERAL = 1 << 31; public static final CPPBasicType BOOLEAN = new CPPBasicType(Kind.eBoolean, 0, null); public static final CPPBasicType NULL_PTR = new CPPBasicType(Kind.eNullPtr, 0, null); private final Kind fKind; private final int fModifiers; - private IASTExpression fExpression; + private Long fAssociatedValue; public CPPBasicType(Kind kind, int qualifiers, IASTExpression expression) { if (kind == Kind.eUnspecified) { @@ -46,8 +50,14 @@ public class CPPBasicType implements ICPPBasicType, ISerializableType { } else { fKind= kind; } + if (expression instanceof IASTLiteralExpression && + ((IASTLiteralExpression) expression).getKind() == IASTLiteralExpression.lk_string_literal) { + qualifiers |= FROM_STRING_LITERAL; + } fModifiers= qualifiers; - fExpression= expression; + if (expression instanceof ICPPASTInitializerClause) { + fAssociatedValue = Value.create(expression, Value.MAX_RECURSION_DEPTH).numericalValue(); + } } public CPPBasicType(Kind kind, int qualifiers) { @@ -113,11 +123,12 @@ public class CPPBasicType implements ICPPBasicType, ISerializableType { if (fKind != t.getKind()) return false; + int modifiers = getModifiers(); if (fKind == Kind.eInt) { - //signed int and int are equivalent - return (fModifiers & ~IS_SIGNED) == (t.getModifiers() & ~IS_SIGNED); + // Signed int and int are equivalent. + return (modifiers & ~IS_SIGNED) == (t.getModifiers() & ~IS_SIGNED); } - return fModifiers == t.getModifiers(); + return modifiers == t.getModifiers(); } @Override @@ -161,30 +172,42 @@ public class CPPBasicType implements ICPPBasicType, ISerializableType { } @Override - public Object clone() { - IType t = null; + public CPPBasicType clone() { + CPPBasicType t = null; try { - t = (IType) super.clone(); + t = (CPPBasicType) super.clone(); } catch (CloneNotSupportedException e) { - //not going to happen + // Not going to happen. } return t; } - public void setFromExpression(IASTExpression val) { - fExpression = val; + /** + * Sets the numerical value this type was created for. + * + * @param value the numerical value of {@code null} + */ + public final void setAssociatedNumericalValue(Long value) { + fAssociatedValue = value; } /** - * Returns the expression the type was created for, or null. + * Returns the numerical value this type was created for, or {@code null}. */ - public IASTExpression getCreatedFromExpression() { - return fExpression; + public final Long getAssociatedNumericalValue() { + return fAssociatedValue; } - + + /** + * Returns {@code true} if the type was created for a string literal. + */ + public final boolean isFromStringLiteral() { + return (fModifiers & FROM_STRING_LITERAL) != 0; + } + @Override - public int getModifiers() { - return fModifiers; + public final int getModifiers() { + return fModifiers & ~FROM_STRING_LITERAL; } @Override @@ -260,6 +283,6 @@ public class CPPBasicType implements ICPPBasicType, ISerializableType { @Override @Deprecated public IASTExpression getValue() { - return fExpression; + return null; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index 31d1d843881..ccf06ec82a4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -30,9 +30,7 @@ import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUti import java.util.Collections; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; -import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; @@ -60,7 +58,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ArithmeticConversion; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; -import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; @@ -838,14 +835,10 @@ public class Conversions { if (srcQTarget.isConst() && !srcQTarget.isVolatile()) { srcTarget= srcQTarget.getType(); if (srcTarget instanceof CPPBasicType) { - IASTExpression val = ((CPPBasicType) srcTarget).getCreatedFromExpression(); - if (val instanceof IASTLiteralExpression) { - IASTLiteralExpression lit= (IASTLiteralExpression) val; - if (lit.getKind() == IASTLiteralExpression.lk_string_literal) { - source= new CPPPointerType(srcTarget, false, false, false); - CVQualifier cvqTarget = getCVQualifier(targetPtrTgt).add(CVQualifier.CONST); - cost.setQualificationAdjustment(cvqTarget.partialComparison(CVQualifier.NONE) << 3); - } + if (((CPPBasicType) srcTarget).isFromStringLiteral()) { + source= new CPPPointerType(srcTarget, false, false, false); + CVQualifier cvqTarget = getCVQualifier(targetPtrTgt).add(CVQualifier.CONST); + cost.setQualificationAdjustment(cvqTarget.partialComparison(CVQualifier.NONE) << 3); } } } @@ -1134,12 +1127,9 @@ public class Conversions { if (basicType.getKind() == Kind.eNullPtr) return true; - IASTExpression exp = basicType.getCreatedFromExpression(); - if (exp != null) { - Long val= Value.create(exp, Value.MAX_RECURSION_DEPTH).numericalValue(); - if (val != null && val == 0) { - return true; - } + Long val = basicType.getAssociatedNumericalValue(); + if (val != null && val == 0) { + return true; } } return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Cost.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Cost.java index 70a67d20b7a..cacff06b092 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Cost.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Cost.java @@ -13,15 +13,12 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; -import org.eclipse.cdt.core.dom.ast.IASTExpression; -import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.internal.core.dom.parser.ArithmeticConversion; -import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; /** @@ -272,14 +269,10 @@ public class Cost { if (targetKind != Kind.eInt && targetKind != Kind.eFloat && targetKind != Kind.eDouble) { return true; } - IASTExpression val = ((CPPBasicType) source).getCreatedFromExpression(); - if (val instanceof IASTLiteralExpression) { - // mstodo extend to constant expressions - Long l= Value.create(val, Value.MAX_RECURSION_DEPTH).numericalValue(); - if (l != null) { - long n= l.longValue(); - return !ArithmeticConversion.fitsIntoType(basicTarget, n); - } + Long val= ((CPPBasicType) source).getAssociatedNumericalValue(); + if (val != null) { + long n= val.longValue(); + return !ArithmeticConversion.fitsIntoType(basicTarget, n); } } return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java index 9ae762f8c2d..22d07d9238a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.Value; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.core.runtime.CoreException; @@ -44,6 +45,14 @@ public class EvalFixed extends CPPEvaluation { private boolean fCheckedIsValueDependent; public EvalFixed(IType type, ValueCategory cat, IValue value) { + if (type instanceof CPPBasicType) { + Long num = value.numericalValue(); + if (num != null) { + CPPBasicType t = (CPPBasicType) type.clone(); + t.setAssociatedNumericalValue(num); + type = t; + } + } fType= type; fValueCategory= cat; fValue= value;