mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-03 07:05:24 +02:00
Bug 540957 - Implement equivalence checking for expressions
This is used for declaration matching in function templates. Change-Id: I80044304b2d9dfda085a13f0cfc040f1200a2e1c
This commit is contained in:
parent
bee6341c18
commit
02cdb68d6c
31 changed files with 372 additions and 2 deletions
|
@ -9018,6 +9018,20 @@ public class AST2TemplateTests extends AST2CPPTestBase {
|
||||||
parseAndCheckBindings();
|
parseAndCheckBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// template <typename T>
|
||||||
|
// T __declval();
|
||||||
|
//
|
||||||
|
// template <typename T>
|
||||||
|
// decltype(__declval<T>()) declval();
|
||||||
|
//
|
||||||
|
// template <typename T>
|
||||||
|
// decltype(__declval<T>()) declval();
|
||||||
|
//
|
||||||
|
// using T = decltype(declval<int>());
|
||||||
|
public void testDeclvalDeclaration_540957() throws Exception {
|
||||||
|
parseAndCheckBindings();
|
||||||
|
}
|
||||||
|
|
||||||
// template <typename T>
|
// template <typename T>
|
||||||
// class meta {
|
// class meta {
|
||||||
// typedef T type;
|
// typedef T type;
|
||||||
|
|
|
@ -114,4 +114,10 @@ public interface IValue {
|
||||||
* @noreference This method is not intended to be referenced by clients.
|
* @noreference This method is not intended to be referenced by clients.
|
||||||
*/
|
*/
|
||||||
void marshal(ITypeMarshalBuffer buffer) throws CoreException;
|
void marshal(ITypeMarshalBuffer buffer) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this value is equivalent to 'other' for declaration matching purposes.
|
||||||
|
* @noreference This method is not intended to be referenced by clients.
|
||||||
|
*/
|
||||||
|
boolean isEquivalentTo(IValue other);
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,4 +241,13 @@ public final class CStringValue implements IValue {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new String(fFixedValue);
|
return new String(fFixedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(IValue other) {
|
||||||
|
if (!(other instanceof CStringValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CStringValue o = (CStringValue) other;
|
||||||
|
return fFixedValue.equals(o.fFixedValue);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -299,4 +299,25 @@ public final class CompositeValue implements IValue {
|
||||||
}
|
}
|
||||||
return new CompositeValue(evaluation, values);
|
return new CompositeValue(evaluation, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(IValue other) {
|
||||||
|
if (!(other instanceof CompositeValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CompositeValue o = (CompositeValue) other;
|
||||||
|
if (!((evaluation == null && o.evaluation == null) ||
|
||||||
|
(evaluation.isEquivalentTo(o.evaluation)))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (values.length != o.values.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
if (!values[i].isEquivalentTo(o.values[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,4 +128,12 @@ public class DependentValue implements IValue {
|
||||||
return new DependentValue(fEvaluation);
|
return new DependentValue(fEvaluation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(IValue other) {
|
||||||
|
if (!(other instanceof DependentValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DependentValue o = (DependentValue) other;
|
||||||
|
return fEvaluation.isEquivalentTo(o.fEvaluation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,4 +163,13 @@ public final class FloatingPointValue implements IValue {
|
||||||
public static IValue unmarshal(short firstBytes, ITypeMarshalBuffer buf) throws CoreException {
|
public static IValue unmarshal(short firstBytes, ITypeMarshalBuffer buf) throws CoreException {
|
||||||
return new FloatingPointValue(buf.getCharArray());
|
return new FloatingPointValue(buf.getCharArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(IValue other) {
|
||||||
|
if (!(other instanceof FloatingPointValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
FloatingPointValue o = (FloatingPointValue) other;
|
||||||
|
return fFixedValue.equals(o.fFixedValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,6 @@ public class IntegralValue implements IValue {
|
||||||
|
|
||||||
private static int sUnique= 0;
|
private static int sUnique= 0;
|
||||||
|
|
||||||
// The following invariant always holds: (fFixedValue == null) != (fEvaluation == null)
|
|
||||||
private final char[] fFixedValue;
|
private final char[] fFixedValue;
|
||||||
|
|
||||||
private IntegralValue(char[] fixedValue) {
|
private IntegralValue(char[] fixedValue) {
|
||||||
|
@ -292,4 +291,13 @@ public class IntegralValue implements IValue {
|
||||||
public IValue clone() {
|
public IValue clone() {
|
||||||
return new IntegralValue(Arrays.copyOf(fFixedValue, fFixedValue.length));
|
return new IntegralValue(Arrays.copyOf(fFixedValue, fFixedValue.length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(IValue other) {
|
||||||
|
if (!(other instanceof IntegralValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
IntegralValue o = (IntegralValue) other;
|
||||||
|
return fFixedValue.equals(o.fFixedValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,13 @@ public interface ICPPEvaluation {
|
||||||
* @param point the point of instantiation, determines the scope for name lookups
|
* @param point the point of instantiation, determines the scope for name lookups
|
||||||
*/
|
*/
|
||||||
boolean isConstantExpression();
|
boolean isConstantExpression();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if this expression is equivalent to 'other' for
|
||||||
|
* declaration matching purposes.
|
||||||
|
*/
|
||||||
|
boolean isEquivalentTo(ICPPEvaluation other);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the type of the expression.
|
* Returns the type of the expression.
|
||||||
|
|
|
@ -212,4 +212,72 @@ public abstract class CPPEvaluation implements ICPPEvaluation {
|
||||||
}
|
}
|
||||||
return argument;
|
return argument;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static boolean areEquivalentOrNull(ICPPEvaluation a, ICPPEvaluation b) {
|
||||||
|
if (a == null) {
|
||||||
|
return (b == null);
|
||||||
|
}
|
||||||
|
return a.isEquivalentTo(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean areEquivalentEvaluations(ICPPEvaluation[] a, ICPPEvaluation[] b) {
|
||||||
|
if (a == null) {
|
||||||
|
return (b == null);
|
||||||
|
}
|
||||||
|
if (a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < a.length; i++) {
|
||||||
|
if (!a[i].isEquivalentTo(b[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean areEquivalentArguments(ICPPTemplateArgument[] a, ICPPTemplateArgument[] b) {
|
||||||
|
if (a == null) {
|
||||||
|
return (b == null);
|
||||||
|
}
|
||||||
|
if (a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < a.length; i++) {
|
||||||
|
if (!a[i].isSameValue(b[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean areEquivalentTypes(IType[] a, IType[] b) {
|
||||||
|
if (a == null) {
|
||||||
|
return (b == null);
|
||||||
|
}
|
||||||
|
if (a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < a.length; i++) {
|
||||||
|
if (!a[i].isSameType(b[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static <T extends IBinding> boolean areEquivalentBindings(T[] a, T[] b) {
|
||||||
|
if (a == null) {
|
||||||
|
return (b == null);
|
||||||
|
}
|
||||||
|
if (a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < a.length; i++) {
|
||||||
|
if (!a[i].equals(b[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
|
||||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunction;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunction;
|
||||||
|
@ -111,4 +112,15 @@ public class CPPFunctionSet implements ICPPTwoPhaseBinding {
|
||||||
return super.toString();
|
return super.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (!(other instanceof CPPFunctionSet)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CPPFunctionSet o = (CPPFunctionSet) other;
|
||||||
|
return CPPEvaluation.areEquivalentBindings(fBindings, o.fBindings)
|
||||||
|
&& fName == o.fName
|
||||||
|
&& CPPEvaluation.areEquivalentArguments(fTemplateArguments, o.fTemplateArguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -256,6 +256,17 @@ public class EvalBinary extends CPPDependentEvaluation {
|
||||||
}
|
}
|
||||||
return fIsConstantExpression;
|
return fIsConstantExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalBinary)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalBinary o = (EvalBinary) other;
|
||||||
|
return fOperator == o.fOperator
|
||||||
|
&& fArg1.isEquivalentTo(o.fArg1)
|
||||||
|
&& fArg2.isEquivalentTo(o.fArg2);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean computeIsConstantExpression() {
|
private boolean computeIsConstantExpression() {
|
||||||
return fArg1.isConstantExpression()
|
return fArg1.isConstantExpression()
|
||||||
|
|
|
@ -108,6 +108,17 @@ public class EvalBinaryTypeId extends CPPDependentEvaluation {
|
||||||
public boolean isConstantExpression() {
|
public boolean isConstantExpression() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalBinaryTypeId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalBinaryTypeId o = (EvalBinaryTypeId) other;
|
||||||
|
return fOperator == o.fOperator
|
||||||
|
&& fType1.isSameType(o.fType1)
|
||||||
|
&& fType2.isSameType(o.fType2);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ValueCategory getValueCategory() {
|
public ValueCategory getValueCategory() {
|
||||||
|
|
|
@ -260,6 +260,19 @@ public class EvalBinding extends CPPDependentEvaluation {
|
||||||
|| (fBinding instanceof IVariable && isConstexprValue(((IVariable) fBinding).getInitialValue()));
|
|| (fBinding instanceof IVariable && isConstexprValue(((IVariable) fBinding).getInitialValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalBinding)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalBinding o = (EvalBinding) other;
|
||||||
|
if (fBinding != null) {
|
||||||
|
return fBinding == o.fBinding;
|
||||||
|
}
|
||||||
|
return fParameterOwner == o.fParameterOwner
|
||||||
|
&& fParameterPosition == o.fParameterPosition;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
if (fType == null) {
|
if (fType == null) {
|
||||||
|
|
|
@ -96,6 +96,15 @@ public class EvalComma extends CPPDependentEvaluation {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalComma)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalComma o = (EvalComma) other;
|
||||||
|
return areEquivalentEvaluations(fArguments, o.fArguments);
|
||||||
|
}
|
||||||
|
|
||||||
public ICPPFunction[] getOverloads() {
|
public ICPPFunction[] getOverloads() {
|
||||||
if (fOverloads == null) {
|
if (fOverloads == null) {
|
||||||
fOverloads= computeOverloads();
|
fOverloads= computeOverloads();
|
||||||
|
|
|
@ -78,6 +78,16 @@ public final class EvalCompositeAccess implements ICPPEvaluation {
|
||||||
return getTargetEvaluation().isConstantExpression();
|
return getTargetEvaluation().isConstantExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalCompositeAccess)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalCompositeAccess o = (EvalCompositeAccess) other;
|
||||||
|
return parent.isEquivalentTo(o.parent)
|
||||||
|
&& elementId == o.elementId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
IType type = getParent().getType();
|
IType type = getParent().getType();
|
||||||
|
|
|
@ -73,6 +73,15 @@ public class EvalCompoundStatementExpression extends CPPDependentEvaluation {
|
||||||
return fDelegate.isConstantExpression();
|
return fDelegate.isConstantExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalCompoundStatementExpression)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalCompoundStatementExpression o = (EvalCompoundStatementExpression) other;
|
||||||
|
return fDelegate.isEquivalentTo(o.fDelegate);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return fDelegate.getType();
|
return fDelegate.getType();
|
||||||
|
|
|
@ -164,6 +164,17 @@ public class EvalConditional extends CPPDependentEvaluation {
|
||||||
&& fNegative.isConstantExpression();
|
&& fNegative.isConstantExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalConditional)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalConditional o = (EvalConditional) other;
|
||||||
|
return fCondition.isEquivalentTo(o.fCondition)
|
||||||
|
&& areEquivalentOrNull(fPositive, o.fPositive)
|
||||||
|
&& fNegative.isEquivalentTo(o.fNegative);
|
||||||
|
}
|
||||||
|
|
||||||
private void evaluate() {
|
private void evaluate() {
|
||||||
if (fValueCategory != null)
|
if (fValueCategory != null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -113,6 +113,17 @@ public final class EvalConstructor extends CPPDependentEvaluation {
|
||||||
return fConstructor.isConstexpr() && areAllConstantExpressions(fArguments);
|
return fConstructor.isConstexpr() && areAllConstantExpressions(fArguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalConstructor)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalConstructor o = (EvalConstructor) other;
|
||||||
|
return fType.isSameType(o.fType)
|
||||||
|
&& fConstructor == o.fConstructor
|
||||||
|
&& areEquivalentEvaluations(fArguments, o.fArguments);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return fType;
|
return fType;
|
||||||
|
|
|
@ -111,6 +111,16 @@ public final class EvalFixed extends CPPEvaluation {
|
||||||
|| isConstexprValue(fValue);
|
|| isConstexprValue(fValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalFixed)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalFixed o = (EvalFixed) other;
|
||||||
|
return fType.isSameType(o.fType)
|
||||||
|
&& fValue.isEquivalentTo(o.fValue);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return fType;
|
return fType;
|
||||||
|
|
|
@ -126,6 +126,15 @@ public final class EvalFunctionCall extends CPPDependentEvaluation {
|
||||||
private boolean computeIsConstantExpression() {
|
private boolean computeIsConstantExpression() {
|
||||||
return areAllConstantExpressions(fArguments) && isNullOrConstexprFunc(getOverload());
|
return areAllConstantExpressions(fArguments) && isNullOrConstexprFunc(getOverload());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalFunctionCall)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalFunctionCall o = (EvalFunctionCall) other;
|
||||||
|
return areEquivalentEvaluations(fArguments, o.fArguments);
|
||||||
|
}
|
||||||
|
|
||||||
public ICPPFunction getOverload() {
|
public ICPPFunction getOverload() {
|
||||||
if (fOverload == CPPFunction.UNINITIALIZED_FUNCTION) {
|
if (fOverload == CPPFunction.UNINITIALIZED_FUNCTION) {
|
||||||
|
|
|
@ -158,6 +158,15 @@ public class EvalFunctionSet extends CPPDependentEvaluation {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalFunctionSet)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalFunctionSet o = (EvalFunctionSet) other;
|
||||||
|
return fFunctionSet.equals(o.fFunctionSet);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return new FunctionSetType(fFunctionSet, fAddressOf);
|
return new FunctionSetType(fFunctionSet, fAddressOf);
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||||
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.ICPPTemplateNonTypeParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
|
||||||
|
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ASTQueries;
|
import org.eclipse.cdt.internal.core.dom.parser.ASTQueries;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.DependentValue;
|
import org.eclipse.cdt.internal.core.dom.parser.DependentValue;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
|
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
|
||||||
|
@ -154,6 +155,21 @@ public class EvalID extends CPPDependentEvaluation {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalID)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalID o = (EvalID) other;
|
||||||
|
return areEquivalentOrNull(fFieldOwner, o.fFieldOwner)
|
||||||
|
&& CharArrayUtils.equals(fName, o.fName)
|
||||||
|
&& fNameOwner == o.fNameOwner
|
||||||
|
&& fAddressOf == o.fAddressOf
|
||||||
|
&& fQualified == o.fQualified
|
||||||
|
&& fIsPointerDeref == o.fIsPointerDeref
|
||||||
|
&& areEquivalentArguments(fTemplateArgs, o.fTemplateArgs);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return new TypeOfDependentExpression(this);
|
return new TypeOfDependentExpression(this);
|
||||||
|
|
|
@ -86,6 +86,15 @@ public class EvalInitList extends CPPDependentEvaluation {
|
||||||
return areAllConstantExpressions(fClauses);
|
return areAllConstantExpressions(fClauses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalInitList)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalInitList o = (EvalInitList) other;
|
||||||
|
return areEquivalentEvaluations(fClauses, o.fClauses);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return new InitializerListType(this);
|
return new InitializerListType(this);
|
||||||
|
|
|
@ -188,6 +188,18 @@ public class EvalMemberAccess extends CPPDependentEvaluation {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalMemberAccess)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalMemberAccess o = (EvalMemberAccess) other;
|
||||||
|
return fOwnerType.isSameType(o.fOwnerType)
|
||||||
|
&& fMember == o.fMember
|
||||||
|
&& fOwnerValueCategory == o.fOwnerValueCategory
|
||||||
|
&& fIsPointerDeref == o.fIsPointerDeref;
|
||||||
|
}
|
||||||
|
|
||||||
public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref,
|
public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref,
|
||||||
Collection<ICPPFunction> functionBindings, boolean returnDependent) {
|
Collection<ICPPFunction> functionBindings, boolean returnDependent) {
|
||||||
IType type= fieldOwnerExpressionType;
|
IType type= fieldOwnerExpressionType;
|
||||||
|
|
|
@ -84,6 +84,16 @@ public class EvalNaryTypeId extends CPPDependentEvaluation {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalNaryTypeId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalNaryTypeId o = (EvalNaryTypeId) other;
|
||||||
|
return fOperator == o.fOperator
|
||||||
|
&& areEquivalentTypes(fOperands, o.fOperands);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
switch (fOperator) {
|
switch (fOperator) {
|
||||||
|
|
|
@ -69,6 +69,15 @@ public class EvalPackExpansion extends CPPDependentEvaluation {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalPackExpansion)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalPackExpansion o = (EvalPackExpansion) other;
|
||||||
|
return fExpansionPattern.isEquivalentTo(o.fExpansionPattern);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
if (fType == null) {
|
if (fType == null) {
|
||||||
|
|
|
@ -81,6 +81,13 @@ public class EvalReference extends CPPDependentEvaluation {
|
||||||
return getTargetEvaluation().isConstantExpression();
|
return getTargetEvaluation().isConstantExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
// This probably doesn't need to be implemented as this evaluation type
|
||||||
|
// only arises as an intermediate artifact during constexpr processing.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
return getTargetEvaluation().getType();
|
return getTargetEvaluation().getType();
|
||||||
|
|
|
@ -231,6 +231,18 @@ public class EvalTypeId extends CPPDependentEvaluation {
|
||||||
&& isNullOrConstexprFunc(getConstructor());
|
&& isNullOrConstexprFunc(getConstructor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalTypeId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalTypeId o = (EvalTypeId) other;
|
||||||
|
return fInputType.isSameType(o.fInputType)
|
||||||
|
&& areEquivalentEvaluations(fArguments, o.fArguments)
|
||||||
|
&& fRepresentsNewExpression == o.fRepresentsNewExpression
|
||||||
|
&& fUsesBracedInitList == o.fUsesBracedInitList;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ValueCategory getValueCategory() {
|
public ValueCategory getValueCategory() {
|
||||||
return valueCategoryFromReturnType(fInputType);
|
return valueCategoryFromReturnType(fInputType);
|
||||||
|
|
|
@ -171,6 +171,16 @@ public class EvalUnary extends CPPDependentEvaluation {
|
||||||
&& isNullOrConstexprFunc(getOverload());
|
&& isNullOrConstexprFunc(getOverload());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalUnary)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalUnary o = (EvalUnary) other;
|
||||||
|
return fOperator == o.fOperator
|
||||||
|
&& fArgument.isEquivalentTo(o.fArgument);
|
||||||
|
}
|
||||||
|
|
||||||
public ICPPFunction getOverload() {
|
public ICPPFunction getOverload() {
|
||||||
if (fOverload == CPPFunction.UNINITIALIZED_FUNCTION) {
|
if (fOverload == CPPFunction.UNINITIALIZED_FUNCTION) {
|
||||||
fOverload= computeOverload();
|
fOverload= computeOverload();
|
||||||
|
|
|
@ -136,6 +136,16 @@ public class EvalUnaryTypeID extends CPPDependentEvaluation {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEquivalentTo(ICPPEvaluation other) {
|
||||||
|
if (!(other instanceof EvalUnaryTypeID)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EvalUnaryTypeID o = (EvalUnaryTypeID) other;
|
||||||
|
return fOperator == o.fOperator
|
||||||
|
&& fOrigType.isSameType(o.fOrigType);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
if (fType == null)
|
if (fType == null)
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class TypeOfDependentExpression extends CPPUnknownBinding implements ICPP
|
||||||
@Override
|
@Override
|
||||||
public boolean isSameType(IType type) {
|
public boolean isSameType(IType type) {
|
||||||
return type instanceof TypeOfDependentExpression
|
return type instanceof TypeOfDependentExpression
|
||||||
&& fEvaluation == ((TypeOfDependentExpression) type).fEvaluation;
|
&& fEvaluation.isEquivalentTo(((TypeOfDependentExpression) type).fEvaluation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Reference in a new issue