Author: rsmith Date: Mon Jul 2 16:25:22 2018 New Revision: 336153 URL: http://llvm.org/viewvc/llvm-project?rev=336153&view=rev Log: Per C++ [over.match.copy]p1, direct-initialization of a reference can only invoke converting constructors of the reference's underlying type.
Modified: cfe/trunk/lib/Sema/SemaInit.cpp cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5.cpp Modified: cfe/trunk/lib/Sema/SemaInit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=336153&r1=336152&r2=336153&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaInit.cpp (original) +++ cfe/trunk/lib/Sema/SemaInit.cpp Mon Jul 2 16:25:22 2018 @@ -4224,9 +4224,11 @@ static OverloadingResult TryRefInitWithC OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion); - // Determine whether we are allowed to call explicit constructors or - // explicit conversion operators. - bool AllowExplicit = Kind.AllowExplicit(); + // Determine whether we are allowed to call explicit conversion operators. + // Note that none of [over.match.copy], [over.match.conv], nor + // [over.match.ref] permit an explicit constructor to be chosen when + // initializing a reference, not even for direct-initialization. + bool AllowExplicitCtors = false; bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding(); const RecordType *T1RecordType = nullptr; @@ -4242,7 +4244,7 @@ static OverloadingResult TryRefInitWithC continue; if (!Info.Constructor->isInvalidDecl() && - Info.Constructor->isConvertingConstructor(AllowExplicit)) { + Info.Constructor->isConvertingConstructor(AllowExplicitCtors)) { if (Info.ConstructorTmpl) S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl, /*ExplicitArgs*/ nullptr, Modified: cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5.cpp?rev=336153&r1=336152&r2=336153&view=diff ============================================================================== --- cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5.cpp (original) +++ cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5.cpp Mon Jul 2 16:25:22 2018 @@ -61,3 +61,12 @@ namespace test3 { unsigned &t9 = (a->bitY += 3); // expected-error {{non-const reference cannot bind to bit-field 'bitY'}} } } + +namespace explicit_ctor { + struct A {}; + struct B { // expected-note 2{{candidate}} + explicit B(const A&); + }; + A a; + const B &b(a); // expected-error {{no viable conversion}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits