Skip to content

Commit 8170b86

Browse files
committed
fix rvalue to lvalue binding
1 parent da7fcd9 commit 8170b86

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

clang/include/clang/Sema/Overload.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,15 @@ class Sema;
408408
}
409409

410410
bool isPerfect(const ASTContext &C) const {
411-
return isIdentityConversion() &&
412-
(!ReferenceBinding || C.hasSameType(getFromType(), getToType(2)));
411+
if(!isIdentityConversion())
412+
return false;
413+
if(!ReferenceBinding)
414+
return true;
415+
if(!C.hasSameType(getFromType(), getToType(2)))
416+
return false;
417+
if(BindsToRvalue && IsLvalueReference)
418+
return false;
419+
return true;
413420
}
414421

415422
ImplicitConversionRank getRank() const;

clang/lib/Sema/SemaOverload.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11031,6 +11031,8 @@ void OverloadCandidateSet::AddDeferredMethodTemplateCandidate(
1103111031
bool SuppressUserConversions, bool PartialOverloading,
1103211032
OverloadCandidateParamOrder PO) {
1103311033

11034+
assert(!isa<CXXConstructorDecl>(MethodTmpl->getTemplatedDecl()));
11035+
1103411036
auto *C =
1103511037
allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
1103611038

clang/test/SemaCXX/overload-resolution-deferred-templates.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,27 @@ struct Test {
128128
static_assert(__is_constructible(S, Test));
129129
}
130130

131+
namespace RefBinding {
132+
133+
template <typename> struct remove_reference;
134+
template <typename _Tp> struct remove_reference<_Tp &> {
135+
using type = _Tp;
136+
};
137+
template <typename _Tp> remove_reference<_Tp>::type move(_Tp &&);
138+
template <typename _Head> struct _Head_base {
139+
_Head_base(_Head &__h) : _M_head_impl(__h) {}
140+
template <typename _UHead> _Head_base(_UHead &&);
141+
_Head _M_head_impl;
142+
};
143+
144+
template <typename _Elements> void forward_as_tuple(_Elements &&) {
145+
_Head_base<_Elements &&>(_Elements{});
146+
}
147+
struct StringRef {
148+
void operator[](const StringRef __k) { forward_as_tuple((move)(__k)); }
149+
};
150+
151+
}
131152

132153
namespace GH62096 {
133154
template <typename T>

0 commit comments

Comments
 (0)