Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Uhl2020-11-05 12:47:17 +0000
committerNathan Ridge2020-11-14 02:22:39 +0000
commit6a9a8d409d3a5103ff8c234abdc4565d24fe5144 (patch)
treee42f587331bda446d3bb9bf9035022454394a104 /core/org.eclipse.cdt.core
parent742fbd74d80f3a3a0a76697adf2cc9b3fb8d6495 (diff)
downloadorg.eclipse.cdt-6a9a8d409d3a5103ff8c234abdc4565d24fe5144.tar.gz
org.eclipse.cdt-6a9a8d409d3a5103ff8c234abdc4565d24fe5144.tar.xz
org.eclipse.cdt-6a9a8d409d3a5103ff8c234abdc4565d24fe5144.zip
Bug 567217 - template functions with lvalue and rvalue parameters of
template tests added. Change-Id: I1fbbb45c6d895505a66ad917b1342365118e28d0
Diffstat (limited to 'core/org.eclipse.cdt.core')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java44
1 files changed, 32 insertions, 12 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
index 2910f25211b..5a9f4ab9059 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java
@@ -572,25 +572,45 @@ public class TemplateArgumentDeduction {
return true;
}
- private static int deduceForPartialOrdering(IType par, IType arg, TemplateArgumentDeduction deduct)
+ private static int deduceForPartialOrdering(IType parOrig, IType argOrig, TemplateArgumentDeduction deduct)
throws DOMException {
- par = getNestedType(par, TDEF);
- arg = getNestedType(arg, TDEF);
+ IType parNested = getNestedType(parOrig, TDEF);
+ IType argNested = getNestedType(argOrig, TDEF);
boolean isMoreCVQualified = false;
- if (par instanceof ICPPReferenceType && arg instanceof ICPPReferenceType) {
- par = getNestedType(par, REF | TDEF);
- arg = getNestedType(arg, REF | TDEF);
- CVQualifier cvp = getCVQualifier(par);
- CVQualifier cva = getCVQualifier(arg);
+ boolean preferForLValueRef = false;
+ if (parNested instanceof ICPPReferenceType && argNested instanceof ICPPReferenceType) {
+ preferForLValueRef = compareRValueRValueTemplateFunctions(parNested, argNested);
+ parNested = getNestedType(parNested, REF | TDEF);
+ argNested = getNestedType(argNested, REF | TDEF);
+ CVQualifier cvp = getCVQualifier(parNested);
+ CVQualifier cva = getCVQualifier(argNested);
isMoreCVQualified = cva.isMoreQualifiedThan(cvp);
}
- par = getNestedType(par, TDEF | REF | ALLCVQ);
- arg = getNestedType(arg, TDEF | REF | ALLCVQ);
+ parNested = getNestedType(parNested, TDEF | REF | ALLCVQ);
+ argNested = getNestedType(argNested, TDEF | REF | ALLCVQ);
- if (!deduct.fromType(par, arg, false, false))
+ if (!deduct.fromType(parNested, argNested, false, false))
return -1;
- return isMoreCVQualified ? 1 : 0;
+ return (isMoreCVQualified || preferForLValueRef) ? 1 : 0;
+ }
+
+ private static boolean compareRValueRValueTemplateFunctions(final IType f1, final IType f2) {
+ ICPPReferenceType fstTp = (ICPPReferenceType) f1;
+ ICPPReferenceType sndTp = (ICPPReferenceType) f2;
+
+ boolean fstRv = fstTp.isRValueReference();
+ boolean sndRv = sndTp.isRValueReference();
+
+ if (fstRv != sndRv) {
+ return fstRv;
+ }
+
+ return false;
+ }
+
+ private static boolean isReferenceType(IType fstSpecP) {
+ return ICPPReferenceType.class.isAssignableFrom(fstSpecP.getClass());
}
/**

Back to the top