diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 8efb7c69d30..56135288db9 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -8977,6 +8977,18 @@ bool clang::isBetterOverloadCandidate( // C++14 [over.match.best]p1 section 2 bullet 3. } + // FIXME: Work around a defect in the C++17 guaranteed copy elision wording, + // as combined with the resolution to CWG issue 243. + // + // When the context is initialization by constructor ([over.match.ctor] or + // either phase of [over.match.list]), a constructor is preferred over + // a conversion function. + if (Kind == OverloadCandidateSet::CSK_InitByConstructor && NumArgs == 1 && + Cand1.Function && Cand2.Function && + isa<CXXConstructorDecl>(Cand1.Function) != + isa<CXXConstructorDecl>(Cand2.Function)) + return isa<CXXConstructorDecl>(Cand1.Function); + // -- F1 is a non-template function and F2 is a function template // specialization, or, if not that, bool Cand1IsSpecialization = Cand1.Function && @@ -9035,20 +9047,6 @@ bool clang::isBetterOverloadCandidate( return true; } } - - - - // FIXME: Work around a defect in the C++17 guaranteed copy elision wording, - // as combined with the resolution to CWG issue 243. - // - // When the context is initialization by constructor ([over.match.ctor] or - // either phase of [over.match.list]), a constructor is preferred over - // a conversion function. - if (Kind == OverloadCandidateSet::CSK_InitByConstructor && NumArgs == 1 && - Cand1.Function && Cand2.Function && - isa<CXXConstructorDecl>(Cand1.Function) != - isa<CXXConstructorDecl>(Cand2.Function)) - return isa<CXXConstructorDecl>(Cand1.Function); // Check for enable_if value-based overload resolution. if (Cand1.Function && Cand2.Function) { |