[clang] [clang][Sema] Bugfix for choosing the more specialized overload (PR #83279)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 6 05:51:44 PST 2024
================
@@ -5333,38 +5333,37 @@ bool Sema::CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD,
return false;
}
-/// If this is a non-static member function,
-static void
-AddImplicitObjectParameterType(ASTContext &Context,
- CXXMethodDecl *Method,
- SmallVectorImpl<QualType> &ArgTypes) {
- // C++11 [temp.func.order]p3:
- // [...] The new parameter is of type "reference to cv A," where cv are
- // the cv-qualifiers of the function template (if any) and A is
- // the class of which the function template is a member.
- //
- // The standard doesn't say explicitly, but we pick the appropriate kind of
- // reference type based on [over.match.funcs]p4.
- assert(Method && Method->isImplicitObjectMemberFunction() &&
- "expected an implicit objet function");
- QualType ArgTy = Context.getTypeDeclType(Method->getParent());
- ArgTy = Context.getQualifiedType(ArgTy, Method->getMethodQualifiers());
- if (Method->getRefQualifier() == RQ_RValue)
- ArgTy = Context.getRValueReferenceType(ArgTy);
- else
- ArgTy = Context.getLValueReferenceType(ArgTy);
- ArgTypes.push_back(ArgTy);
+static QualType GetImplicitObjectParameterType(ASTContext &Context,
+ const CXXMethodDecl *Method,
+ QualType RawType,
+ bool IsOtherRvr) {
+ // C++20 [temp.func.order]p3.1, p3.2:
+ //- The type X(M ) is “rvalue reference to cv A” if the optional ref-qualifier
+ // of M is && or if M has no ref-qualifier and the positionally-corresponding
+ // parameter of the other transformed template has rvalue reference type;
+ // if this determination depends recursively upon whether X(M ) is an rvalue
+ // reference type, it is not considered to have rvalue reference type.
+ //- Otherwise, X(M ) is “lvalue reference to cv A”.
----------------
whisperity wrote:
```suggestion
// C++20 [temp.func.order]p3.1, p3.2:
// - The type X(M) is "rvalue reference to cv A" if the optional
// ref-qualifier of M is && or if M has no ref-qualifier and the
// positionally-corresponding parameter of the other transformed
// template has rvalue reference type; if this determination depends
// recursively upon whether X(M) is an rvalue reference type, it
// is not considered to have rvalue reference type.
//
// - Otherwise, X(M) is "lvalue reference to cv A".
```
https://github.com/llvm/llvm-project/pull/83279
More information about the cfe-commits
mailing list