diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 92e78b12716..d9635920e35 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -10227,4 +10227,19 @@ public class AST2TemplateTests extends AST2TestBase { public void testDelegatingConstructorInPartialSpecialization_512932() throws Exception { parseAndCheckBindings(); } + + // enum class E { F }; + // + // template + // void foo(); + // + // template + // void foo(); + // + // int main() { + // foo(); // error here + // } + public void testOverloadingOnTypeOfNonTypeTemplateParameter_512932() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java index c2b5b55d5eb..c095b5a095f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java @@ -299,10 +299,6 @@ public class CPPASTLiteralExpression extends ASTNode implements ICPPASTLiteralEx } private IType getStringType() { - if (fSuffix.length > 0) { - return getUserDefinedLiteralOperatorType(); - } - IType type = new CPPBasicType(getBasicCharKind(), 0, this); type = new CPPQualifierType(type, true, false); return new CPPArrayType(type, getStringLiteralSize()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java index 45131e94eb1..e5c824426e5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPEvaluation.java @@ -29,6 +29,8 @@ import org.eclipse.cdt.internal.core.dom.parser.IntegralValue; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions.Context; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions.UDCMode; import org.eclipse.core.runtime.CoreException; public abstract class CPPEvaluation implements ICPPEvaluation { @@ -157,24 +159,37 @@ public abstract class CPPEvaluation implements ICPPEvaluation { protected static ICPPEvaluation maybeApplyConversion(ICPPEvaluation argument, IType targetType, IASTNode point, boolean allowContextualConversion) { IType type = argument.getType(point); - IType uqType= SemanticUtil.getNestedType(type, TDEF | REF | CVTYPE); - ValueCategory valueCategory = argument.getValueCategory(point); - ICPPFunction conversion = null; - if (uqType instanceof ICPPClassType) { - try { + + // Types match - don't bother to check for conversions. + if (targetType.isSameType(type)) { + return argument; + } + + try { + // Source type is class type - check for conversion operator. + IType uqType= SemanticUtil.getNestedType(type, TDEF | REF | CVTYPE); + ValueCategory valueCategory = argument.getValueCategory(point); + if (uqType instanceof ICPPClassType) { Cost cost = Conversions.initializationByConversion(valueCategory, type, (ICPPClassType) uqType, targetType, false, point, allowContextualConversion); - conversion = cost.getUserDefinedConversion(); - } catch (DOMException e) { - CCorePlugin.log(e); + ICPPFunction conversion = cost.getUserDefinedConversion(); + if (conversion != null) { + if (!conversion.isConstexpr()) { + return EvalFixed.INCOMPLETE; + } + ICPPEvaluation eval = new EvalMemberAccess(uqType, valueCategory, conversion, argument, false, point); + return new EvalFunctionCall(new ICPPEvaluation[] { eval }, null, (IBinding) null); + } } - } - if (conversion != null) { - if (!conversion.isConstexpr()) { + + // Source type is not a class type, or is but a conversion operator wasn't used. + // Check for standard conversions. + if (!Conversions.checkImplicitConversionSequence(targetType, type, valueCategory, UDCMode.FORBIDDEN, + Context.ORDINARY, point).converts()) { return EvalFixed.INCOMPLETE; } - ICPPEvaluation eval = new EvalMemberAccess(uqType, valueCategory, conversion, argument, false, point); - argument = new EvalFunctionCall(new ICPPEvaluation[] { eval }, null, (IBinding) null); + } catch (DOMException e) { + CCorePlugin.log(e); } return argument; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalReference.java index a794f73768e..67039f36213 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalReference.java @@ -110,7 +110,8 @@ public class EvalReference extends CPPDependentEvaluation { @Override public ValueCategory getValueCategory(IASTNode point) { - return getTargetEvaluation().getValueCategory(point); + // An EvalReference always refers to a named variable, so its value category is lvalue. + return ValueCategory.LVALUE; } @Override