diff options
author | Michael Uhl | 2020-11-05 12:47:17 +0000 |
---|---|---|
committer | Nathan Ridge | 2020-11-14 02:22:39 +0000 |
commit | 6a9a8d409d3a5103ff8c234abdc4565d24fe5144 (patch) | |
tree | e42f587331bda446d3bb9bf9035022454394a104 /core/org.eclipse.cdt.core | |
parent | 742fbd74d80f3a3a0a76697adf2cc9b3fb8d6495 (diff) | |
download | org.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.java | 44 |
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()); } /** |