Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9131,15 +9131,22 @@ "before C++20">, InGroup, DefaultIgnore; def err_defaulted_comparison_template : Error< "comparison operator template cannot be defaulted">; -def err_defaulted_comparison_out_of_class : Error< - "%sub{select_defaulted_comparison_kind}0 can only be defaulted in a class " - "definition">; +def err_defaulted_comparison_num_args : Error< + "%select{non-member|member}0 %sub{select_defaulted_comparison_kind}1" + " comparison operator must have %select{2|1}0 parameters">; def err_defaulted_comparison_param : Error< "invalid parameter type for defaulted %sub{select_defaulted_comparison_kind}0" "; found %1, expected %2%select{| or %4}3">; +def err_defaulted_comparison_param_unknown : Error< + "invalid parameter type for non-member defaulted" + " %sub{select_defaulted_comparison_kind}0" + "; found %1, expected class or reference to a constant class">; def err_defaulted_comparison_param_mismatch : Error< "parameters for defaulted %sub{select_defaulted_comparison_kind}0 " "must have the same type%diff{ (found $ vs $)|}1,2">; +def err_defaulted_comparison_not_friend : Error< + "%sub{select_defaulted_comparison_kind}0 is not a friend of" + " %select{|incomplete class }1%2">; def err_defaulted_comparison_non_const : Error< "defaulted member %sub{select_defaulted_comparison_kind}0 must be " "const-qualified">; Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -8434,9 +8434,6 @@ DefaultedComparisonKind DCK) { assert(DCK != DefaultedComparisonKind::None && "not a defaulted comparison"); - CXXRecordDecl *RD = dyn_cast(FD->getLexicalDeclContext()); - assert(RD && "defaulted comparison is not defaulted in a class"); - // Perform any unqualified lookups we're going to need to default this // function. if (S) { @@ -8454,43 +8451,17 @@ // const C&, or // -- a friend of C having two parameters of type const C& or two // parameters of type C. - QualType ExpectedParmType1 = Context.getRecordType(RD); - QualType ExpectedParmType2 = - Context.getLValueReferenceType(ExpectedParmType1.withConst()); - if (isa(FD)) - ExpectedParmType1 = ExpectedParmType2; - for (const ParmVarDecl *Param : FD->parameters()) { - if (!Param->getType()->isDependentType() && - !Context.hasSameType(Param->getType(), ExpectedParmType1) && - !Context.hasSameType(Param->getType(), ExpectedParmType2)) { - // Don't diagnose an implicit 'operator=='; we will have diagnosed the - // corresponding defaulted 'operator<=>' already. - if (!FD->isImplicit()) { - Diag(FD->getLocation(), diag::err_defaulted_comparison_param) - << (int)DCK << Param->getType() << ExpectedParmType1 - << !isa(FD) - << ExpectedParmType2 << Param->getSourceRange(); - } - return true; - } - } - if (FD->getNumParams() == 2 && - !Context.hasSameType(FD->getParamDecl(0)->getType(), - FD->getParamDecl(1)->getType())) { - if (!FD->isImplicit()) { - Diag(FD->getLocation(), diag::err_defaulted_comparison_param_mismatch) - << (int)DCK - << FD->getParamDecl(0)->getType() - << FD->getParamDecl(0)->getSourceRange() - << FD->getParamDecl(1)->getType() - << FD->getParamDecl(1)->getSourceRange(); - } - return true; - } - // ... non-static const member ... - if (auto *MD = dyn_cast(FD)) { + CXXRecordDecl *RD = dyn_cast(FD->getLexicalDeclContext()); + bool IsMethod = isa(FD); + if (IsMethod) { + auto *MD = cast(FD); assert(!MD->isStatic() && "comparison function cannot be a static member"); + + // If we're out-of-class, this is the class we're comparing. + if (!RD) + RD = MD->getParent(); + if (!MD->isConst()) { SourceLocation InsertLoc; if (FunctionTypeLoc Loc = MD->getFunctionTypeLoc()) @@ -8499,7 +8470,7 @@ // corresponding defaulted 'operator<=>' already. if (!MD->isImplicit()) { Diag(MD->getLocation(), diag::err_defaulted_comparison_non_const) - << (int)DCK << FixItHint::CreateInsertion(InsertLoc, " const"); + << (int)DCK << FixItHint::CreateInsertion(InsertLoc, " const"); } // Add the 'const' to the type to recover. @@ -8509,9 +8480,100 @@ MD->setType(Context.getFunctionType(FPT->getReturnType(), FPT->getParamTypes(), EPI)); } - } else { - // A non-member function declared in a class must be a friend. + } + + if (FD->getNumParams() != (IsMethod ? 1 : 2)) { + // Let's not worry about using a variadic template pack here -- who would do + // such a thing? + Diag(FD->getLocation(), diag::err_defaulted_comparison_num_args) + << int(IsMethod) << int(DCK); + return true; + } + + const ParmVarDecl *KnownParm = nullptr; + for (const ParmVarDecl *Param : FD->parameters()) { + QualType ParmTy = Param->getType(); + if (ParmTy->isDependentType()) + continue; + if (!KnownParm) { + auto CTy = ParmTy; + // Is it `T const &`? + bool Ok = !IsMethod; + QualType ExpectedTy; + if (RD) + ExpectedTy = Context.getRecordType(RD); + if (auto *Ref = CTy->getAs()) { + CTy = Ref->getPointeeType(); + if (RD) + ExpectedTy.addConst(); + Ok = true; + } + + // Is T a class? + if (!Ok) { + } else if (RD) { + if (!RD->isDependentType() && !Context.hasSameType(CTy, ExpectedTy)) + Ok = false; + } else if (auto *CRD = CTy->getAsRecordDecl()) { + RD = cast(CRD); + } else { + Ok = false; + } + + if (Ok) + KnownParm = Param; + else { + // Don't diagnose an implicit 'operator=='; we will have diagnosed the + // corresponding defaulted 'operator<=>' already. + if (!FD->isImplicit()) { + if (RD) { + QualType PlainTy = Context.getRecordType(RD); + QualType RefTy = + Context.getLValueReferenceType(PlainTy.withConst()); + if (IsMethod) + PlainTy = QualType(); + Diag(FD->getLocation(), diag::err_defaulted_comparison_param) + << int(DCK) << ParmTy << RefTy << int(!IsMethod) << PlainTy + << Param->getSourceRange(); + } else { + assert(!IsMethod && "should know expected type for method"); + Diag(FD->getLocation(), + diag::err_defaulted_comparison_param_unknown) + << int(DCK) << ParmTy << Param->getSourceRange(); + } + } + return true; + } + } else if (!Context.hasSameType(KnownParm->getType(), ParmTy)) { + Diag(FD->getLocation(), diag::err_defaulted_comparison_param_mismatch) + << int(DCK) << KnownParm->getType() << KnownParm->getSourceRange() + << ParmTy << Param->getSourceRange(); + return true; + } + } + + assert(RD && "must have determined class"); + if (IsMethod) { + } else if (isa(FD->getLexicalDeclContext())) { + // In-class, must be a friend decl. assert(FD->getFriendObjectKind() && "expected a friend declaration"); + } else { + // Out of class, require the defaulted comparison to be a friend (of a + // complete type). + if (RequireCompleteType(FD->getLocation(), Context.getRecordType(RD), + diag::err_defaulted_comparison_not_friend, int(DCK), + int(1))) + return true; + + if (llvm::find_if(RD->friends(), [&](const FriendDecl *F) { + return FD->getCanonicalDecl() == + F->getFriendDecl()->getCanonicalDecl(); + }) == RD->friends().end()) { + Diag(FD->getLocation(), diag::err_defaulted_comparison_not_friend) + << int(DCK) << int(0) << RD; + Diag(RD->getCanonicalDecl()->getLocation(), diag::note_declared_at); + return true; + } } // C++2a [class.eq]p1, [class.rel]p1: @@ -8669,7 +8731,10 @@ { // Build and set up the function body. - CXXRecordDecl *RD = cast(FD->getLexicalParent()); + // The first parameter has type maybe-ref-to maybe-const T, use that to get + // the type of the class being compared. + auto PT = FD->getParamDecl(0)->getType(); + CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl(); SourceLocation BodyLoc = FD->getEndLoc().isValid() ? FD->getEndLoc() : FD->getLocation(); StmtResult Body = @@ -17153,13 +17218,6 @@ return; } - if (DefKind.isComparison() && - !isa(FD->getLexicalDeclContext())) { - Diag(FD->getLocation(), diag::err_defaulted_comparison_out_of_class) - << (int)DefKind.asComparison(); - return; - } - // Issue compatibility warning. We already warned if the operator is // 'operator<=>' when parsing the '<=>' token. if (DefKind.isComparison() && @@ -17181,31 +17239,37 @@ // that we've marked it as defaulted. FD->setWillHaveBody(false); - // If this definition appears within the record, do the checking when - // the record is complete. This is always the case for a defaulted - // comparison. - if (DefKind.isComparison()) + // If this is a comparison's defaulted definition within the record, do + // the checking when the record is complete. + if (DefKind.isComparison() && isa(FD->getLexicalDeclContext())) return; - auto *MD = cast(FD); - const FunctionDecl *Primary = FD; - if (const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern()) - // Ask the template instantiation pattern that actually had the - // '= default' on it. - Primary = Pattern; - - // If the method was defaulted on its first declaration, we will have + // If this member fn was defaulted on its first declaration, we will have // already performed the checking in CheckCompletedCXXClass. Such a // declaration doesn't trigger an implicit definition. - if (Primary->getCanonicalDecl()->isDefaulted()) - return; + if (isa(FD)) { + const FunctionDecl *Primary = FD; + if (const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern()) + // Ask the template instantiation pattern that actually had the + // '= default' on it. + Primary = Pattern; + if (Primary->getCanonicalDecl()->isDefaulted()) + return; + } - // FIXME: Once we support defining comparisons out of class, check for a - // defaulted comparison here. - if (CheckExplicitlyDefaultedSpecialMember(MD, DefKind.asSpecialMember())) - MD->setInvalidDecl(); - else - DefineDefaultedFunction(*this, MD, DefaultLoc); + if (DefKind.isComparison()) { + if (CheckExplicitlyDefaultedComparison(nullptr, FD, DefKind.asComparison())) + FD->setInvalidDecl(); + else + DefineDefaultedComparison(DefaultLoc, FD, DefKind.asComparison()); + } else { + auto *MD = cast(FD); + + if (CheckExplicitlyDefaultedSpecialMember(MD, DefKind.asSpecialMember())) + MD->setInvalidDecl(); + else + DefineDefaultedFunction(*this, MD, DefaultLoc); + } } static void SearchForReturnInStmt(Sema &Self, Stmt *S) { Index: clang/lib/Sema/SemaOverload.cpp.blame =================================================================== --- /dev/null +++ clang/lib/Sema/SemaOverload.cpp.blame @@ -0,0 +1,15219 @@ +e112151a35826 (Nick Lewycky 2013-01-24 01:12:16 +0000 1) //===--- SemaOverload.cpp - C++ Overloading -------------------------------===// +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2) // +2946cd7010674 (Chandler Carruth 2019-01-19 08:50:56 +0000 3) // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +2946cd7010674 (Chandler Carruth 2019-01-19 08:50:56 +0000 4) // See https://llvm.org/LICENSE.txt for license information. +2946cd7010674 (Chandler Carruth 2019-01-19 08:50:56 +0000 5) // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6) // +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 7) //===----------------------------------------------------------------------===// +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 8) // +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9) // This file provides Sema routines for C++ overloading. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10) // +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 11) //===----------------------------------------------------------------------===// +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 12) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 13) #include "clang/AST/ASTContext.h" +36d1b14ddedb3 (Douglas Gregor 2009-10-06 17:59:45 +0000 14) #include "clang/AST/CXXInheritance.h" +de6836a384d86 (John McCall 2010-08-24 07:21:54 +0000 15) #include "clang/AST/DeclObjC.h" +67d25914b2a42 (Haojian Wu 2020-03-16 13:43:40 +0100 16) #include "clang/AST/DependenceFlags.h" +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 17) #include "clang/AST/Expr.h" +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 18) #include "clang/AST/ExprCXX.h" +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 19) #include "clang/AST/ExprObjC.h" +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 20) #include "clang/AST/TypeOrdering.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 21) #include "clang/Basic/Diagnostic.h" +f3ca2698393c5 (Benjamin Kramer 2014-05-10 16:31:55 +0000 22) #include "clang/Basic/DiagnosticOptions.h" +d624e16833af6 (Anders Carlsson 2009-08-26 23:45:07 +0000 23) #include "clang/Basic/PartialDiagnostic.h" +86565c1309423 (Reid Kleckner 2020-02-27 11:01:58 -0800 24) #include "clang/Basic/SourceManager.h" +c729b0b50669e (David Majnemer 2013-09-16 22:44:20 +0000 25) #include "clang/Basic/TargetInfo.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 26) #include "clang/Sema/Initialization.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 27) #include "clang/Sema/Lookup.h" +ec3060c72de6a (Ilya Biryukov 2020-03-02 16:07:09 +0100 28) #include "clang/Sema/Overload.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 29) #include "clang/Sema/SemaInternal.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 30) #include "clang/Sema/Template.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 31) #include "clang/Sema/TemplateDeduction.h" +2bbc0266e0749 (Douglas Gregor 2010-09-12 04:28:07 +0000 32) #include "llvm/ADT/DenseSet.h" +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 33) #include "llvm/ADT/Optional.h" +3a02247dc9e39 (Chandler Carruth 2012-12-04 09:13:33 +0000 34) #include "llvm/ADT/STLExtras.h" +58e008d2a61a7 (Douglas Gregor 2008-11-13 20:12:29 +0000 35) #include "llvm/ADT/SmallPtrSet.h" +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 36) #include "llvm/ADT/SmallString.h" +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 37) #include +8ad22e6a5cb2c (David Blaikie 2014-05-01 23:01:41 +0000 38) #include +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 39) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 40) using namespace clang; +19c1bfd1b0750 (John McCall 2010-08-25 05:32:35 +0000 41) using namespace sema; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 42) +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 43) using AllowedExplicit = Sema::AllowedExplicit; +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 44) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 45) static bool functionHasPassObjectSizeParams(const FunctionDecl *FD) { +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 46) return llvm::any_of(FD->parameters(), [](const ParmVarDecl *P) { +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 47) return P->hasAttr(); +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 48) }); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 49) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 50) +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 51) /// A convenience routine for creating a decayed reference to a function. +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 52) static ExprResult +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 53) CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 54) const Expr *Base, bool HadMultipleCandidates, +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 55) SourceLocation Loc = SourceLocation(), +e9d62935d3c42 (Douglas Gregor 2011-07-15 16:25:15 +0000 56) const DeclarationNameLoc &LocInfo = DeclarationNameLoc()){ +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 57) if (S.DiagnoseUseOfDecl(FoundDecl, Loc)) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 58) return ExprError(); +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 59) // If FoundDecl is different from Fn (such as if one is a template +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 60) // and the other a specialization), make sure DiagnoseUseOfDecl is +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 61) // called on both. +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 62) // FIXME: This would be more comprehensively addressed by modifying +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 63) // DiagnoseUseOfDecl to accept both the FoundDecl and the decl +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 64) // being used. +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 65) if (FoundDecl != Fn && S.DiagnoseUseOfDecl(Fn, Loc)) +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 66) return ExprError(); +5fc4db75798c8 (Bruno Ricci 2018-12-21 14:10:18 +0000 67) DeclRefExpr *DRE = new (S.Context) +5fc4db75798c8 (Bruno Ricci 2018-12-21 14:10:18 +0000 68) DeclRefExpr(S.Context, Fn, false, Fn->getType(), VK_LValue, Loc, LocInfo); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 69) if (HadMultipleCandidates) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 70) DRE->setHadMultipleCandidates(true); +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 71) +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 72) S.MarkDeclRefReferenced(DRE, Base); +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 73) if (auto *FPT = DRE->getType()->getAs()) { +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 74) if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) { +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 75) S.ResolveExceptionSpec(Loc, FPT); +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 76) DRE->setType(Fn->getType()); +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 77) } +0ec1e99001291 (Richard Smith 2019-12-13 14:06:24 -0800 78) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 79) return S.ImpCastExprToType(DRE, S.Context.getPointerType(DRE->getType()), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 80) CK_FunctionToPointerDecay); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 81) } +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 82) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 83) static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 84) bool InOverloadResolution, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 85) StandardConversionSequence &SCS, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 86) bool CStyle, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 87) bool AllowObjCWritebackConversion); +04390a63c89b0 (Sam Panzer 2012-08-16 02:38:47 +0000 88) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 89) static bool IsTransparentUnionStandardConversion(Sema &S, Expr* From, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 90) QualType &ToType, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 91) bool InOverloadResolution, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 92) StandardConversionSequence &SCS, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 93) bool CStyle); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 94) static OverloadingResult +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 95) IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 96) UserDefinedConversionSequence& User, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 97) OverloadCandidateSet& Conversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 98) AllowedExplicit AllowExplicit, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 99) bool AllowObjCConversionOnExplicit); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 100) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 101) static ImplicitConversionSequence::CompareKind +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 102) CompareStandardConversionSequences(Sema &S, SourceLocation Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 103) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 104) const StandardConversionSequence& SCS2); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 105) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 106) static ImplicitConversionSequence::CompareKind +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 107) CompareQualificationConversions(Sema &S, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 108) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 109) const StandardConversionSequence& SCS2); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 110) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 111) static ImplicitConversionSequence::CompareKind +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 112) CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 113) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 114) const StandardConversionSequence& SCS2); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 115) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 116) /// GetConversionRank - Retrieve the implicit conversion rank +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 117) /// corresponding to the given implicit conversion kind. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 118) ImplicitConversionRank clang::GetConversionRank(ImplicitConversionKind Kind) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 119) static const ImplicitConversionRank +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 120) Rank[(int)ICK_Num_Conversion_Kinds] = { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 121) ICR_Exact_Match, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 122) ICR_Exact_Match, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 123) ICR_Exact_Match, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 124) ICR_Exact_Match, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 125) ICR_Exact_Match, +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 126) ICR_Exact_Match, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 127) ICR_Promotion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 128) ICR_Promotion, +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 129) ICR_Promotion, +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 130) ICR_Conversion, +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 131) ICR_Conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 132) ICR_Conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 133) ICR_Conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 134) ICR_Conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 135) ICR_Conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 136) ICR_Conversion, +786ab2119f288 (Douglas Gregor 2008-10-29 02:00:59 +0000 137) ICR_Conversion, +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 138) ICR_Conversion, +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 139) ICR_Conversion, +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 140) ICR_Conversion, +c217f37cb663b (Egor Churaev 2017-03-21 12:55:55 +0000 141) ICR_OCL_Scalar_Widening, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 142) ICR_Complex_Real_Conversion, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 143) ICR_Conversion, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 144) ICR_Conversion, +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 145) ICR_Writeback_Conversion, +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 146) ICR_Exact_Match, // NOTE(gbiv): This may not be completely right -- +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 147) // it was omitted by the patch that added +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 148) // ICK_Zero_Event_Conversion +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 149) ICR_C_Conversion, +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 150) ICR_C_Conversion_Extension +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 151) }; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 152) return Rank[(int)Kind]; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 153) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 154) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 155) /// GetImplicitConversionName - Return the name of this kind of +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 156) /// implicit conversion. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 157) static const char* GetImplicitConversionName(ImplicitConversionKind Kind) { +cfca1f0dc1cda (Nuno Lopes 2009-12-23 17:49:57 +0000 158) static const char* const Name[(int)ICK_Num_Conversion_Kinds] = { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 159) "No conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 160) "Lvalue-to-rvalue", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 161) "Array-to-pointer", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 162) "Function-to-pointer", +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 163) "Function pointer conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 164) "Qualification", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 165) "Integral promotion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 166) "Floating point promotion", +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 167) "Complex promotion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 168) "Integral conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 169) "Floating conversion", +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 170) "Complex conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 171) "Floating-integral conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 172) "Pointer conversion", +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 173) "Pointer-to-member conversion", +786ab2119f288 (Douglas Gregor 2008-10-29 02:00:59 +0000 174) "Boolean conversion", +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 175) "Compatible-types conversion", +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 176) "Derived-to-base conversion", +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 177) "Vector conversion", +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 178) "SVE Vector conversion", +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 179) "Vector splat", +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 180) "Complex-real conversion", +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 181) "Block Pointer conversion", +55635cea27f25 (Sylvestre Ledru 2014-11-17 19:41:49 +0000 182) "Transparent Union Conversion", +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 183) "Writeback conversion", +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 184) "OpenCL Zero Event Conversion", +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 185) "C specific type conversion", +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 186) "Incompatible pointer conversion" +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 187) }; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 188) return Name[Kind]; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 189) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 190) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 191) /// StandardConversionSequence - Set the standard conversion +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 192) /// sequence to the identity conversion. +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 193) void StandardConversionSequence::setAsIdentityConversion() { +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 194) First = ICK_Identity; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 195) Second = ICK_Identity; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 196) Third = ICK_Identity; +e489a7d3d3972 (Douglas Gregor 2010-02-28 18:30:25 +0000 197) DeprecatedStringLiteralToCharPtr = false; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 198) QualificationIncludesObjCLifetime = false; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 199) ReferenceBinding = false; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 200) DirectBinding = false; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 201) IsLvalueReference = true; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 202) BindsToFunctionLvalue = false; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 203) BindsToRvalue = false; +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 204) BindsImplicitObjectArgumentWithoutRefQualifier = false; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 205) ObjCLifetimeConversionBinding = false; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 206) CopyConstructor = nullptr; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 207) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 208) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 209) /// getRank - Retrieve the rank of this standard conversion sequence +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 210) /// (C++ 13.3.3.1.1p3). The rank is the largest rank of each of the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 211) /// implicit conversions. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 212) ImplicitConversionRank StandardConversionSequence::getRank() const { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 213) ImplicitConversionRank Rank = ICR_Exact_Match; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 214) if (GetConversionRank(First) > Rank) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 215) Rank = GetConversionRank(First); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 216) if (GetConversionRank(Second) > Rank) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 217) Rank = GetConversionRank(Second); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 218) if (GetConversionRank(Third) > Rank) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 219) Rank = GetConversionRank(Third); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 220) return Rank; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 221) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 222) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 223) /// isPointerConversionToBool - Determines whether this conversion is +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 224) /// a conversion of a pointer or pointer-to-member to bool. This is +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 225) /// used as part of the ranking of standard conversion sequences +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 226) /// (C++ 13.3.3.2p4). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 227) bool StandardConversionSequence::isPointerConversionToBool() const { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 228) // Note that FromType has not necessarily been transformed by the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 229) // array-to-pointer or function-to-pointer implicit conversions, so +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 230) // check for their presence as well as checking whether FromType is +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 231) // a pointer. +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 232) if (getToType(1)->isBooleanType() && +6d1116ac4967b (John McCall 2010-06-11 10:04:22 +0000 233) (getFromType()->isPointerType() || +2fcbe9283fb9f (Erich Keane 2018-06-12 13:59:32 +0000 234) getFromType()->isMemberPointerType() || +6d1116ac4967b (John McCall 2010-06-11 10:04:22 +0000 235) getFromType()->isObjCObjectPointerType() || +6d1116ac4967b (John McCall 2010-06-11 10:04:22 +0000 236) getFromType()->isBlockPointerType() || +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 237) First == ICK_Array_To_Pointer || First == ICK_Function_To_Pointer)) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 238) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 239) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 240) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 241) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 242) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 243) /// isPointerConversionToVoidPointer - Determines whether this +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 244) /// conversion is a conversion of a pointer to a void pointer. This is +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 245) /// used as part of the ranking of standard conversion sequences (C++ +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 246) /// 13.3.3.2p4). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 247) bool +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 248) StandardConversionSequence:: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 249) isPointerConversionToVoidPointer(ASTContext& Context) const { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 250) QualType FromType = getFromType(); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 251) QualType ToType = getToType(1); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 252) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 253) // Note that FromType has not necessarily been transformed by the +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 254) // array-to-pointer implicit conversion, so check for its presence +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 255) // and redo the conversion to get a pointer. +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 256) if (First == ICK_Array_To_Pointer) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 257) FromType = Context.getArrayDecayedType(FromType); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 258) +5d3d3fa33d44a (Douglas Gregor 2011-04-15 20:45:44 +0000 259) if (Second == ICK_Pointer_Conversion && FromType->isAnyPointerType()) +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 260) if (const PointerType* ToPtrType = ToType->getAs()) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 261) return ToPtrType->getPointeeType()->isVoidType(); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 262) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 263) return false; +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 264) } +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 265) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 266) /// Skip any implicit casts which could be either part of a narrowing conversion +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 267) /// or after one in an implicit conversion. +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 268) static const Expr *IgnoreNarrowingConversion(ASTContext &Ctx, +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 269) const Expr *Converted) { +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 270) // We can have cleanups wrapping the converted expression; these need to be +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 271) // preserved so that destructors run if necessary. +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 272) if (auto *EWC = dyn_cast(Converted)) { +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 273) Expr *Inner = +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 274) const_cast(IgnoreNarrowingConversion(Ctx, EWC->getSubExpr())); +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 275) return ExprWithCleanups::Create(Ctx, Inner, EWC->cleanupsHaveSideEffects(), +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 276) EWC->getObjects()); +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 277) } +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 278) +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 279) while (auto *ICE = dyn_cast(Converted)) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 280) switch (ICE->getCastKind()) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 281) case CK_NoOp: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 282) case CK_IntegralCast: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 283) case CK_IntegralToBoolean: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 284) case CK_IntegralToFloating: +df1ed0099ba6c (George Burgess IV 2016-01-13 01:52:39 +0000 285) case CK_BooleanToSignedIntegral: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 286) case CK_FloatingToIntegral: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 287) case CK_FloatingToBoolean: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 288) case CK_FloatingCast: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 289) Converted = ICE->getSubExpr(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 290) continue; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 291) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 292) default: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 293) return Converted; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 294) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 295) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 296) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 297) return Converted; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 298) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 299) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 300) /// Check if this standard conversion sequence represents a narrowing +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 301) /// conversion, according to C++11 [dcl.init.list]p7. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 302) /// +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 303) /// \param Ctx The AST context. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 304) /// \param Converted The result of applying this standard conversion sequence. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 305) /// \param ConstantValue If this is an NK_Constant_Narrowing conversion, the +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 306) /// value of the expression prior to the narrowing conversion. +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 307) /// \param ConstantType If this is an NK_Constant_Narrowing conversion, the +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 308) /// type of the expression prior to the narrowing conversion. +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 309) /// \param IgnoreFloatToIntegralConversion If true type-narrowing conversions +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 310) /// from floating point types to integral types should be ignored. +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 311) NarrowingKind StandardConversionSequence::getNarrowingKind( +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 312) ASTContext &Ctx, const Expr *Converted, APValue &ConstantValue, +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 313) QualType &ConstantType, bool IgnoreFloatToIntegralConversion) const { +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 314) assert(Ctx.getLangOpts().CPlusPlus && "narrowing check outside C++"); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 315) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 316) // C++11 [dcl.init.list]p7: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 317) // A narrowing conversion is an implicit conversion ... +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 318) QualType FromType = getToType(0); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 319) QualType ToType = getToType(1); +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 320) +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 321) // A conversion to an enumeration type is narrowing if the conversion to +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 322) // the underlying type is narrowing. This only arises for expressions of +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 323) // the form 'Enum{init}'. +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 324) if (auto *ET = ToType->getAs()) +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 325) ToType = ET->getDecl()->getIntegerType(); +ed638864d3e19 (Richard Smith 2016-03-28 06:08:37 +0000 326) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 327) switch (Second) { +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 328) // 'bool' is an integral type; dispatch to the right place to handle it. +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 329) case ICK_Boolean_Conversion: +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 330) if (FromType->isRealFloatingType()) +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 331) goto FloatingIntegralConversion; +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 332) if (FromType->isIntegralOrUnscopedEnumerationType()) +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 333) goto IntegralConversion; +7ef45f45f6721 (Richard Smith 2020-02-10 07:22:51 -0800 334) // -- from a pointer type or pointer-to-member type to bool, or +7ef45f45f6721 (Richard Smith 2020-02-10 07:22:51 -0800 335) return NK_Type_Narrowing; +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 336) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 337) // -- from a floating-point type to an integer type, or +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 338) // +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 339) // -- from an integer type or unscoped enumeration type to a floating-point +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 340) // type, except where the source is a constant expression and the actual +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 341) // value after conversion will fit into the target type and will produce +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 342) // the original value when converted back to the original type, or +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 343) case ICK_Floating_Integral: +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 344) FloatingIntegralConversion: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 345) if (FromType->isRealFloatingType() && ToType->isIntegralType(Ctx)) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 346) return NK_Type_Narrowing; +7b1a950c4af4e (Mikhail Maltsev 2018-02-21 10:08:18 +0000 347) } else if (FromType->isIntegralOrUnscopedEnumerationType() && +7b1a950c4af4e (Mikhail Maltsev 2018-02-21 10:08:18 +0000 348) ToType->isRealFloatingType()) { +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 349) if (IgnoreFloatToIntegralConversion) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 350) return NK_Not_Narrowing; +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 351) const Expr *Initializer = IgnoreNarrowingConversion(Ctx, Converted); +f940987a4e21b (Simon Pilgrim 2017-06-01 18:13:02 +0000 352) assert(Initializer && "Unknown conversion expression"); +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 353) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 354) // If it's value-dependent, we can't tell whether it's narrowing. +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 355) if (Initializer->isValueDependent()) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 356) return NK_Dependent_Narrowing; +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 357) +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 358) if (Optional IntConstantValue = +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 359) Initializer->getIntegerConstantExpr(Ctx)) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 360) // Convert the integer to the floating type. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 361) llvm::APFloat Result(Ctx.getFloatTypeSemantics(ToType)); +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 362) Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(), +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 363) llvm::APFloat::rmNearestTiesToEven); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 364) // And back. +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 365) llvm::APSInt ConvertedValue = *IntConstantValue; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 366) bool ignored; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 367) Result.convertToInteger(ConvertedValue, +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 368) llvm::APFloat::rmTowardZero, &ignored); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 369) // If the resulting value is different, this was a narrowing conversion. +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 370) if (*IntConstantValue != ConvertedValue) { +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 371) ConstantValue = APValue(*IntConstantValue); +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 372) ConstantType = Initializer->getType(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 373) return NK_Constant_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 374) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 375) } else { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 376) // Variables are always narrowings. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 377) return NK_Variable_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 378) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 379) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 380) return NK_Not_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 381) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 382) // -- from long double to double or float, or from double to float, except +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 383) // where the source is a constant expression and the actual value after +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 384) // conversion is within the range of values that can be represented (even +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 385) // if it cannot be represented exactly), or +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 386) case ICK_Floating_Conversion: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 387) if (FromType->isRealFloatingType() && ToType->isRealFloatingType() && +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 388) Ctx.getFloatingTypeOrder(FromType, ToType) == 1) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 389) // FromType is larger than ToType. +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 390) const Expr *Initializer = IgnoreNarrowingConversion(Ctx, Converted); +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 391) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 392) // If it's value-dependent, we can't tell whether it's narrowing. +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 393) if (Initializer->isValueDependent()) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 394) return NK_Dependent_Narrowing; +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 395) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 396) if (Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 397) // Constant! +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 398) assert(ConstantValue.isFloat()); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 399) llvm::APFloat FloatVal = ConstantValue.getFloat(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 400) // Convert the source value into the target type. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 401) bool ignored; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 402) llvm::APFloat::opStatus ConvertStatus = FloatVal.convert( +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 403) Ctx.getFloatTypeSemantics(ToType), +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 404) llvm::APFloat::rmNearestTiesToEven, &ignored); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 405) // If there was no overflow, the source value is within the range of +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 406) // values that can be represented. +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 407) if (ConvertStatus & llvm::APFloat::opOverflow) { +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 408) ConstantType = Initializer->getType(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 409) return NK_Constant_Narrowing; +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 410) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 411) } else { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 412) return NK_Variable_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 413) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 414) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 415) return NK_Not_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 416) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 417) // -- from an integer type or unscoped enumeration type to an integer type +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 418) // that cannot represent all the values of the original type, except where +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 419) // the source is a constant expression and the actual value after +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 420) // conversion will fit into the target type and will produce the original +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 421) // value when converted back to the original type. +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 422) case ICK_Integral_Conversion: +64ecacf6cb4d6 (Richard Smith 2015-02-19 00:39:05 +0000 423) IntegralConversion: { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 424) assert(FromType->isIntegralOrUnscopedEnumerationType()); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 425) assert(ToType->isIntegralOrUnscopedEnumerationType()); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 426) const bool FromSigned = FromType->isSignedIntegerOrEnumerationType(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 427) const unsigned FromWidth = Ctx.getIntWidth(FromType); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 428) const bool ToSigned = ToType->isSignedIntegerOrEnumerationType(); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 429) const unsigned ToWidth = Ctx.getIntWidth(ToType); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 430) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 431) if (FromWidth > ToWidth || +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 432) (FromWidth == ToWidth && FromSigned != ToSigned) || +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 433) (FromSigned && !ToSigned)) { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 434) // Not all values of FromType can be represented in ToType. +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 435) const Expr *Initializer = IgnoreNarrowingConversion(Ctx, Converted); +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 436) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 437) // If it's value-dependent, we can't tell whether it's narrowing. +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 438) if (Initializer->isValueDependent()) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 439) return NK_Dependent_Narrowing; +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 440) +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 441) Optional OptInitializerValue; +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 442) if (!(OptInitializerValue = Initializer->getIntegerConstantExpr(Ctx))) { +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 443) // Such conversions on variables are always narrowing. +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 444) return NK_Variable_Narrowing; +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 445) } +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 446) llvm::APSInt &InitializerValue = *OptInitializerValue; +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 447) bool Narrowing = false; +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 448) if (FromWidth < ToWidth) { +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 449) // Negative -> unsigned is narrowing. Otherwise, more bits is never +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 450) // narrowing. +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 451) if (InitializerValue.isSigned() && InitializerValue.isNegative()) +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 452) Narrowing = true; +25a80d424bb29 (Richard Smith 2012-06-13 01:07:41 +0000 453) } else { +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 454) // Add a bit to the InitializerValue so we don't have to worry about +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 455) // signed vs. unsigned comparisons. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 456) InitializerValue = InitializerValue.extend( +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 457) InitializerValue.getBitWidth() + 1); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 458) // Convert the initializer to and from the target width and signed-ness. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 459) llvm::APSInt ConvertedValue = InitializerValue; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 460) ConvertedValue = ConvertedValue.trunc(ToWidth); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 461) ConvertedValue.setIsSigned(ToSigned); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 462) ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth()); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 463) ConvertedValue.setIsSigned(InitializerValue.isSigned()); +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 464) // If the result is different, this was a narrowing conversion. +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 465) if (ConvertedValue != InitializerValue) +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 466) Narrowing = true; +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 467) } +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 468) if (Narrowing) { +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 469) ConstantType = Initializer->getType(); +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 470) ConstantValue = APValue(InitializerValue); +72cd8ea5e5521 (Richard Smith 2012-06-19 21:28:35 +0000 471) return NK_Constant_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 472) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 473) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 474) return NK_Not_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 475) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 476) +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 477) default: +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 478) // Other kinds of conversions are not narrowings. +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 479) return NK_Not_Narrowing; +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 480) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 481) } +66e05fe63099d (Richard Smith 2012-01-18 05:21:49 +0000 482) +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 483) /// dump - Print this standard conversion sequence to standard +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 484) /// error. Useful for debugging overloading issues. +cdae941e0330d (Yaron Keren 2016-01-29 19:38:18 +0000 485) LLVM_DUMP_METHOD void StandardConversionSequence::dump() const { +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 486) raw_ostream &OS = llvm::errs(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 487) bool PrintedSomething = false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 488) if (First != ICK_Identity) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 489) OS << GetImplicitConversionName(First); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 490) PrintedSomething = true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 491) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 492) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 493) if (Second != ICK_Identity) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 494) if (PrintedSomething) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 495) OS << " -> "; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 496) } +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 497) OS << GetImplicitConversionName(Second); +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 498) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 499) if (CopyConstructor) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 500) OS << " (by copy constructor)"; +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 501) } else if (DirectBinding) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 502) OS << " (direct reference binding)"; +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 503) } else if (ReferenceBinding) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 504) OS << " (reference binding)"; +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 505) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 506) PrintedSomething = true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 507) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 508) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 509) if (Third != ICK_Identity) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 510) if (PrintedSomething) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 511) OS << " -> "; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 512) } +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 513) OS << GetImplicitConversionName(Third); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 514) PrintedSomething = true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 515) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 516) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 517) if (!PrintedSomething) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 518) OS << "No conversions required"; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 519) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 520) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 521) +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 522) /// dump - Print this user-defined conversion sequence to standard +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 523) /// error. Useful for debugging overloading issues. +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 524) void UserDefinedConversionSequence::dump() const { +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 525) raw_ostream &OS = llvm::errs(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 526) if (Before.First || Before.Second || Before.Third) { +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 527) Before.dump(); +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 528) OS << " -> "; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 529) } +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 530) if (ConversionFunction) +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 531) OS << '\'' << *ConversionFunction << '\''; +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 532) else +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 533) OS << "aggregate initialization"; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 534) if (After.First || After.Second || After.Third) { +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 535) OS << " -> "; +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 536) After.dump(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 537) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 538) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 539) +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 540) /// dump - Print this implicit conversion sequence to standard +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 541) /// error. Useful for debugging overloading issues. +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 542) void ImplicitConversionSequence::dump() const { +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 543) raw_ostream &OS = llvm::errs(); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 544) if (isInitializerListToType()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 545) OS << "Worst list element conversion: "; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 546) switch (ConversionKind) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 547) case StandardConversion: +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 548) OS << "Standard conversion: "; +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 549) Standard.dump(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 550) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 551) case UserDefinedConversion: +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 552) OS << "User-defined conversion: "; +9f2ed47133fa2 (Douglas Gregor 2013-11-08 02:16:10 +0000 553) UserDefined.dump(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 554) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 555) case EllipsisConversion: +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 556) OS << "Ellipsis conversion"; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 557) break; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 558) case AmbiguousConversion: +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 559) OS << "Ambiguous conversion"; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 560) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 561) case BadConversion: +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 562) OS << "Bad conversion"; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 563) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 564) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 565) +42e3df065e862 (Daniel Dunbar 2010-01-22 02:04:41 +0000 566) OS << "\n"; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 567) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 568) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 569) void AmbiguousConversionSequence::construct() { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 570) new (&conversions()) ConversionSet(); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 571) } +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 572) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 573) void AmbiguousConversionSequence::destruct() { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 574) conversions().~ConversionSet(); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 575) } +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 576) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 577) void +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 578) AmbiguousConversionSequence::copyFrom(const AmbiguousConversionSequence &O) { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 579) FromTypePtr = O.FromTypePtr; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 580) ToTypePtr = O.ToTypePtr; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 581) new (&conversions()) ConversionSet(O.conversions()); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 582) } +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 583) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 584) namespace { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 585) // Structure used by DeductionFailureInfo to store +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 586) // template argument information. +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 587) struct DFIArguments { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 588) TemplateArgument FirstArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 589) TemplateArgument SecondArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 590) }; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 591) // Structure used by DeductionFailureInfo to store +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 592) // template parameter and template argument information. +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 593) struct DFIParamWithArguments : DFIArguments { +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 594) TemplateParameter Param; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 595) }; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 596) // Structure used by DeductionFailureInfo to store template argument +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 597) // information and the index of the problematic call argument. +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 598) struct DFIDeducedMismatchArgs : DFIArguments { +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 599) TemplateArgumentList *TemplateArgs; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 600) unsigned CallArgIndex; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 601) }; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 602) // Structure used by DeductionFailureInfo to store information about +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 603) // unsatisfied constraints. +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 604) struct CNSInfo { +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 605) TemplateArgumentList *TemplateArgs; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 606) ConstraintSatisfaction Satisfaction; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 607) }; +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 608) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 609) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 610) /// Convert from Sema's representation of template deduction information +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 611) /// to the form used in overload-candidate information. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 612) DeductionFailureInfo +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 613) clang::MakeDeductionFailureInfo(ASTContext &Context, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 614) Sema::TemplateDeductionResult TDK, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 615) TemplateDeductionInfo &Info) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 616) DeductionFailureInfo Result; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 617) Result.Result = static_cast(TDK); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 618) Result.HasDiagnostic = false; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 619) switch (TDK) { +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 620) case Sema::TDK_Invalid: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 621) case Sema::TDK_InstantiationDepth: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 622) case Sema::TDK_TooManyArguments: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 623) case Sema::TDK_TooFewArguments: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 624) case Sema::TDK_MiscellaneousDeductionFailure: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 625) case Sema::TDK_CUDATargetMismatch: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 626) Result.Data = nullptr; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 627) break; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 628) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 629) case Sema::TDK_Incomplete: +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 630) case Sema::TDK_InvalidExplicitArguments: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 631) Result.Data = Info.Param.getOpaqueValue(); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 632) break; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 633) +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 634) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 635) case Sema::TDK_DeducedMismatchNested: { +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 636) // FIXME: Should allocate from normal heap so that we can free this later. +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 637) auto *Saved = new (Context) DFIDeducedMismatchArgs; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 638) Saved->FirstArg = Info.FirstArg; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 639) Saved->SecondArg = Info.SecondArg; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 640) Saved->TemplateArgs = Info.take(); +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 641) Saved->CallArgIndex = Info.CallArgIndex; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 642) Result.Data = Saved; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 643) break; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 644) } +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 645) +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 646) case Sema::TDK_NonDeducedMismatch: { +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 647) // FIXME: Should allocate from normal heap so that we can free this later. +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 648) DFIArguments *Saved = new (Context) DFIArguments; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 649) Saved->FirstArg = Info.FirstArg; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 650) Saved->SecondArg = Info.SecondArg; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 651) Result.Data = Saved; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 652) break; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 653) } +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 654) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 655) case Sema::TDK_IncompletePack: +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 656) // FIXME: It's slightly wasteful to allocate two TemplateArguments for this. +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 657) case Sema::TDK_Inconsistent: +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 658) case Sema::TDK_Underqualified: { +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 659) // FIXME: Should allocate from normal heap so that we can free this later. +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 660) DFIParamWithArguments *Saved = new (Context) DFIParamWithArguments; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 661) Saved->Param = Info.Param; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 662) Saved->FirstArg = Info.FirstArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 663) Saved->SecondArg = Info.SecondArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 664) Result.Data = Saved; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 665) break; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 666) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 667) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 668) case Sema::TDK_SubstitutionFailure: +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 669) Result.Data = Info.take(); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 670) if (Info.hasSFINAEDiagnostic()) { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 671) PartialDiagnosticAt *Diag = new (Result.Diagnostic) PartialDiagnosticAt( +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 672) SourceLocation(), PartialDiagnostic::NullDiagnostic()); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 673) Info.takeSFINAEDiagnostic(*Diag); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 674) Result.HasDiagnostic = true; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 675) } +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 676) break; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 677) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 678) case Sema::TDK_ConstraintsNotSatisfied: { +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 679) CNSInfo *Saved = new (Context) CNSInfo; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 680) Saved->TemplateArgs = Info.take(); +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 681) Saved->Satisfaction = Info.AssociatedConstraintsSatisfaction; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 682) Result.Data = Saved; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 683) break; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 684) } +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 685) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 686) case Sema::TDK_Success: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 687) case Sema::TDK_NonDependentConversionFailure: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 688) llvm_unreachable("not a deduction failure"); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 689) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 690) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 691) return Result; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 692) } +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 693) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 694) void DeductionFailureInfo::Destroy() { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 695) switch (static_cast(Result)) { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 696) case Sema::TDK_Success: +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 697) case Sema::TDK_Invalid: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 698) case Sema::TDK_InstantiationDepth: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 699) case Sema::TDK_Incomplete: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 700) case Sema::TDK_TooManyArguments: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 701) case Sema::TDK_TooFewArguments: +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 702) case Sema::TDK_InvalidExplicitArguments: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 703) case Sema::TDK_CUDATargetMismatch: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 704) case Sema::TDK_NonDependentConversionFailure: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 705) break; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 706) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 707) case Sema::TDK_IncompletePack: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 708) case Sema::TDK_Inconsistent: +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 709) case Sema::TDK_Underqualified: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 710) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 711) case Sema::TDK_DeducedMismatchNested: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 712) case Sema::TDK_NonDeducedMismatch: +b02d6b3b94de4 (Douglas Gregor 2010-05-08 20:20:05 +0000 713) // FIXME: Destroy the data? +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 714) Data = nullptr; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 715) break; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 716) +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 717) case Sema::TDK_SubstitutionFailure: +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 718) // FIXME: Destroy the template argument list? +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 719) Data = nullptr; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 720) if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 721) Diag->~PartialDiagnosticAt(); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 722) HasDiagnostic = false; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 723) } +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 724) break; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 725) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 726) case Sema::TDK_ConstraintsNotSatisfied: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 727) // FIXME: Destroy the template argument list? +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 728) Data = nullptr; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 729) if (PartialDiagnosticAt *Diag = getSFINAEDiagnostic()) { +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 730) Diag->~PartialDiagnosticAt(); +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 731) HasDiagnostic = false; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 732) } +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 733) break; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 734) +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 735) // Unhandled +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 736) case Sema::TDK_MiscellaneousDeductionFailure: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 737) break; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 738) } +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 739) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 740) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 741) PartialDiagnosticAt *DeductionFailureInfo::getSFINAEDiagnostic() { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 742) if (HasDiagnostic) +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 743) return static_cast(static_cast(Diagnostic)); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 744) return nullptr; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 745) } +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 746) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 747) TemplateParameter DeductionFailureInfo::getTemplateParameter() { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 748) switch (static_cast(Result)) { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 749) case Sema::TDK_Success: +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 750) case Sema::TDK_Invalid: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 751) case Sema::TDK_InstantiationDepth: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 752) case Sema::TDK_TooManyArguments: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 753) case Sema::TDK_TooFewArguments: +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 754) case Sema::TDK_SubstitutionFailure: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 755) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 756) case Sema::TDK_DeducedMismatchNested: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 757) case Sema::TDK_NonDeducedMismatch: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 758) case Sema::TDK_CUDATargetMismatch: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 759) case Sema::TDK_NonDependentConversionFailure: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 760) case Sema::TDK_ConstraintsNotSatisfied: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 761) return TemplateParameter(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 762) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 763) case Sema::TDK_Incomplete: +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 764) case Sema::TDK_InvalidExplicitArguments: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 765) return TemplateParameter::getFromOpaqueValue(Data); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 766) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 767) case Sema::TDK_IncompletePack: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 768) case Sema::TDK_Inconsistent: +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 769) case Sema::TDK_Underqualified: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 770) return static_cast(Data)->Param; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 771) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 772) // Unhandled +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 773) case Sema::TDK_MiscellaneousDeductionFailure: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 774) break; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 775) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 776) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 777) return TemplateParameter(); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 778) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 779) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 780) TemplateArgumentList *DeductionFailureInfo::getTemplateArgumentList() { +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 781) switch (static_cast(Result)) { +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 782) case Sema::TDK_Success: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 783) case Sema::TDK_Invalid: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 784) case Sema::TDK_InstantiationDepth: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 785) case Sema::TDK_TooManyArguments: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 786) case Sema::TDK_TooFewArguments: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 787) case Sema::TDK_Incomplete: +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 788) case Sema::TDK_IncompletePack: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 789) case Sema::TDK_InvalidExplicitArguments: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 790) case Sema::TDK_Inconsistent: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 791) case Sema::TDK_Underqualified: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 792) case Sema::TDK_NonDeducedMismatch: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 793) case Sema::TDK_CUDATargetMismatch: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 794) case Sema::TDK_NonDependentConversionFailure: +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 795) return nullptr; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 796) +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 797) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 798) case Sema::TDK_DeducedMismatchNested: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 799) return static_cast(Data)->TemplateArgs; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 800) +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 801) case Sema::TDK_SubstitutionFailure: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 802) return static_cast(Data); +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 803) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 804) case Sema::TDK_ConstraintsNotSatisfied: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 805) return static_cast(Data)->TemplateArgs; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 806) +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 807) // Unhandled +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 808) case Sema::TDK_MiscellaneousDeductionFailure: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 809) break; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 810) } +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 811) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 812) return nullptr; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 813) } +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 814) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 815) const TemplateArgument *DeductionFailureInfo::getFirstArg() { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 816) switch (static_cast(Result)) { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 817) case Sema::TDK_Success: +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 818) case Sema::TDK_Invalid: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 819) case Sema::TDK_InstantiationDepth: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 820) case Sema::TDK_Incomplete: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 821) case Sema::TDK_TooManyArguments: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 822) case Sema::TDK_TooFewArguments: +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 823) case Sema::TDK_InvalidExplicitArguments: +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 824) case Sema::TDK_SubstitutionFailure: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 825) case Sema::TDK_CUDATargetMismatch: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 826) case Sema::TDK_NonDependentConversionFailure: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 827) case Sema::TDK_ConstraintsNotSatisfied: +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 828) return nullptr; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 829) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 830) case Sema::TDK_IncompletePack: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 831) case Sema::TDK_Inconsistent: +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 832) case Sema::TDK_Underqualified: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 833) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 834) case Sema::TDK_DeducedMismatchNested: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 835) case Sema::TDK_NonDeducedMismatch: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 836) return &static_cast(Data)->FirstArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 837) +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 838) // Unhandled +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 839) case Sema::TDK_MiscellaneousDeductionFailure: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 840) break; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 841) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 842) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 843) return nullptr; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 844) } +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 845) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 846) const TemplateArgument *DeductionFailureInfo::getSecondArg() { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 847) switch (static_cast(Result)) { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 848) case Sema::TDK_Success: +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 849) case Sema::TDK_Invalid: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 850) case Sema::TDK_InstantiationDepth: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 851) case Sema::TDK_Incomplete: +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 852) case Sema::TDK_IncompletePack: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 853) case Sema::TDK_TooManyArguments: +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 854) case Sema::TDK_TooFewArguments: +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 855) case Sema::TDK_InvalidExplicitArguments: +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 856) case Sema::TDK_SubstitutionFailure: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 857) case Sema::TDK_CUDATargetMismatch: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 858) case Sema::TDK_NonDependentConversionFailure: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 859) case Sema::TDK_ConstraintsNotSatisfied: +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 860) return nullptr; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 861) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 862) case Sema::TDK_Inconsistent: +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 863) case Sema::TDK_Underqualified: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 864) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 865) case Sema::TDK_DeducedMismatchNested: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 866) case Sema::TDK_NonDeducedMismatch: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 867) return &static_cast(Data)->SecondArg; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 868) +461761d68f739 (Douglas Gregor 2010-05-08 18:20:53 +0000 869) // Unhandled +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 870) case Sema::TDK_MiscellaneousDeductionFailure: +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 871) break; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 872) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 873) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 874) return nullptr; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 875) } +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 876) +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 877) llvm::Optional DeductionFailureInfo::getCallArgIndex() { +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 878) switch (static_cast(Result)) { +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 879) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 880) case Sema::TDK_DeducedMismatchNested: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 881) return static_cast(Data)->CallArgIndex; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 882) +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 883) default: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 884) return llvm::None; +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 885) } +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 886) } +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 887) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 888) bool OverloadCandidateSet::OperatorRewriteInfo::shouldAddReversed( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 889) OverloadedOperatorKind Op) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 890) if (!AllowRewrittenCandidates) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 891) return false; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 892) return Op == OO_EqualEqual || Op == OO_Spaceship; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 893) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 894) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 895) bool OverloadCandidateSet::OperatorRewriteInfo::shouldAddReversed( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 896) ASTContext &Ctx, const FunctionDecl *FD) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 897) if (!shouldAddReversed(FD->getDeclName().getCXXOverloadedOperator())) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 898) return false; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 899) // Don't bother adding a reversed candidate that can never be a better +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 900) // match than the non-reversed version. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 901) return FD->getNumParams() != 2 || +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 902) !Ctx.hasSameUnqualifiedType(FD->getParamDecl(0)->getType(), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 903) FD->getParamDecl(1)->getType()) || +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 904) FD->hasAttr(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 905) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 906) +97e5949068f77 (Benjamin Kramer 2012-10-09 15:52:25 +0000 907) void OverloadCandidateSet::destroyCandidates() { +0bf93aa6b1429 (Richard Smith 2012-07-18 23:52:59 +0000 908) for (iterator i = begin(), e = end(); i != e; ++i) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 909) for (auto &C : i->Conversions) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 910) C.~ImplicitConversionSequence(); +0bf93aa6b1429 (Richard Smith 2012-07-18 23:52:59 +0000 911) if (!i->Viable && i->FailureKind == ovl_fail_bad_deduction) +0bf93aa6b1429 (Richard Smith 2012-07-18 23:52:59 +0000 912) i->DeductionFailure.Destroy(); +0bf93aa6b1429 (Richard Smith 2012-07-18 23:52:59 +0000 913) } +97e5949068f77 (Benjamin Kramer 2012-10-09 15:52:25 +0000 914) } +97e5949068f77 (Benjamin Kramer 2012-10-09 15:52:25 +0000 915) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 916) void OverloadCandidateSet::clear(CandidateSetKind CSK) { +97e5949068f77 (Benjamin Kramer 2012-10-09 15:52:25 +0000 917) destroyCandidates(); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 918) SlabAllocator.Reset(); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 919) NumInlineBytesUsed = 0; +fb761ff54452f (Benjamin Kramer 2012-01-14 16:31:55 +0000 920) Candidates.clear(); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 921) Functions.clear(); +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 922) Kind = CSK; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 923) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 924) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 925) namespace { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 926) class UnbridgedCastsSet { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 927) struct Entry { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 928) Expr **Addr; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 929) Expr *Saved; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 930) }; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 931) SmallVector Entries; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 932) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 933) public: +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 934) void save(Sema &S, Expr *&E) { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 935) assert(E->hasPlaceholderType(BuiltinType::ARCUnbridgedCast)); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 936) Entry entry = { &E, E }; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 937) Entries.push_back(entry); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 938) E = S.stripARCUnbridgedCast(E); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 939) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 940) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 941) void restore() { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 942) for (SmallVectorImpl::iterator +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 943) i = Entries.begin(), e = Entries.end(); i != e; ++i) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 944) *i->Addr = i->Saved; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 945) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 946) }; +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 947) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 948) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 949) /// checkPlaceholderForOverload - Do any interesting placeholder-like +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 950) /// preprocessing on the given expression. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 951) /// +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 952) /// \param unbridgedCasts a collection to which to add unbridged casts; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 953) /// without this, they will be immediately diagnosed as errors +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 954) /// +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 955) /// Return true on unrecoverable error. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 956) static bool +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 957) checkPlaceholderForOverload(Sema &S, Expr *&E, +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 958) UnbridgedCastsSet *unbridgedCasts = nullptr) { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 959) if (const BuiltinType *placeholder = E->getType()->getAsPlaceholderType()) { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 960) // We can't handle overloaded expressions here because overload +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 961) // resolution might reasonably tweak them. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 962) if (placeholder->getKind() == BuiltinType::Overload) return false; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 963) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 964) // If the context potentially accepts unbridged ARC casts, strip +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 965) // the unbridged cast and add it to the collection for later restoration. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 966) if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast && +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 967) unbridgedCasts) { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 968) unbridgedCasts->save(S, E); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 969) return false; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 970) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 971) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 972) // Go ahead and check everything else. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 973) ExprResult result = S.CheckPlaceholderExpr(E); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 974) if (result.isInvalid()) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 975) return true; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 976) +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 977) E = result.get(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 978) return false; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 979) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 980) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 981) // Nothing to do. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 982) return false; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 983) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 984) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 985) /// checkArgPlaceholdersForOverload - Check a set of call operands for +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 986) /// placeholders. +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 987) static bool checkArgPlaceholdersForOverload(Sema &S, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 988) MultiExprArg Args, +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 989) UnbridgedCastsSet &unbridged) { +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 990) for (unsigned i = 0, e = Args.size(); i != e; ++i) +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 991) if (checkPlaceholderForOverload(S, Args[i], &unbridged)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 992) return true; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 993) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 994) return false; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 995) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 996) +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 997) /// Determine whether the given New declaration is an overload of the +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 998) /// declarations in Old. This routine returns Ovl_Match or Ovl_NonFunction if +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 999) /// New and Old cannot be overloaded, e.g., if New has the same signature as +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1000) /// some function in Old (C++ 1.3.10) or if the Old declarations aren't +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1001) /// functions (or function templates) at all. When it does return Ovl_Match or +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1002) /// Ovl_NonFunction, MatchedDecl will point to the decl that New cannot be +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1003) /// overloaded with. This decl may be a UsingShadowDecl on top of the underlying +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1004) /// declaration. +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1005) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1006) /// Example: Given the following input: +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1007) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1008) /// void f(int, float); // #1 +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1009) /// void f(int, int); // #2 +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1010) /// int f(int, int); // #3 +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1011) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1012) /// When we process #1, there is no previous declaration of "f", so IsOverload +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1013) /// will not be used. +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1014) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1015) /// When we process #2, Old contains only the FunctionDecl for #1. By comparing +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1016) /// the parameter types, we see that #1 and #2 are overloaded (since they have +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1017) /// different signatures), so this routine returns Ovl_Overload; MatchedDecl is +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1018) /// unchanged. +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1019) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1020) /// When we process #3, Old is an overload set containing #1 and #2. We compare +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1021) /// the signatures of #3 to #1 (they're overloaded, so we do nothing) and then +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1022) /// #3 to #2. Since the signatures of #3 and #2 are identical (return types of +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1023) /// functions are not part of the signature), IsOverload returns Ovl_Match and +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1024) /// MatchedDecl will be set to point to the FunctionDecl for #2. +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1025) /// +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1026) /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a class +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1027) /// by a using declaration. The rules for whether to hide shadow declarations +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1028) /// ignore some properties which otherwise figure into a function template's +2d82b091d9660 (George Burgess IV 2017-04-06 00:23:31 +0000 1029) /// signature. +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1030) Sema::OverloadKind +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1031) Sema::CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &Old, +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1032) NamedDecl *&Match, bool NewIsUsingDecl) { +3d988d9042ffc (John McCall 2009-12-02 08:47:38 +0000 1033) for (LookupResult::iterator I = Old.begin(), E = Old.end(); +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1034) I != E; ++I) { +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1035) NamedDecl *OldD = *I; +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1036) +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1037) bool OldIsUsingDecl = false; +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1038) if (isa(OldD)) { +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1039) OldIsUsingDecl = true; +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1040) +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1041) // We can always introduce two using declarations into the same +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1042) // context, even if they have identical signatures. +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1043) if (NewIsUsingDecl) continue; +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1044) +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1045) OldD = cast(OldD)->getTargetDecl(); +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1046) } +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1047) +f091e129dbf75 (Richard Smith 2015-09-15 01:28:55 +0000 1048) // A using-declaration does not conflict with another declaration +f091e129dbf75 (Richard Smith 2015-09-15 01:28:55 +0000 1049) // if one of them is hidden. +f091e129dbf75 (Richard Smith 2015-09-15 01:28:55 +0000 1050) if ((OldIsUsingDecl || NewIsUsingDecl) && !isVisible(*I)) +f091e129dbf75 (Richard Smith 2015-09-15 01:28:55 +0000 1051) continue; +f091e129dbf75 (Richard Smith 2015-09-15 01:28:55 +0000 1052) +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1053) // If either declaration was introduced by a using declaration, +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1054) // we'll need to use slightly different rules for matching. +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1055) // Essentially, these rules are the normal rules, except that +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1056) // function templates hide function templates with different +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1057) // return types or template parameter lists. +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1058) bool UseMemberUsingDeclRules = +c70fca60dab47 (John McCall 2013-04-03 21:19:47 +0000 1059) (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() && +c70fca60dab47 (John McCall 2013-04-03 21:19:47 +0000 1060) !New->getFriendObjectKind(); +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1061) +a2794f9f36336 (Alp Toker 2014-01-22 07:29:52 +0000 1062) if (FunctionDecl *OldF = OldD->getAsFunction()) { +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1063) if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) { +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1064) if (UseMemberUsingDeclRules && OldIsUsingDecl) { +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1065) HideUsingShadowDecl(S, cast(*I)); +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1066) continue; +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1067) } +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1068) +a2794f9f36336 (Alp Toker 2014-01-22 07:29:52 +0000 1069) if (!isa(OldD) && +a2794f9f36336 (Alp Toker 2014-01-22 07:29:52 +0000 1070) !shouldLinkPossiblyHiddenDecl(*I, New)) +5bddd6a92a0e8 (Rafael Espindola 2013-04-15 12:49:13 +0000 1071) continue; +5bddd6a92a0e8 (Rafael Espindola 2013-04-15 12:49:13 +0000 1072) +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1073) Match = *I; +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1074) return Ovl_Match; +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1075) } +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1076) +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1077) // Builtins that have custom typechecking or have a reference should +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1078) // not be overloadable or redeclarable. +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1079) if (!getASTContext().canBuiltinBeRedeclared(OldF)) { +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1080) Match = *I; +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1081) return Ovl_NonFunction; +41af97137572a (Erich Keane 2018-04-16 21:30:08 +0000 1082) } +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 1083) } else if (isa(OldD) || isa(OldD)) { +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1084) // We can overload with these, which can show up when doing +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1085) // redeclaration checks for UsingDecls. +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1086) assert(Old.getLookupKind() == LookupUsingDeclName); +a8987a294da6d (John McCall 2010-11-10 03:01:53 +0000 1087) } else if (isa(OldD)) { +a8987a294da6d (John McCall 2010-11-10 03:01:53 +0000 1088) // We can always overload with tags by hiding them. +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1089) } else if (auto *UUD = dyn_cast(OldD)) { +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1090) // Optimistically assume that an unresolved using decl will +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1091) // overload; if it doesn't, we'll have to diagnose during +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1092) // template instantiation. +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1093) // +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1094) // Exception: if the scope is dependent and this is not a class +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1095) // member, the using declaration can only introduce an enumerator. +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1096) if (UUD->getQualifier()->isDependent() && !UUD->isCXXClassMember()) { +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1097) Match = *I; +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1098) return Ovl_NonFunction; +d8a9e375582fe (Richard Smith 2016-12-18 21:39:37 +0000 1099) } +84d8767c1582d (John McCall 2009-12-10 09:41:52 +0000 1100) } else { +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1101) // (C++ 13p1): +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1102) // Only function declarations can be overloaded; object and type +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1103) // declarations cannot be overloaded. +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1104) Match = *I; +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1105) return Ovl_NonFunction; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1106) } +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1107) } +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1108) +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1109) // C++ [temp.friend]p1: +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1110) // For a friend function declaration that is not a template declaration: +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1111) // -- if the name of the friend is a qualified or unqualified template-id, +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1112) // [...], otherwise +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1113) // -- if the name of the friend is a qualified-id and a matching +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1114) // non-template function is found in the specified class or namespace, +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1115) // the friend declaration refers to that function, otherwise, +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1116) // -- if the name of the friend is a qualified-id and a matching function +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1117) // template is found in the specified class or namespace, the friend +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1118) // declaration refers to the deduced specialization of that function +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1119) // template, otherwise +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1120) // -- the name shall be an unqualified-id [...] +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1121) // If we get here for a qualified friend declaration, we've just reached the +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1122) // third bullet. If the type of the friend is dependent, skip this lookup +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1123) // until instantiation. +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1124) if (New->getFriendObjectKind() && New->getQualifier() && +bac77806c5881 (Richard Smith 2019-05-02 00:49:05 +0000 1125) !New->getDescribedFunctionTemplate() && +64095fc07c737 (Richard Smith 2019-01-11 01:59:33 +0000 1126) !New->getDependentSpecializationInfo() && +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1127) !New->getType()->isDependentType()) { +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1128) LookupResult TemplateSpecResult(LookupResult::Temporary, Old); +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1129) TemplateSpecResult.addAllDecls(Old); +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1130) if (CheckFunctionTemplateSpecialization(New, nullptr, TemplateSpecResult, +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1131) /*QualifiedFriend*/true)) { +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1132) New->setInvalidDecl(); +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1133) return Ovl_Overload; +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1134) } +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1135) +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1136) Match = TemplateSpecResult.getAsSingle(); +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1137) return Ovl_Match; +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1138) } +8ce732b46f557 (Richard Smith 2019-01-07 06:00:46 +0000 1139) +daa3d6bb502a3 (John McCall 2009-12-09 03:35:25 +0000 1140) return Ovl_Overload; +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1141) } +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1142) +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1143) bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1144) bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1145) bool ConsiderRequiresClauses) { +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1146) // C++ [basic.start.main]p2: This function shall not be overloaded. +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1147) if (New->isMain()) +7cf35ef8f6a0e (Rafael Espindola 2013-01-12 01:47:40 +0000 1148) return false; +7cf35ef8f6a0e (Rafael Espindola 2013-01-12 01:47:40 +0000 1149) +c729b0b50669e (David Majnemer 2013-09-16 22:44:20 +0000 1150) // MSVCRT user defined entry points cannot be overloaded. +c729b0b50669e (David Majnemer 2013-09-16 22:44:20 +0000 1151) if (New->isMSVCRTEntryPoint()) +c729b0b50669e (David Majnemer 2013-09-16 22:44:20 +0000 1152) return false; +c729b0b50669e (David Majnemer 2013-09-16 22:44:20 +0000 1153) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1154) FunctionTemplateDecl *OldTemplate = Old->getDescribedFunctionTemplate(); +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1155) FunctionTemplateDecl *NewTemplate = New->getDescribedFunctionTemplate(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1156) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1157) // C++ [temp.fct]p2: +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1158) // A function template can be overloaded with other function templates +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1159) // and with normal (non-template) functions. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 1160) if ((OldTemplate == nullptr) != (NewTemplate == nullptr)) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1161) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1162) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1163) // Is the function New an overload of the function Old? +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1164) QualType OldQType = Context.getCanonicalType(Old->getType()); +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1165) QualType NewQType = Context.getCanonicalType(New->getType()); +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1166) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1167) // Compare the signatures (C++ 1.3.10) of the two functions to +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1168) // determine whether they are overloads. If we find any mismatch +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1169) // in the signature, they are overloads. +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1170) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1171) // If either of these functions is a K&R-style function (no +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1172) // prototype), then we consider them to have matching signatures. +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1173) if (isa(OldQType.getTypePtr()) || +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1174) isa(NewQType.getTypePtr())) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1175) return false; +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1176) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1177) const FunctionProtoType *OldType = cast(OldQType); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1178) const FunctionProtoType *NewType = cast(NewQType); +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1179) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1180) // The signature of a function includes the types of its +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1181) // parameters (C++ 1.3.10), which includes the presence or absence +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1182) // of the ellipsis; see C++ DR 357). +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1183) if (OldQType != NewQType && +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 1184) (OldType->getNumParams() != NewType->getNumParams() || +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1185) OldType->isVariadic() != NewType->isVariadic() || +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 1186) !FunctionParamTypesAreEqual(OldType, NewType))) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1187) return true; +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1188) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1189) // C++ [temp.over.link]p4: +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1190) // The signature of a function template consists of its function +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1191) // signature, its return type and its template parameter list. The names +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1192) // of the template parameters are significant only for establishing the +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1193) // relationship between the template parameters and the rest of the +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1194) // signature. +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1195) // +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1196) // We check the return type and template parameter lists for function +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1197) // templates first; the remaining checks follow. +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1198) // +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1199) // However, we don't consider either of these when deciding whether +e9cccd86da2fe (John McCall 2010-06-16 08:42:20 +0000 1200) // a member introduced by a shadow declaration is hidden. +39fd529935dff (Justin Lebar 2016-03-30 20:41:05 +0000 1201) if (!UseMemberUsingDeclRules && NewTemplate && +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1202) (!TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(), +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1203) OldTemplate->getTemplateParameters(), +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1204) false, TPL_TemplateMatch) || +4576a77b80964 (Richard Smith 2018-09-10 06:35:32 +0000 1205) !Context.hasSameType(Old->getDeclaredReturnType(), +4576a77b80964 (Richard Smith 2018-09-10 06:35:32 +0000 1206) New->getDeclaredReturnType()))) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1207) return true; +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1208) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1209) // If the function is a class member, its signature includes the +b2f8aa9556bf9 (Douglas Gregor 2011-01-26 17:47:49 +0000 1210) // cv-qualifiers (if any) and ref-qualifier (if any) on the function itself. +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1211) // +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1212) // As part of this, also check whether one of the member functions +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1213) // is static, in which case they are not overloads (C++ +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1214) // 13.1p2). While not part of the definition of the signature, +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1215) // this check is important to determine whether these functions +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1216) // can be overloaded. +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1217) CXXMethodDecl *OldMethod = dyn_cast(Old); +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1218) CXXMethodDecl *NewMethod = dyn_cast(New); +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1219) if (OldMethod && NewMethod && +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1220) !OldMethod->isStatic() && !NewMethod->isStatic()) { +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1221) if (OldMethod->getRefQualifier() != NewMethod->getRefQualifier()) { +39fd529935dff (Justin Lebar 2016-03-30 20:41:05 +0000 1222) if (!UseMemberUsingDeclRules && +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1223) (OldMethod->getRefQualifier() == RQ_None || +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1224) NewMethod->getRefQualifier() == RQ_None)) { +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1225) // C++0x [over.load]p2: +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1226) // - Member function declarations with the same name and the same +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1227) // parameter-type-list as well as member function template +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1228) // declarations with the same name, the same parameter-type-list, and +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1229) // the same template parameter lists cannot be overloaded if any of +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1230) // them, but not all, have a ref-qualifier (8.3.5). +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1231) Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload) +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1232) << NewMethod->getRefQualifier() << OldMethod->getRefQualifier(); +ac974a3c76fbe (Richard Smith 2013-06-30 09:48:50 +0000 1233) Diag(OldMethod->getLocation(), diag::note_previous_declaration); +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1234) } +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1235) return true; +c83f9865a0dae (Douglas Gregor 2011-01-26 21:20:37 +0000 1236) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1237) +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1238) // We may not have applied the implicit const for a constexpr member +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1239) // function yet (because we haven't yet resolved whether this is a static +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1240) // or non-static member function). Add it now, on the assumption that this +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1241) // is a redeclaration of OldMethod. +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 1242) auto OldQuals = OldMethod->getMethodQualifiers(); +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 1243) auto NewQuals = NewMethod->getMethodQualifiers(); +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 1244) if (!getLangOpts().CPlusPlus14 && NewMethod->isConstexpr() && +e83b1d3e7aa36 (Richard Smith 2013-06-25 18:46:26 +0000 1245) !isa(NewMethod)) +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 1246) NewQuals.addConst(); +42350dfcc82c0 (David Majnemer 2013-11-03 23:51:28 +0000 1247) // We do not allow overloading based off of '__restrict'. +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 1248) OldQuals.removeRestrict(); +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 1249) NewQuals.removeRestrict(); +42350dfcc82c0 (David Majnemer 2013-11-03 23:51:28 +0000 1250) if (OldQuals != NewQuals) +574f4f6a1d861 (Richard Smith 2013-01-14 05:37:29 +0000 1251) return true; +c83f9865a0dae (Douglas Gregor 2011-01-26 21:20:37 +0000 1252) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1253) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1254) // Though pass_object_size is placed on parameters and takes an argument, we +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1255) // consider it to be a function-level modifier for the sake of function +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1256) // identity. Either the function has one or more parameters with +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1257) // pass_object_size or it doesn't. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1258) if (functionHasPassObjectSizeParams(New) != +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1259) functionHasPassObjectSizeParams(Old)) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1260) return true; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1261) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1262) // enable_if attributes are an order-sensitive part of the signature. +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1263) for (specific_attr_iterator +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1264) NewI = New->specific_attr_begin(), +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1265) NewE = New->specific_attr_end(), +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1266) OldI = Old->specific_attr_begin(), +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1267) OldE = Old->specific_attr_end(); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1268) NewI != NewE || OldI != OldE; ++NewI, ++OldI) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1269) if (NewI == NewE || OldI == OldE) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1270) return true; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1271) llvm::FoldingSetNodeID NewID, OldID; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1272) NewI->getCond()->Profile(NewID, Context, true); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1273) OldI->getCond()->Profile(OldID, Context, true); +d950ae74a3619 (Nick Lewycky 2014-01-21 01:30:30 +0000 1274) if (NewID != OldID) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1275) return true; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1276) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 1277) +ba122ab42fe54 (Justin Lebar 2016-03-30 23:30:21 +0000 1278) if (getLangOpts().CUDA && ConsiderCudaAttrs) { +e060feb7b1a98 (Justin Lebar 2016-10-03 16:48:23 +0000 1279) // Don't allow overloading of destructors. (In theory we could, but it +e060feb7b1a98 (Justin Lebar 2016-10-03 16:48:23 +0000 1280) // would be a giant change to clang.) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1281) if (!isa(New)) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1282) CUDAFunctionTarget NewTarget = IdentifyCUDATarget(New), +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1283) OldTarget = IdentifyCUDATarget(Old); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1284) if (NewTarget != CFT_InvalidTarget) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1285) assert((OldTarget != CFT_InvalidTarget) && +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1286) "Unexpected invalid target."); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1287) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1288) // Allow overloading of functions with same signature and different CUDA +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1289) // target attributes. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1290) if (NewTarget != OldTarget) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1291) return true; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1292) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1293) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1294) } +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 1295) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1296) if (ConsiderRequiresClauses) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1297) Expr *NewRC = New->getTrailingRequiresClause(), +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1298) *OldRC = Old->getTrailingRequiresClause(); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1299) if ((NewRC != nullptr) != (OldRC != nullptr)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1300) // RC are most certainly different - these are overloads. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1301) return true; +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 1302) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1303) if (NewRC) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1304) llvm::FoldingSetNodeID NewID, OldID; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1305) NewRC->Profile(NewID, Context, /*Canonical=*/true); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1306) OldRC->Profile(OldID, Context, /*Canonical=*/true); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1307) if (NewID != OldID) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1308) // RCs are not equivalent - these are overloads. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1309) return true; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 1310) } +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 1311) } +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 1312) +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1313) // The signatures match; this is not an overload. +1f82f2462de79 (John McCall 2009-11-18 22:49:29 +0000 1314) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1315) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1316) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 1317) /// Tries a user-defined conversion from From to ToType. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1318) /// +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1319) /// Produces an implicit conversion sequence for when a standard conversion +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1320) /// is not an option. See TryImplicitConversion for more information. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1321) static ImplicitConversionSequence +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1322) TryUserDefinedConversion(Sema &S, Expr *From, QualType ToType, +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1323) bool SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 1324) AllowedExplicit AllowExplicit, +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1325) bool InOverloadResolution, +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1326) bool CStyle, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1327) bool AllowObjCWritebackConversion, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1328) bool AllowObjCConversionOnExplicit) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1329) ImplicitConversionSequence ICS; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1330) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1331) if (SuppressUserConversions) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1332) // We're not in the case above, so there is no conversion that +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1333) // we can perform. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1334) ICS.setBad(BadConversionSequence::no_conversion, From, ToType); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1335) return ICS; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1336) } +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1337) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1338) // Attempt user-defined conversion. +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 1339) OverloadCandidateSet Conversions(From->getExprLoc(), +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 1340) OverloadCandidateSet::CSK_Normal); +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1341) switch (IsUserDefinedConversion(S, From, ToType, ICS.UserDefined, +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1342) Conversions, AllowExplicit, +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1343) AllowObjCConversionOnExplicit)) { +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1344) case OR_Success: +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1345) case OR_Deleted: +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1346) ICS.setUserDefined(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1347) // C++ [over.ics.user]p4: +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1348) // A conversion of an expression of class type to the same class +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1349) // type is given Exact Match rank, and a conversion of an +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1350) // expression of class type to a base class of that type is +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1351) // given Conversion rank, in spite of the fact that a copy +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1352) // constructor (i.e., a user-defined conversion function) is +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1353) // called for those cases. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1354) if (CXXConstructorDecl *Constructor +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1355) = dyn_cast(ICS.UserDefined.ConversionFunction)) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1356) QualType FromCanon +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1357) = S.Context.getCanonicalType(From->getType().getUnqualifiedType()); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1358) QualType ToCanon +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1359) = S.Context.getCanonicalType(ToType).getUnqualifiedType(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1360) if (Constructor->isCopyConstructor() && +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 1361) (FromCanon == ToCanon || +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 1362) S.IsDerivedFrom(From->getBeginLoc(), FromCanon, ToCanon))) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1363) // Turn this into a "standard" conversion sequence, so that it +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1364) // gets ranked with standard conversion sequences. +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 1365) DeclAccessPair Found = ICS.UserDefined.FoundConversionFunction; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1366) ICS.setStandard(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1367) ICS.Standard.setAsIdentityConversion(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1368) ICS.Standard.setFromType(From->getType()); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1369) ICS.Standard.setAllToTypes(ToType); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1370) ICS.Standard.CopyConstructor = Constructor; +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 1371) ICS.Standard.FoundCopyConstructor = Found; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1372) if (ToCanon != FromCanon) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1373) ICS.Standard.Second = ICK_Derived_To_Base; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1374) } +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1375) } +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1376) break; +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1377) +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1378) case OR_Ambiguous: +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1379) ICS.setAmbiguous(); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1380) ICS.Ambiguous.setFromType(From->getType()); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1381) ICS.Ambiguous.setToType(ToType); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1382) for (OverloadCandidateSet::iterator Cand = Conversions.begin(); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1383) Cand != Conversions.end(); ++Cand) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 1384) if (Cand->Best) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 1385) ICS.Ambiguous.addConversion(Cand->FoundDecl, Cand->Function); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 1386) break; +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1387) +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1388) // Fall through. +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1389) case OR_No_Viable_Function: +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1390) ICS.setBad(BadConversionSequence::no_conversion, From, ToType); +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 1391) break; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1392) } +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1393) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1394) return ICS; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1395) } +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1396) +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 1397) /// TryImplicitConversion - Attempt to perform an implicit conversion +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 1398) /// from the given expression (Expr) to the given type (ToType). This +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 1399) /// function returns an implicit conversion sequence that can be used +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 1400) /// to perform the initialization. Given +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1401) /// +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1402) /// void f(float f); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1403) /// void g(int i) { f(i); } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1404) /// +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1405) /// this routine would produce an implicit conversion sequence to +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1406) /// describe the initialization of f from i, which will be a standard +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1407) /// conversion sequence containing an lvalue-to-rvalue conversion (C++ +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1408) /// 4.1) followed by a floating-integral conversion (C++ 4.9). +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1409) // +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1410) /// Note that this routine only determines how the conversion can be +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1411) /// performed; it does not actually perform the conversion. As such, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1412) /// it will not produce any diagnostics if no conversion is available, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1413) /// but will instead return an implicit conversion sequence of kind +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1414) /// "BadConversion". +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 1415) /// +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 1416) /// If @p SuppressUserConversions, then user-defined conversions are +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 1417) /// not permitted. +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 1418) /// If @p AllowExplicit, then explicit user-defined conversions are +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 1419) /// permitted. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1420) /// +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1421) /// \param AllowObjCWritebackConversion Whether we allow the Objective-C +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1422) /// writeback conversion, which allows __autoreleasing id* parameters to +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1423) /// be initialized with __strong id* or __weak id* arguments. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1424) static ImplicitConversionSequence +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1425) TryImplicitConversion(Sema &S, Expr *From, QualType ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1426) bool SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 1427) AllowedExplicit AllowExplicit, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 1428) bool InOverloadResolution, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1429) bool CStyle, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1430) bool AllowObjCWritebackConversion, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1431) bool AllowObjCConversionOnExplicit) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1432) ImplicitConversionSequence ICS; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1433) if (IsStandardConversion(S, From, ToType, InOverloadResolution, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1434) ICS.Standard, CStyle, AllowObjCWritebackConversion)){ +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 1435) ICS.setStandard(); +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1436) return ICS; +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1437) } +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1438) +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 1439) if (!S.getLangOpts().CPlusPlus) { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 1440) ICS.setBad(BadConversionSequence::no_conversion, From, ToType); +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1441) return ICS; +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1442) } +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 1443) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1444) // C++ [over.ics.user]p4: +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1445) // A conversion of an expression of class type to the same class +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1446) // type is given Exact Match rank, and a conversion of an +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1447) // expression of class type to a base class of that type is +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1448) // given Conversion rank, in spite of the fact that a copy/move +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1449) // constructor (i.e., a user-defined conversion function) is +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1450) // called for those cases. +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1451) QualType FromType = From->getType(); +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1452) if (ToType->getAs() && FromType->getAs() && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1453) (S.Context.hasSameUnqualifiedType(FromType, ToType) || +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 1454) S.IsDerivedFrom(From->getBeginLoc(), FromType, ToType))) { +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1455) ICS.setStandard(); +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1456) ICS.Standard.setAsIdentityConversion(); +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1457) ICS.Standard.setFromType(FromType); +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1458) ICS.Standard.setAllToTypes(ToType); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1459) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1460) // We don't actually check at this point whether there is a valid +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1461) // copy/move constructor, since overloading just assumes that it +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1462) // exists. When we actually perform initialization, we'll find the +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1463) // appropriate constructor to copy the returned object, if needed. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 1464) ICS.Standard.CopyConstructor = nullptr; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1465) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1466) // Determine whether this is considered a derived-to-base conversion. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1467) if (!S.Context.hasSameUnqualifiedType(FromType, ToType)) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 1468) ICS.Standard.Second = ICK_Derived_To_Base; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1469) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1470) return ICS; +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 1471) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1472) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1473) return TryUserDefinedConversion(S, From, ToType, SuppressUserConversions, +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 1474) AllowExplicit, InOverloadResolution, CStyle, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1475) AllowObjCWritebackConversion, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 1476) AllowObjCConversionOnExplicit); +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1477) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1478) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1479) ImplicitConversionSequence +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1480) Sema::TryImplicitConversion(Expr *From, QualType ToType, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1481) bool SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 1482) AllowedExplicit AllowExplicit, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1483) bool InOverloadResolution, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1484) bool CStyle, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1485) bool AllowObjCWritebackConversion) { +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 1486) return ::TryImplicitConversion(*this, From, ToType, SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 1487) AllowExplicit, InOverloadResolution, CStyle, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 1488) AllowObjCWritebackConversion, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 1489) /*AllowObjCConversionOnExplicit=*/false); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1490) } +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1491) +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1492) /// PerformImplicitConversion - Perform an implicit conversion of the +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 1493) /// expression From to the type ToType. Returns the +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1494) /// converted expression. Flavor is the kind of conversion we're +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1495) /// performing, used in the error message. If @p AllowExplicit, +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1496) /// explicit user-defined conversions are permitted. +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1497) ExprResult Sema::PerformImplicitConversion(Expr *From, QualType ToType, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1498) AssignmentAction Action, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1499) bool AllowExplicit) { +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 1500) if (checkPlaceholderForOverload(*this, From)) +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 1501) return ExprError(); +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 1502) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1503) // Objective-C ARC: Determine whether we will allow the writeback conversion. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1504) bool AllowObjCWritebackConversion +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1505) = getLangOpts().ObjCAutoRefCount && +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1506) (Action == AA_Passing || Action == AA_Sending); +fa98390b3c314 (Erik Pilkington 2018-10-30 20:31:30 +0000 1507) if (getLangOpts().ObjC) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 1508) CheckObjCBridgeRelatedConversions(From->getBeginLoc(), ToType, +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 1509) From->getType(), From); +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1510) ImplicitConversionSequence ICS = ::TryImplicitConversion( +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1511) *this, From, ToType, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1512) /*SuppressUserConversions=*/false, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1513) AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1514) /*InOverloadResolution=*/false, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1515) /*CStyle=*/false, AllowObjCWritebackConversion, +052dbe226cb35 (Richard Smith 2020-09-03 15:33:07 -0700 1516) /*AllowObjCConversionOnExplicit=*/false); +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1517) return PerformImplicitConversion(From, ToType, ICS, Action); +ae4b5df81751e (Douglas Gregor 2010-04-16 22:27:05 +0000 1518) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1519) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 1520) /// Determine whether the conversion from FromType to ToType is a valid +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1521) /// conversion that strips "noexcept" or "noreturn" off the nested function +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1522) /// type. +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1523) bool Sema::IsFunctionConversion(QualType FromType, QualType ToType, +53e61b05cedec (Chandler Carruth 2011-06-18 01:19:03 +0000 1524) QualType &ResultTy) { +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 1525) if (Context.hasSameUnqualifiedType(FromType, ToType)) +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 1526) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1527) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1528) // Permit the conversion F(t __attribute__((noreturn))) -> F(t) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1529) // or F(t noexcept) -> F(t) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1530) // where F adds one of the following at most once: +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1531) // - a pointer +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1532) // - a member pointer +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1533) // - a block pointer +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1534) // Changes here need matching changes in FindCompositePointerType. +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1535) CanQualType CanTo = Context.getCanonicalType(ToType); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1536) CanQualType CanFrom = Context.getCanonicalType(FromType); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1537) Type::TypeClass TyClass = CanTo->getTypeClass(); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1538) if (TyClass != CanFrom->getTypeClass()) return false; +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1539) if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) { +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1540) if (TyClass == Type::Pointer) { +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1541) CanTo = CanTo.castAs()->getPointeeType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1542) CanFrom = CanFrom.castAs()->getPointeeType(); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1543) } else if (TyClass == Type::BlockPointer) { +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1544) CanTo = CanTo.castAs()->getPointeeType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1545) CanFrom = CanFrom.castAs()->getPointeeType(); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1546) } else if (TyClass == Type::MemberPointer) { +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1547) auto ToMPT = CanTo.castAs(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 1548) auto FromMPT = CanFrom.castAs(); +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1549) // A function pointer conversion cannot change the class of the function. +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1550) if (ToMPT->getClass() != FromMPT->getClass()) +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1551) return false; +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1552) CanTo = ToMPT->getPointeeType(); +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1553) CanFrom = FromMPT->getPointeeType(); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1554) } else { +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1555) return false; +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1556) } +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1557) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1558) TyClass = CanTo->getTypeClass(); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1559) if (TyClass != CanFrom->getTypeClass()) return false; +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1560) if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1561) return false; +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1562) } +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1563) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1564) const auto *FromFn = cast(CanFrom); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1565) FunctionType::ExtInfo FromEInfo = FromFn->getExtInfo(); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1566) +6f42740707bb0 (Richard Smith 2016-10-20 00:01:36 +0000 1567) const auto *ToFn = cast(CanTo); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1568) FunctionType::ExtInfo ToEInfo = ToFn->getExtInfo(); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1569) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1570) bool Changed = false; +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1571) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1572) // Drop 'noreturn' if not present in target type. +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1573) if (FromEInfo.getNoReturn() && !ToEInfo.getNoReturn()) { +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1574) FromFn = Context.adjustFunctionType(FromFn, FromEInfo.withNoReturn(false)); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1575) Changed = true; +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1576) } +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1577) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1578) // Drop 'noexcept' if not present in target type. +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1579) if (const auto *FromFPT = dyn_cast(FromFn)) { +6f42740707bb0 (Richard Smith 2016-10-20 00:01:36 +0000 1580) const auto *ToFPT = cast(ToFn); +eaf11ad709046 (Richard Smith 2018-05-03 03:58:32 +0000 1581) if (FromFPT->isNothrow() && !ToFPT->isNothrow()) { +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1582) FromFn = cast( +8c85bca5a5db8 (Stephan Bergmann 2018-01-05 07:57:12 +0000 1583) Context.getFunctionTypeWithExceptionSpec(QualType(FromFPT, 0), +8c85bca5a5db8 (Stephan Bergmann 2018-01-05 07:57:12 +0000 1584) EST_None) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1585) .getTypePtr()); +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1586) Changed = true; +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1587) } +55ebd6cc26422 (Artem Belevich 2018-04-03 18:29:31 +0000 1588) +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1589) // Convert FromFPT's ExtParameterInfo if necessary. The conversion is valid +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1590) // only if the ExtParameterInfo lists of the two function prototypes can be +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1591) // merged and the merged list is identical to ToFPT's ExtParameterInfo list. +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1592) SmallVector NewParamInfos; +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1593) bool CanUseToFPT, CanUseFromFPT; +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1594) if (Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT, +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1595) CanUseFromFPT, NewParamInfos) && +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1596) CanUseToFPT && !CanUseFromFPT) { +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1597) FunctionProtoType::ExtProtoInfo ExtInfo = FromFPT->getExtProtoInfo(); +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1598) ExtInfo.ExtParameterInfos = +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1599) NewParamInfos.empty() ? nullptr : NewParamInfos.data(); +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1600) QualType QT = Context.getFunctionType(FromFPT->getReturnType(), +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1601) FromFPT->getParamTypes(), ExtInfo); +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1602) FromFn = QT->getAs(); +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1603) Changed = true; +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 1604) } +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1605) } +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1606) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1607) if (!Changed) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1608) return false; +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1609) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1610) assert(QualType(FromFn, 0).isCanonical()); +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1611) if (QualType(FromFn, 0) != CanTo) return false; +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 1612) +991eb4b3191ae (John McCall 2010-12-21 00:44:39 +0000 1613) ResultTy = ToType; +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 1614) return true; +40cb9ad391af6 (Douglas Gregor 2009-12-09 00:47:37 +0000 1615) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1616) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 1617) /// Determine whether the conversion from FromType to ToType is a valid +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1618) /// vector conversion. +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1619) /// +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1620) /// \param ICK Will be set to the vector conversion kind, if this is a vector +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1621) /// conversion. +9b595db16d614 (John McCall 2014-02-04 23:58:19 +0000 1622) static bool IsVectorConversion(Sema &S, QualType FromType, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1623) QualType ToType, ImplicitConversionKind &ICK) { +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1624) // We need at least one of these types to be a vector type to have a vector +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1625) // conversion. +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1626) if (!ToType->isVectorType() && !FromType->isVectorType()) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1627) return false; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1628) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1629) // Identical types require no conversions. +9b595db16d614 (John McCall 2014-02-04 23:58:19 +0000 1630) if (S.Context.hasSameUnqualifiedType(FromType, ToType)) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1631) return false; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1632) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1633) // There are no conversions between extended vector types, only identity. +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1634) if (ToType->isExtVectorType()) { +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1635) // There are no conversions between extended vector types other than the +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1636) // identity conversion. +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1637) if (FromType->isExtVectorType()) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1638) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1639) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1640) // Vector splat from any arithmetic type to a vector. +a3208f9e7c5d9 (Douglas Gregor 2010-06-22 23:41:02 +0000 1641) if (FromType->isArithmeticType()) { +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1642) ICK = ICK_Vector_Splat; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1643) return true; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1644) } +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1645) } +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1646) +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1647) if (ToType->isSizelessBuiltinType() || FromType->isSizelessBuiltinType()) +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1648) if (S.Context.areCompatibleSveTypes(FromType, ToType) || +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1649) S.Context.areLaxCompatibleSveTypes(FromType, ToType)) { +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1650) ICK = ICK_SVE_Vector_Conversion; +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1651) return true; +23a96b84a8d98 (Joe Ellis 2020-11-17 14:34:31 +0000 1652) } +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 1653) +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1654) // We can perform the conversion between vector types in the following cases: +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1655) // 1)vector types are equivalent AltiVec and GCC vector types +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1656) // 2)lax vector conversions are permitted and the vector types are of the +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1657) // same size +ada01d1b86976 (Simon Tatham 2020-01-15 14:07:04 +0000 1658) // 3)the destination type does not have the ARM MVE strict-polymorphism +ada01d1b86976 (Simon Tatham 2020-01-15 14:07:04 +0000 1659) // attribute, which inhibits lax vector conversion for overload resolution +ada01d1b86976 (Simon Tatham 2020-01-15 14:07:04 +0000 1660) // only +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1661) if (ToType->isVectorType() && FromType->isVectorType()) { +9b595db16d614 (John McCall 2014-02-04 23:58:19 +0000 1662) if (S.Context.areCompatibleVectorTypes(FromType, ToType) || +ada01d1b86976 (Simon Tatham 2020-01-15 14:07:04 +0000 1663) (S.isLaxVectorConversion(FromType, ToType) && +ada01d1b86976 (Simon Tatham 2020-01-15 14:07:04 +0000 1664) !ToType->hasAttr(attr::ArmMveStrictPolymorphism))) { +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1665) ICK = ICK_Vector_Conversion; +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1666) return true; +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1667) } +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1668) } +59e8b3bd7bf2c (Douglas Gregor 2010-08-06 10:14:59 +0000 1669) +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1670) return false; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1671) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1672) +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1673) static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1674) bool InOverloadResolution, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1675) StandardConversionSequence &SCS, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1676) bool CStyle); +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1677) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1678) /// IsStandardConversion - Determines whether there is a standard +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1679) /// conversion sequence (C++ [conv], C++ [over.ics.scs]) from the +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1680) /// expression From to the type ToType. Standard conversion sequences +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1681) /// only consider non-class types; for conversions that involve class +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1682) /// types, use TryImplicitConversion. If a conversion exists, SCS will +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1683) /// contain the standard conversion sequence required to perform this +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1684) /// conversion and this routine will return true. Otherwise, this +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1685) /// routine will return false and the value of SCS is unspecified. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1686) static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1687) bool InOverloadResolution, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 1688) StandardConversionSequence &SCS, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1689) bool CStyle, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1690) bool AllowObjCWritebackConversion) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1691) QualType FromType = From->getType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1692) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1693) // Standard conversions (C++ [conv]) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 1694) SCS.setAsIdentityConversion(); +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 1695) SCS.IncompatibleObjC = false; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 1696) SCS.setFromType(FromType); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 1697) SCS.CopyConstructor = nullptr; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1698) +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1699) // There are no standard conversions for class types in C++, so +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1700) // abort early. When overloading in C, however, we do permit them. +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1701) if (S.getLangOpts().CPlusPlus && +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1702) (FromType->isRecordType() || ToType->isRecordType())) +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1703) return false; +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1704) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1705) // The first conversion can be an lvalue-to-rvalue conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1706) // array-to-pointer conversion, or function-to-pointer conversion +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1707) // (C++ 4p1). +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1708) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1709) if (FromType == S.Context.OverloadTy) { +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1710) DeclAccessPair AccessPair; +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1711) if (FunctionDecl *Fn +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1712) = S.ResolveAddressOfOverloadedFunction(From, ToType, false, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1713) AccessPair)) { +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1714) // We were able to resolve the address of the overloaded function, +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1715) // so we can convert to the type of that function. +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1716) FromType = Fn->getType(); +c3ad3bab61919 (Ehsan Akhgari 2014-07-22 20:20:14 +0000 1717) SCS.setFromType(FromType); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1718) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1719) // we can sometimes resolve &foo regardless of ToType, so check +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1720) // if the type matches (identity) or we are converting to bool +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1721) if (!S.Context.hasSameUnqualifiedType( +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1722) S.ExtractUnqualifiedFunctionType(ToType), FromType)) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1723) QualType resultTy; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1724) // if the function type matches except for [[noreturn]], it's ok +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 1725) if (!S.IsFunctionConversion(FromType, +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 1726) S.ExtractUnqualifiedFunctionType(ToType), resultTy)) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1727) // otherwise, only a boolean conversion is standard +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1728) if (!ToType->isBooleanType()) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1729) return false; +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1730) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1731) +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1732) // Check if the "from" expression is taking the address of an overloaded +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1733) // function and recompute the FromType accordingly. Take advantage of the +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1734) // fact that non-static member functions *must* have such an address-of +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1735) // expression. +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1736) CXXMethodDecl *Method = dyn_cast(Fn); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1737) if (Method && !Method->isStatic()) { +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1738) assert(isa(From->IgnoreParens()) && +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1739) "Non-unary operator on non-static member address"); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1740) assert(cast(From->IgnoreParens())->getOpcode() +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1741) == UO_AddrOf && +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1742) "Non-address-of operator on non-static member address"); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1743) const Type *ClassType +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1744) = S.Context.getTypeDeclType(Method->getParent()).getTypePtr(); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1745) FromType = S.Context.getMemberPointerType(FromType, ClassType); +7750f7694c26a (Chandler Carruth 2011-03-29 18:38:10 +0000 1746) } else if (isa(From->IgnoreParens())) { +7750f7694c26a (Chandler Carruth 2011-03-29 18:38:10 +0000 1747) assert(cast(From->IgnoreParens())->getOpcode() == +7750f7694c26a (Chandler Carruth 2011-03-29 18:38:10 +0000 1748) UO_AddrOf && +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1749) "Non-address-of operator for overloaded function expression"); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1750) FromType = S.Context.getPointerType(FromType); +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1751) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1752) +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1753) // Check that we've computed the proper type after overload resolution. +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 1754) // FIXME: FixOverloadedFunctionReference has side-effects; we shouldn't +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 1755) // be calling it from within an NDEBUG block. +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1756) assert(S.Context.hasSameType( +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1757) FromType, +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 1758) S.FixOverloadedFunctionReference(From, AccessPair, Fn)->getType())); +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1759) } else { +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1760) return false; +980fb16f9a05f (Douglas Gregor 2010-04-29 18:24:40 +0000 1761) } +ba37e1eb49c41 (Anders Carlsson 2010-11-04 05:28:09 +0000 1762) } +154a2fd3cb187 (John McCall 2011-08-30 00:57:29 +0000 1763) // Lvalue-to-rvalue conversion (C++11 4.1): +154a2fd3cb187 (John McCall 2011-08-30 00:57:29 +0000 1764) // A glvalue (3.10) of a non-function, non-array type T can +154a2fd3cb187 (John McCall 2011-08-30 00:57:29 +0000 1765) // be converted to a prvalue. +154a2fd3cb187 (John McCall 2011-08-30 00:57:29 +0000 1766) bool argIsLValue = From->isGLValue(); +086a464e24de0 (John McCall 2010-11-24 05:12:34 +0000 1767) if (argIsLValue && +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 1768) !FromType->isFunctionType() && !FromType->isArrayType() && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1769) S.Context.getCanonicalType(FromType) != S.Context.OverloadTy) { +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1770) SCS.First = ICK_Lvalue_To_Rvalue; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1771) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1772) // C11 6.3.2.1p2: +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 1773) // ... if the lvalue has atomic type, the value has the non-atomic version +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1774) // of the type of the lvalue ... +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1775) if (const AtomicType *Atomic = FromType->getAs()) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1776) FromType = Atomic->getValueType(); +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1777) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1778) // If T is a non-class type, the type of the rvalue is the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1779) // cv-unqualified version of T. Otherwise, the type of the rvalue +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1780) // is T (C++ 4.1p1). C++ can't get here with class types; in C, we +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1781) // just strip the qualifiers because they don't matter. +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1782) FromType = FromType.getUnqualifiedType(); +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1783) } else if (FromType->isArrayType()) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1784) // Array-to-pointer conversion (C++ 4.2) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1785) SCS.First = ICK_Array_To_Pointer; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1786) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1787) // An lvalue or rvalue of type "array of N T" or "array of unknown +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1788) // bound of T" can be converted to an rvalue of type "pointer to +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1789) // T" (C++ 4.2p1). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1790) FromType = S.Context.getArrayDecayedType(FromType); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1791) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1792) if (S.IsStringLiteralToNonConstPointerConversion(From, ToType)) { +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 1793) // This conversion is deprecated in C++03 (D.4) +e489a7d3d3972 (Douglas Gregor 2010-02-28 18:30:25 +0000 1794) SCS.DeprecatedStringLiteralToCharPtr = true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1795) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1796) // For the purpose of ranking in overload resolution +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1797) // (13.3.3.1.1), this conversion is considered an +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1798) // array-to-pointer conversion followed by a qualification +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1799) // conversion (4.4). (C++ 4.2p2) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1800) SCS.Second = ICK_Identity; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1801) SCS.Third = ICK_Qualification; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1802) SCS.QualificationIncludesObjCLifetime = false; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 1803) SCS.setAllToTypes(FromType); +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1804) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1805) } +086a464e24de0 (John McCall 2010-11-24 05:12:34 +0000 1806) } else if (FromType->isFunctionType() && argIsLValue) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1807) // Function-to-pointer conversion (C++ 4.3). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1808) SCS.First = ICK_Function_To_Pointer; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1809) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1810) if (auto *DRE = dyn_cast(From->IgnoreParenCasts())) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1811) if (auto *FD = dyn_cast(DRE->getDecl())) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1812) if (!S.checkAddressOfFunctionIsAvailable(FD)) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1813) return false; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 1814) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1815) // An lvalue of function type T can be converted to an rvalue of +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1816) // type "pointer to T." The result is a pointer to the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1817) // function. (C++ 4.3p1). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1818) FromType = S.Context.getPointerType(FromType); +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1819) } else { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1820) // We don't require any conversions for the first step. +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1821) SCS.First = ICK_Identity; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1822) } +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 1823) SCS.setToType(0, FromType); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1824) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1825) // The second conversion can be an integral promotion, floating +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1826) // point promotion, integral conversion, floating point conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1827) // floating-integral conversion, pointer conversion, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1828) // pointer-to-member conversion, or boolean conversion (C++ 4p1). +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1829) // For overloading in C, this can also be a "compatible-type" +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1830) // conversion. +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 1831) bool IncompatibleObjC = false; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1832) ImplicitConversionKind SecondICK = ICK_Identity; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1833) if (S.Context.hasSameUnqualifiedType(FromType, ToType)) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1834) // The unqualified versions of the types are the same: there's no +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1835) // conversion to do. +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1836) SCS.Second = ICK_Identity; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1837) } else if (S.IsIntegralPromotion(From, FromType, ToType)) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 1838) // Integral promotion (C++ 4.5). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1839) SCS.Second = ICK_Integral_Promotion; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1840) FromType = ToType.getUnqualifiedType(); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1841) } else if (S.IsFloatingPointPromotion(FromType, ToType)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1842) // Floating point promotion (C++ 4.6). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1843) SCS.Second = ICK_Floating_Promotion; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1844) FromType = ToType.getUnqualifiedType(); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1845) } else if (S.IsComplexPromotion(FromType, ToType)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1846) // Complex promotion (Clang extension) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 1847) SCS.Second = ICK_Complex_Promotion; +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 1848) FromType = ToType.getUnqualifiedType(); +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1849) } else if (ToType->isBooleanType() && +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1850) (FromType->isArithmeticType() || +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1851) FromType->isAnyPointerType() || +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1852) FromType->isBlockPointerType() || +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 1853) FromType->isMemberPointerType())) { +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1854) // Boolean conversions (C++ 4.12). +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1855) SCS.Second = ICK_Boolean_Conversion; +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1856) FromType = S.Context.BoolTy; +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 1857) } else if (FromType->isIntegralOrUnscopedEnumerationType() && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1858) ToType->isIntegralType(S.Context)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1859) // Integral conversions (C++ 4.7). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1860) SCS.Second = ICK_Integral_Conversion; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1861) FromType = ToType.getUnqualifiedType(); +b8a98241fce39 (Richard Smith 2013-05-10 20:29:50 +0000 1862) } else if (FromType->isAnyComplexType() && ToType->isAnyComplexType()) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1863) // Complex conversions (C99 6.3.1.6) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 1864) SCS.Second = ICK_Complex_Conversion; +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 1865) FromType = ToType.getUnqualifiedType(); +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1866) } else if ((FromType->isAnyComplexType() && ToType->isArithmeticType()) || +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1867) (ToType->isAnyComplexType() && FromType->isArithmeticType())) { +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1868) // Complex-real conversions (C99 6.3.1.7) +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1869) SCS.Second = ICK_Complex_Real; +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1870) FromType = ToType.getUnqualifiedType(); +49b4d73451955 (Douglas Gregor 2010-06-22 23:07:26 +0000 1871) } else if (FromType->isRealFloatingType() && ToType->isRealFloatingType()) { +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1872) // FIXME: disable conversions between long double and __float128 if +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1873) // their representation is different until there is back end support +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1874) // We of course allow this conversion if long double is really double. +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1875) +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1876) // Conversions between bfloat and other floats are not permitted. +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1877) if (FromType == S.Context.BFloat16Ty || ToType == S.Context.BFloat16Ty) +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1878) return false; +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1879) if (&S.Context.getFloatTypeSemantics(FromType) != +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1880) &S.Context.getFloatTypeSemantics(ToType)) { +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1881) bool Float128AndLongDouble = ((FromType == S.Context.Float128Ty && +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1882) ToType == S.Context.LongDoubleTy) || +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1883) (FromType == S.Context.LongDoubleTy && +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1884) ToType == S.Context.Float128Ty)); +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1885) if (Float128AndLongDouble && +980579504ae2d (Benjamin Kramer 2018-01-17 22:56:57 +0000 1886) (&S.Context.getFloatTypeSemantics(S.Context.LongDoubleTy) == +980579504ae2d (Benjamin Kramer 2018-01-17 22:56:57 +0000 1887) &llvm::APFloat::PPCDoubleDouble())) +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1888) return false; +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 1889) } +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1890) // Floating point conversions (C++ 4.8). +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1891) SCS.Second = ICK_Floating_Conversion; +8fa1e7eec4d0a (Chandler Carruth 2010-02-25 07:20:54 +0000 1892) FromType = ToType.getUnqualifiedType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1893) } else if ((FromType->isRealFloatingType() && +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 1894) ToType->isIntegralType(S.Context)) || +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 1895) (FromType->isIntegralOrUnscopedEnumerationType() && +49b4d73451955 (Douglas Gregor 2010-06-22 23:07:26 +0000 1896) ToType->isRealFloatingType())) { +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1897) // Conversions between bfloat and int are not permitted. +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1898) if (FromType->isBFloat16Type() || ToType->isBFloat16Type()) +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1899) return false; +ecd682bbf5e69 (Ties Stuij 2020-06-05 00:20:02 +0100 1900) +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1901) // Floating-integral conversions (C++ 4.9). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1902) SCS.Second = ICK_Floating_Integral; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1903) FromType = ToType.getUnqualifiedType(); +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 1904) } else if (S.IsBlockPointerConversion(FromType, ToType, FromType)) { +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1905) SCS.Second = ICK_Block_Pointer_Conversion; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1906) } else if (AllowObjCWritebackConversion && +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1907) S.isObjCWritebackConversion(FromType, ToType, FromType)) { +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1908) SCS.Second = ICK_Writeback_Conversion; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1909) } else if (S.IsPointerConversion(From, FromType, ToType, InOverloadResolution, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1910) FromType, IncompatibleObjC)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1911) // Pointer conversions (C++ 4.10). +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1912) SCS.Second = ICK_Pointer_Conversion; +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 1913) SCS.IncompatibleObjC = IncompatibleObjC; +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 1914) FromType = FromType.getUnqualifiedType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 1915) } else if (S.IsMemberPointerConversion(From, FromType, ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1916) InOverloadResolution, FromType)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1917) // Pointer to member conversions (4.11). +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 1918) SCS.Second = ICK_Pointer_Member; +9b595db16d614 (John McCall 2014-02-04 23:58:19 +0000 1919) } else if (IsVectorConversion(S, FromType, ToType, SecondICK)) { +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1920) SCS.Second = SecondICK; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1921) FromType = ToType.getUnqualifiedType(); +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 1922) } else if (!S.getLangOpts().CPlusPlus && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 1923) S.Context.typesAreCompatible(ToType, FromType)) { +12b8ce168d4e3 (Mike Stump 2009-08-04 21:02:39 +0000 1924) // Compatible conversions (Clang extension for C function overloading) +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 1925) SCS.Second = ICK_Compatible_Conversion; +4618868a7d0de (Douglas Gregor 2010-05-18 22:42:18 +0000 1926) FromType = ToType.getUnqualifiedType(); +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 1927) } else if (IsTransparentUnionStandardConversion(S, From, ToType, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 1928) InOverloadResolution, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 1929) SCS, CStyle)) { +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 1930) SCS.Second = ICK_TransparentUnionConversion; +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 1931) FromType = ToType; +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1932) } else if (tryAtomicConversion(S, From, ToType, InOverloadResolution, SCS, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1933) CStyle)) { +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 1934) // tryAtomicConversion has updated the standard conversion sequence +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1935) // appropriately. +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 1936) return true; +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1937) } else if (ToType->isEventT() && +259f9f4531e5c (Guy Benyei 2013-02-07 16:05:33 +0000 1938) From->isIntegerConstantExpr(S.getASTContext()) && +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1939) From->EvaluateKnownConstInt(S.getASTContext()) == 0) { +259f9f4531e5c (Guy Benyei 2013-02-07 16:05:33 +0000 1940) SCS.Second = ICK_Zero_Event_Conversion; +259f9f4531e5c (Guy Benyei 2013-02-07 16:05:33 +0000 1941) FromType = ToType; +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 1942) } else if (ToType->isQueueT() && +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 1943) From->isIntegerConstantExpr(S.getASTContext()) && +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 1944) (From->EvaluateKnownConstInt(S.getASTContext()) == 0)) { +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 1945) SCS.Second = ICK_Zero_Queue_Conversion; +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 1946) FromType = ToType; +8ece3b6719948 (Neil Hickey 2019-07-16 14:57:32 +0000 1947) } else if (ToType->isSamplerT() && +8ece3b6719948 (Neil Hickey 2019-07-16 14:57:32 +0000 1948) From->isIntegerConstantExpr(S.getASTContext())) { +8ece3b6719948 (Neil Hickey 2019-07-16 14:57:32 +0000 1949) SCS.Second = ICK_Compatible_Conversion; +8ece3b6719948 (Neil Hickey 2019-07-16 14:57:32 +0000 1950) FromType = ToType; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1951) } else { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1952) // No second conversion required. +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1953) SCS.Second = ICK_Identity; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1954) } +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 1955) SCS.setToType(1, FromType); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1956) +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1957) // The third conversion can be a function pointer conversion or a +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1958) // qualification conversion (C++ [conv.fctptr], [conv.qual]). +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1959) bool ObjCLifetimeConversion; +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1960) if (S.IsFunctionConversion(FromType, ToType, FromType)) { +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1961) // Function pointer conversions (removing 'noexcept') including removal of +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1962) // 'noreturn' (Clang extension). +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1963) SCS.Third = ICK_Function_Conversion; +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1964) } else if (S.IsQualificationConversion(FromType, ToType, CStyle, +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1965) ObjCLifetimeConversion)) { +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1966) SCS.Third = ICK_Qualification; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 1967) SCS.QualificationIncludesObjCLifetime = ObjCLifetimeConversion; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1968) FromType = ToType; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1969) } else { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1970) // No conversion required +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1971) SCS.Third = ICK_Identity; +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1972) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 1973) +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1974) // C++ [over.best.ics]p6: +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1975) // [...] Any difference in top-level cv-qualification is +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1976) // subsumed by the initialization itself and does not constitute +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1977) // a conversion. [...] +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1978) QualType CanonFrom = S.Context.getCanonicalType(FromType); +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1979) QualType CanonTo = S.Context.getCanonicalType(ToType); +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1980) if (CanonFrom.getLocalUnqualifiedType() +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1981) == CanonTo.getLocalUnqualifiedType() && +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1982) CanonFrom.getLocalQualifiers() != CanonTo.getLocalQualifiers()) { +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1983) FromType = ToType; +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1984) CanonFrom = CanonTo; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1985) } +eb7ef2e1cae45 (Richard Smith 2016-10-20 21:53:09 +0000 1986) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 1987) SCS.setToType(2, FromType); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1988) +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1989) if (CanonFrom == CanonTo) +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1990) return true; +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1991) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 1992) // If we have not converted the argument type to the parameter type, +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1993) // this is a bad conversion sequence, unless we're resolving an overload in C. +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1994) if (S.getLangOpts().CPlusPlus || !InOverloadResolution) +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1995) return false; +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1996) +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 1997) ExprResult ER = ExprResult{From}; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 1998) Sema::AssignConvertType Conv = +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 1999) S.CheckSingleAssignmentConstraints(ToType, ER, +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2000) /*Diagnose=*/false, +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2001) /*DiagnoseCFAudited=*/false, +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2002) /*ConvertRHS=*/false); +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2003) ImplicitConversionKind SecondConv; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2004) switch (Conv) { +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2005) case Sema::Compatible: +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2006) SecondConv = ICK_C_Only_Conversion; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2007) break; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2008) // For our purposes, discarding qualifiers is just as bad as using an +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2009) // incompatible pointer. Note that an IncompatiblePointer conversion can drop +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2010) // qualifiers, as well. +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2011) case Sema::CompatiblePointerDiscardsQualifiers: +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2012) case Sema::IncompatiblePointer: +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2013) case Sema::IncompatiblePointerSign: +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2014) SecondConv = ICK_Incompatible_Pointer_Conversion; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2015) break; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2016) default: +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 2017) return false; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2018) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2019) +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2020) // First can only be an lvalue conversion, so we pretend that this was the +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2021) // second conversion. First should already be valid from earlier in the +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2022) // function. +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2023) SCS.Second = SecondConv; +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2024) SCS.setToType(1, ToType); +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2025) +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2026) // Third is Identity, because Second should rank us worse than any other +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2027) // conversion. This could also be ICK_Qualification, but it's simpler to just +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2028) // lump everything in with the second conversion, and we don't gain anything +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2029) // from making this ICK_Qualification. +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2030) SCS.Third = ICK_Identity; +6098fd1989f6b (George Burgess IV 2016-09-03 00:28:25 +0000 2031) SCS.setToType(2, ToType); +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 2032) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2033) } +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 2034) +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2035) static bool +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2036) IsTransparentUnionStandardConversion(Sema &S, Expr* From, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2037) QualType &ToType, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2038) bool InOverloadResolution, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2039) StandardConversionSequence &SCS, +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2040) bool CStyle) { +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2041) +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2042) const RecordType *UT = ToType->getAsUnionType(); +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2043) if (!UT || !UT->getDecl()->hasAttr()) +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2044) return false; +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2045) // The field to initialize within the transparent union. +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2046) RecordDecl *UD = UT->getDecl(); +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2047) // It's compatible if the expression matches any of the fields. +e8a8baef44c4d (Aaron Ballman 2014-03-08 20:12:42 +0000 2048) for (const auto *it : UD->fields()) { +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2049) if (IsStandardConversion(S, From, it->getType(), InOverloadResolution, SCS, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 2050) CStyle, /*AllowObjCWritebackConversion=*/false)) { +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2051) ToType = it->getType(); +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2052) return true; +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2053) } +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2054) } +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2055) return false; +16f92ce539d49 (Fariborz Jahanian 2011-03-23 19:50:54 +0000 2056) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2057) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2058) /// IsIntegralPromotion - Determines whether the conversion from the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2059) /// expression From (whose potentially-adjusted type is FromType) to +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2060) /// ToType is an integral promotion (C++ 4.5). If so, returns true and +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2061) /// sets PromotedType to the promoted type. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2062) bool Sema::IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType) { +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2063) const BuiltinType *To = ToType->getAs(); +ee54797234ec4 (Sebastian Redl 2008-11-04 15:59:10 +0000 2064) // All integers are built-in. +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2065) if (!To) { +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2066) return false; +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2067) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2068) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2069) // An rvalue of type char, signed char, unsigned char, short int, or +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2070) // unsigned short int can be converted to an rvalue of type int if +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2071) // int can represent all the values of the source type; otherwise, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2072) // the source rvalue can be converted to an rvalue of type unsigned +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2073) // int (C++ 4.5p1). +a71cc1536167f (Douglas Gregor 2010-02-02 20:10:50 +0000 2074) if (FromType->isPromotableIntegerType() && !FromType->isBooleanType() && +a71cc1536167f (Douglas Gregor 2010-02-02 20:10:50 +0000 2075) !FromType->isEnumeralType()) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2076) if (// We can promote any signed, promotable integer type to an int +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2077) (FromType->isSignedIntegerType() || +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2078) // We can promote any unsigned integer type whose size is +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2079) // less than int to an int. +5ff6747e04021 (Benjamin Kramer 2016-04-11 08:26:13 +0000 2080) Context.getTypeSize(FromType) < Context.getTypeSize(ToType))) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2081) return To->getKind() == BuiltinType::Int; +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2082) } +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2083) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2084) return To->getKind() == BuiltinType::UInt; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2085) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2086) +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2087) // C++11 [conv.prom]p3: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2088) // A prvalue of an unscoped enumeration type whose underlying type is not +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2089) // fixed (7.2) can be converted to an rvalue a prvalue of the first of the +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2090) // following types that can represent all the values of the enumeration +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2091) // (i.e., the values in the range bmin to bmax as described in 7.2): int, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2092) // unsigned int, long int, unsigned long int, long long int, or unsigned +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2093) // long long int. If none of the types in that list can represent all the +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2094) // values of the enumeration, an rvalue a prvalue of an unscoped enumeration +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2095) // type can be converted to an rvalue a prvalue of the extended integer type +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2096) // with lowest integer conversion rank (4.13) greater than the rank of long +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2097) // long in which all the values of the enumeration can be represented. If +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2098) // there are two such extended types, the signed one is chosen. +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2099) // C++11 [conv.prom]p4: +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2100) // A prvalue of an unscoped enumeration type whose underlying type is fixed +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2101) // can be converted to a prvalue of its underlying type. Moreover, if +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2102) // integral promotion can be applied to its underlying type, a prvalue of an +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2103) // unscoped enumeration type whose underlying type is fixed can also be +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2104) // converted to a prvalue of the promoted underlying type. +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2105) if (const EnumType *FromEnumType = FromType->getAs()) { +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2106) // C++0x 7.2p9: Note that this implicit enum to int conversion is not +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2107) // provided for a scoped enumeration. +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2108) if (FromEnumType->getDecl()->isScoped()) +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2109) return false; +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2110) +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2111) // We can perform an integral promotion to the underlying type of the enum, +ac8c17533f5dd (Richard Smith 2015-03-28 00:31:40 +0000 2112) // even if that's not the promoted type. Note that the check for promoting +ac8c17533f5dd (Richard Smith 2015-03-28 00:31:40 +0000 2113) // the underlying type is based on the type alone, and does not consider +ac8c17533f5dd (Richard Smith 2015-03-28 00:31:40 +0000 2114) // the bitfield-ness of the actual source expression. +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2115) if (FromEnumType->getDecl()->isFixed()) { +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2116) QualType Underlying = FromEnumType->getDecl()->getIntegerType(); +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2117) return Context.hasSameUnqualifiedType(Underlying, ToType) || +ac8c17533f5dd (Richard Smith 2015-03-28 00:31:40 +0000 2118) IsIntegralPromotion(nullptr, Underlying, ToType); +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2119) } +b9c5a60045681 (Richard Smith 2012-09-13 21:18:54 +0000 2120) +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2121) // We have already pre-calculated the promotion type, so this is trivial. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2122) if (ToType->isIntegerType() && +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 2123) isCompleteType(From->getBeginLoc(), FromType)) +88f4bba21e9ea (Richard Smith 2015-03-26 00:16:07 +0000 2124) return Context.hasSameUnqualifiedType( +88f4bba21e9ea (Richard Smith 2015-03-26 00:16:07 +0000 2125) ToType, FromEnumType->getDecl()->getPromotionType()); +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2126) +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2127) // C++ [conv.prom]p5: +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2128) // If the bit-field has an enumerated type, it is treated as any other +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2129) // value of that type for promotion purposes. +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2130) // +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2131) // ... so do not fall through into the bit-field checks below in C++. +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2132) if (getLangOpts().CPlusPlus) +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2133) return false; +0bf3140424a0a (Douglas Gregor 2010-10-08 23:50:27 +0000 2134) } +5677499fbffe3 (John McCall 2009-12-09 09:09:27 +0000 2135) +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2136) // C++0x [conv.prom]p2: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2137) // A prvalue of type char16_t, char32_t, or wchar_t (3.9.1) can be converted +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2138) // to an rvalue a prvalue of the first of the following types that can +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2139) // represent all the values of its underlying type: int, unsigned int, +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2140) // long int, unsigned long int, long long int, or unsigned long long int. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2141) // If none of the types in that list can represent all the values of its +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2142) // underlying type, an rvalue a prvalue of type char16_t, char32_t, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2143) // or wchar_t can be converted to an rvalue a prvalue of its underlying +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2144) // type. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2145) if (FromType->isAnyCharacterType() && !FromType->isCharType() && +cd1d0b4f98805 (Douglas Gregor 2010-10-21 18:04:08 +0000 2146) ToType->isIntegerType()) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2147) // Determine whether the type we're converting from is signed or +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2148) // unsigned. +fa01a583e7106 (David Majnemer 2011-07-22 21:09:04 +0000 2149) bool FromIsSigned = FromType->isSignedIntegerType(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2150) uint64_t FromSize = Context.getTypeSize(FromType); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2151) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2152) // The types we'll try to promote to, in the appropriate +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2153) // order. Try each of these types. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2154) QualType PromoteTypes[6] = { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2155) Context.IntTy, Context.UnsignedIntTy, +1d248c53ab1c5 (Douglas Gregor 2008-12-12 02:00:36 +0000 2156) Context.LongTy, Context.UnsignedLongTy , +1d248c53ab1c5 (Douglas Gregor 2008-12-12 02:00:36 +0000 2157) Context.LongLongTy, Context.UnsignedLongLongTy +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2158) }; +1d248c53ab1c5 (Douglas Gregor 2008-12-12 02:00:36 +0000 2159) for (int Idx = 0; Idx < 6; ++Idx) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2160) uint64_t ToSize = Context.getTypeSize(PromoteTypes[Idx]); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2161) if (FromSize < ToSize || +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2162) (FromSize == ToSize && +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2163) FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2164) // We found the type that we can promote to. If this is the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2165) // type we wanted, we have a promotion. Otherwise, no +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2166) // promotion. +1b8fe5b716b8b (Douglas Gregor 2009-11-16 21:35:15 +0000 2167) return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2168) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2169) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2170) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2171) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2172) // An rvalue for an integral bit-field (9.6) can be converted to an +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2173) // rvalue of type int if int can represent all the values of the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2174) // bit-field; otherwise, it can be converted to unsigned int if +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2175) // unsigned int can represent all the values of the bit-field. If +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2176) // the bit-field is larger yet, no integral promotion applies to +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2177) // it. If the bit-field has an enumerated type, it is treated as any +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2178) // other value of that type for promotion purposes (C++ 4.5p3). +87c57acfb760e (Mike Stump 2009-05-16 07:39:55 +0000 2179) // FIXME: We should delay checking of bit-fields until we actually perform the +87c57acfb760e (Mike Stump 2009-05-16 07:39:55 +0000 2180) // conversion. +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2181) // +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2182) // FIXME: In C, only bit-fields of types _Bool, int, or unsigned int may be +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2183) // promoted, per C11 6.3.1.1/2. We promote all bit-fields (including enum +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2184) // bit-fields and those whose underlying type is larger than int) for GCC +aadb254a79558 (Richard Smith 2018-06-28 21:17:55 +0000 2185) // compatibility. +88f4bba21e9ea (Richard Smith 2015-03-26 00:16:07 +0000 2186) if (From) { +d25db7ed0f8ec (John McCall 2013-05-06 21:39:12 +0000 2187) if (FieldDecl *MemberDecl = From->getSourceBitField()) { +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2188) Optional BitWidth; +6972a62c8feda (Douglas Gregor 2010-06-16 00:35:25 +0000 2189) if (FromType->isIntegralType(Context) && +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2190) (BitWidth = +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2191) MemberDecl->getBitWidth()->getIntegerConstantExpr(Context))) { +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2192) llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned()); +71235ecb7fa32 (Douglas Gregor 2009-05-02 02:18:30 +0000 2193) ToSize = Context.getTypeSize(ToType); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2194) +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2195) // Are we promoting to an int from a bitfield that fits in an int? +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2196) if (*BitWidth < ToSize || +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2197) (FromType->isSignedIntegerType() && *BitWidth <= ToSize)) { +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2198) return To->getKind() == BuiltinType::Int; +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2199) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2200) +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2201) // Are we promoting to an unsigned int from an unsigned bitfield +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2202) // that fits into an unsigned int? +36036aa70ec1d (David Blaikie 2020-07-12 20:31:08 -0700 2203) if (FromType->isUnsignedIntegerType() && *BitWidth <= ToSize) { +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2204) return To->getKind() == BuiltinType::UInt; +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2205) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2206) +2eedc3aa1ce4a (Douglas Gregor 2008-12-20 23:49:58 +0000 2207) return false; +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2208) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2209) } +88f4bba21e9ea (Richard Smith 2015-03-26 00:16:07 +0000 2210) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2211) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2212) // An rvalue of type bool can be converted to an rvalue of type int, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2213) // with false becoming zero and true becoming one (C++ 4.5p4). +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2214) if (FromType->isBooleanType() && To->getKind() == BuiltinType::Int) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2215) return true; +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2216) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2217) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2218) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2219) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2220) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2221) /// IsFloatingPointPromotion - Determines whether the conversion from +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2222) /// FromType to ToType is a floating point promotion (C++ 4.6). If so, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2223) /// returns true and sets PromotedType to the promoted type. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2224) bool Sema::IsFloatingPointPromotion(QualType FromType, QualType ToType) { +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2225) if (const BuiltinType *FromBuiltin = FromType->getAs()) +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2226) if (const BuiltinType *ToBuiltin = ToType->getAs()) { +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2227) /// An rvalue of type float can be converted to an rvalue of type +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2228) /// double. (C++ 4.6p1). +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2229) if (FromBuiltin->getKind() == BuiltinType::Float && +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2230) ToBuiltin->getKind() == BuiltinType::Double) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2231) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2232) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2233) // C99 6.3.1.5p1: +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2234) // When a float is promoted to double or long double, or a +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2235) // double is promoted to long double [...]. +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 2236) if (!getLangOpts().CPlusPlus && +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2237) (FromBuiltin->getKind() == BuiltinType::Float || +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2238) FromBuiltin->getKind() == BuiltinType::Double) && +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 2239) (ToBuiltin->getKind() == BuiltinType::LongDouble || +bb1ea2d6139a7 (Nemanja Ivanovic 2016-05-09 08:52:33 +0000 2240) ToBuiltin->getKind() == BuiltinType::Float128)) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2241) return true; +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2242) +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2243) // Half can be promoted to float. +dd7f4566b1a8b (Joey Gouly 2013-01-23 11:56:20 +0000 2244) if (!getLangOpts().NativeHalfType && +dd7f4566b1a8b (Joey Gouly 2013-01-23 11:56:20 +0000 2245) FromBuiltin->getKind() == BuiltinType::Half && +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2246) ToBuiltin->getKind() == BuiltinType::Float) +f0c267e6e05c2 (Anton Korobeynikov 2011-10-14 23:23:15 +0000 2247) return true; +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2248) } +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2249) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2250) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2251) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2252) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 2253) /// Determine if a conversion is a complex promotion. +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2254) /// +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2255) /// A complex promotion is defined as a complex -> complex conversion +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2256) /// where the conversion between the underlying real types is a +6752502b81367 (Douglas Gregor 2009-02-12 00:26:06 +0000 2257) /// floating-point or integral promotion. +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2258) bool Sema::IsComplexPromotion(QualType FromType, QualType ToType) { +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2259) const ComplexType *FromComplex = FromType->getAs(); +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2260) if (!FromComplex) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2261) return false; +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2262) +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2263) const ComplexType *ToComplex = ToType->getAs(); +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2264) if (!ToComplex) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2265) return false; +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2266) +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2267) return IsFloatingPointPromotion(FromComplex->getElementType(), +6752502b81367 (Douglas Gregor 2009-02-12 00:26:06 +0000 2268) ToComplex->getElementType()) || +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 2269) IsIntegralPromotion(nullptr, FromComplex->getElementType(), +6752502b81367 (Douglas Gregor 2009-02-12 00:26:06 +0000 2270) ToComplex->getElementType()); +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2271) } +78ca74d81d935 (Douglas Gregor 2009-02-12 00:15:05 +0000 2272) +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2273) /// BuildSimilarlyQualifiedPointerType - In a pointer conversion from +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2274) /// the pointer type FromPtr to a pointer to type ToPointee, with the +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2275) /// same type qualifiers as FromPtr has on its pointee type. ToType, +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2276) /// if non-empty, will be a pointer to ToType that may or may not have +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2277) /// the right set of qualifiers on its pointee. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2278) /// +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2279) static QualType +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2280) BuildSimilarlyQualifiedPointerType(const Type *FromPtr, +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2281) QualType ToPointee, QualType ToType, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2282) ASTContext &Context, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2283) bool StripObjCLifetime = false) { +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2284) assert((FromPtr->getTypeClass() == Type::Pointer || +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2285) FromPtr->getTypeClass() == Type::ObjCObjectPointer) && +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2286) "Invalid similarly-qualified pointer type"); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2287) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2288) /// Conversions to 'id' subsume cv-qualifier conversions. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2289) if (ToType->isObjCIdType() || ToType->isObjCQualifiedIdType()) +c6bd1d32bf20b (Douglas Gregor 2010-12-06 22:09:19 +0000 2290) return ToType.getUnqualifiedType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2291) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2292) QualType CanonFromPointee +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2293) = Context.getCanonicalType(FromPtr->getPointeeType()); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2294) QualType CanonToPointee = Context.getCanonicalType(ToPointee); +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 2295) Qualifiers Quals = CanonFromPointee.getQualifiers(); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2296) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2297) if (StripObjCLifetime) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2298) Quals.removeObjCLifetime(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2299) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2300) // Exact qualifier match -> return the pointer type we're converting to. +1b8fe5b716b8b (Douglas Gregor 2009-11-16 21:35:15 +0000 2301) if (CanonToPointee.getLocalQualifiers() == Quals) { +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2302) // ToType is exactly what we need. Return it. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 2303) if (!ToType.isNull()) +b9f907bafc77c (Douglas Gregor 2010-05-25 15:31:05 +0000 2304) return ToType.getUnqualifiedType(); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2305) +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2306) // Build a pointer to ToPointee. It has the right qualifiers +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2307) // already. +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2308) if (isa(ToType)) +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2309) return Context.getObjCObjectPointerType(ToPointee); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2310) return Context.getPointerType(ToPointee); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2311) } +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2312) +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2313) // Just build a canonical type that has the right qualifiers. +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2314) QualType QualifiedCanonToPointee +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2315) = Context.getQualifiedType(CanonToPointee.getLocalUnqualifiedType(), Quals); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2316) +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2317) if (isa(ToType)) +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2318) return Context.getObjCObjectPointerType(QualifiedCanonToPointee); +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2319) return Context.getPointerType(QualifiedCanonToPointee); +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2320) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2321) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2322) static bool isNullPointerConstantForConversion(Expr *Expr, +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2323) bool InOverloadResolution, +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2324) ASTContext &Context) { +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2325) // Handle value-dependent integral null pointer constants correctly. +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2326) // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903 +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2327) if (Expr->isValueDependent() && !Expr->isTypeDependent() && +b90df60b3b0f7 (Douglas Gregor 2010-06-16 00:17:44 +0000 2328) Expr->getType()->isIntegerType() && !Expr->getType()->isEnumeralType()) +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2329) return !InOverloadResolution; +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2330) +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 2331) return Expr->isNullPointerConstant(Context, +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 2332) InOverloadResolution? Expr::NPC_ValueDependentIsNotNull +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 2333) : Expr::NPC_ValueDependentIsNull); +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2334) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2335) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2336) /// IsPointerConversion - Determines whether the conversion of the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2337) /// expression From, which has the (possibly adjusted) type FromType, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2338) /// can be converted to the type ToType via a pointer conversion (C++ +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2339) /// 4.10). If so, returns true and places the converted type (that +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2340) /// might differ from ToType in its cv-qualifiers at some level) into +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2341) /// ConvertedType. +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2342) /// +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2343) /// This routine also supports conversions to and from block pointers +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2344) /// and conversions with Objective-C's 'id', 'id', and +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2345) /// pointers to interfaces. FIXME: Once we've determined the +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2346) /// appropriate overloading rules for Objective-C, we may want to +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2347) /// split the Objective-C checks into a different routine; however, +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 2348) /// GCC seems to consider all of these conversions to be pointer +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2349) /// conversions, so for now they live here. IncompatibleObjC will be +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2350) /// set if the conversion is an allowed Objective-C conversion that +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2351) /// should result in a warning. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2352) bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType, +228eea36a3598 (Anders Carlsson 2009-08-28 15:33:32 +0000 2353) bool InOverloadResolution, +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2354) QualType& ConvertedType, +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2355) bool &IncompatibleObjC) { +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2356) IncompatibleObjC = false; +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2357) if (isObjCPointerConversion(FromType, ToType, ConvertedType, +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2358) IncompatibleObjC)) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2359) return true; +47d3f2742a3b6 (Douglas Gregor 2008-12-19 17:40:08 +0000 2360) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2361) // Conversion from a null pointer constant to any Objective-C pointer type. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2362) if (ToType->isObjCObjectPointerType() && +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2363) isNullPointerConstantForConversion(From, InOverloadResolution, Context)) { +79a6b01802bdb (Douglas Gregor 2008-12-22 20:51:52 +0000 2364) ConvertedType = ToType; +79a6b01802bdb (Douglas Gregor 2008-12-22 20:51:52 +0000 2365) return true; +79a6b01802bdb (Douglas Gregor 2008-12-22 20:51:52 +0000 2366) } +79a6b01802bdb (Douglas Gregor 2008-12-22 20:51:52 +0000 2367) +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2368) // Blocks: Block pointers can be converted to void*. +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2369) if (FromType->isBlockPointerType() && ToType->isPointerType() && +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 2370) ToType->castAs()->getPointeeType()->isVoidType()) { +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2371) ConvertedType = ToType; +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2372) return true; +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2373) } +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2374) // Blocks: A null pointer constant can be converted to a block +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2375) // pointer type. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2376) if (ToType->isBlockPointerType() && +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2377) isNullPointerConstantForConversion(From, InOverloadResolution, Context)) { +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2378) ConvertedType = ToType; +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2379) return true; +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2380) } +231d1c6f8f4e4 (Douglas Gregor 2008-11-27 00:15:41 +0000 2381) +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2382) // If the left-hand-side is nullptr_t, the right side can be a null +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2383) // pointer constant. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2384) if (ToType->isNullPtrType() && +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2385) isNullPointerConstantForConversion(From, InOverloadResolution, Context)) { +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2386) ConvertedType = ToType; +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2387) return true; +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2388) } +576fd424dfe20 (Sebastian Redl 2009-05-10 18:38:11 +0000 2389) +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 2390) const PointerType* ToTypePtr = ToType->getAs(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2391) if (!ToTypePtr) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2392) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2393) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2394) // A null pointer constant can be converted to a pointer type (C++ 4.10p1). +759b78951e44e (Anders Carlsson 2009-08-28 15:55:56 +0000 2395) if (isNullPointerConstantForConversion(From, InOverloadResolution, Context)) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2396) ConvertedType = ToType; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2397) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2398) } +72b8aef613170 (Sebastian Redl 2008-10-31 14:43:28 +0000 2399) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2400) // Beyond this point, both types need to be pointers +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2401) // , including objective-c pointers. +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2402) QualType ToPointeeType = ToTypePtr->getPointeeType(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2403) if (FromType->isObjCObjectPointerType() && ToPointeeType->isVoidType() && +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 2404) !getLangOpts().ObjCAutoRefCount) { +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2405) ConvertedType = BuildSimilarlyQualifiedPointerType( +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2406) FromType->getAs(), +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2407) ToPointeeType, +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2408) ToType, Context); +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2409) return true; +01cbe441b31f3 (Fariborz Jahanian 2009-12-16 23:13:33 +0000 2410) } +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 2411) const PointerType *FromTypePtr = FromType->getAs(); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2412) if (!FromTypePtr) +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2413) return false; +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2414) +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2415) QualType FromPointeeType = FromTypePtr->getPointeeType(); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2416) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2417) // If the unqualified pointee types are the same, this can't be a +fb640869ed14e (Douglas Gregor 2010-08-18 21:25:30 +0000 2418) // pointer conversion, so don't do all of the work below. +fb640869ed14e (Douglas Gregor 2010-08-18 21:25:30 +0000 2419) if (Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) +fb640869ed14e (Douglas Gregor 2010-08-18 21:25:30 +0000 2420) return false; +fb640869ed14e (Douglas Gregor 2010-08-18 21:25:30 +0000 2421) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2422) // An rvalue of type "pointer to cv T," where T is an object type, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2423) // can be converted to an rvalue of type "pointer to cv void" (C++ +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2424) // 4.10p2). +a170cd62575d8 (Eli Friedman 2010-08-05 02:49:48 +0000 2425) if (FromPointeeType->isIncompleteOrObjectType() && +a170cd62575d8 (Eli Friedman 2010-08-05 02:49:48 +0000 2426) ToPointeeType->isVoidType()) { +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2427) ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2428) ToPointeeType, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2429) ToType, Context, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2430) /*StripObjCLifetime=*/true); +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2431) return true; +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2432) } +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2433) +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2434) // MSVC allows implicit function to void* type conversion. +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 2435) if (getLangOpts().MSVCCompat && FromPointeeType->isFunctionType() && +bc6ebb5b76827 (Francois Pichet 2011-05-08 22:52:41 +0000 2436) ToPointeeType->isVoidType()) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2437) ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, +bb9bf88fa4a0d (Douglas Gregor 2008-11-27 00:52:49 +0000 2438) ToPointeeType, +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2439) ToType, Context); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2440) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2441) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2442) +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2443) // When we're overloading in C, we allow a special kind of pointer +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2444) // conversion for compatible-but-not-identical pointee types. +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 2445) if (!getLangOpts().CPlusPlus && +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2446) Context.typesAreCompatible(FromPointeeType, ToPointeeType)) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2447) ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2448) ToPointeeType, +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2449) ToType, Context); +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2450) return true; +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2451) } +4e5cbdcbed0b0 (Douglas Gregor 2009-02-11 23:02:49 +0000 2452) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2453) // C++ [conv.ptr]p3: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2454) // +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2455) // An rvalue of type "pointer to cv D," where D is a class type, +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2456) // can be converted to an rvalue of type "pointer to cv B," where +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2457) // B is a base class (clause 10) of D. If B is an inaccessible +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2458) // (clause 11) or ambiguous (10.2) base class of D, a program that +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2459) // necessitates this conversion is ill-formed. The result of the +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2460) // conversion is a pointer to the base class sub-object of the +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2461) // derived class object. The null pointer value is converted to +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2462) // the null pointer value of the destination type. +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 2463) // +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2464) // Note that we do not check for ambiguity or inaccessibility +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2465) // here. That is handled by CheckPointerConversion. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 2466) if (getLangOpts().CPlusPlus && FromPointeeType->isRecordType() && +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 2467) ToPointeeType->isRecordType() && +d28f0412e4061 (Douglas Gregor 2010-02-22 17:06:41 +0000 2468) !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) && +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 2469) IsDerivedFrom(From->getBeginLoc(), FromPointeeType, ToPointeeType)) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2470) ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, +bb9bf88fa4a0d (Douglas Gregor 2008-11-27 00:52:49 +0000 2471) ToPointeeType, +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2472) ToType, Context); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2473) return true; +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2474) } +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 2475) +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2476) if (FromPointeeType->isVectorType() && ToPointeeType->isVectorType() && +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2477) Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) { +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2478) ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr, +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2479) ToPointeeType, +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2480) ToType, Context); +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2481) return true; +bc2ee9382c82d (Fariborz Jahanian 2011-04-14 20:33:36 +0000 2482) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2483) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2484) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2485) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2486) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 2487) /// Adopt the given qualifiers for the given type. +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2488) static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs){ +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2489) Qualifiers TQs = T.getQualifiers(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2490) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2491) // Check whether qualifiers already match. +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2492) if (TQs == Qs) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2493) return T; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2494) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2495) if (Qs.compatiblyIncludes(TQs)) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2496) return Context.getQualifiedType(T, Qs); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2497) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2498) return Context.getQualifiedType(T.getUnqualifiedType(), Qs); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2499) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2500) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2501) /// isObjCPointerConversion - Determines whether this is an +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2502) /// Objective-C pointer conversion. Subroutine of IsPointerConversion, +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2503) /// with the same arguments and return values. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2504) bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType, +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2505) QualType& ConvertedType, +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2506) bool &IncompatibleObjC) { +fa98390b3c314 (Erik Pilkington 2018-10-30 20:31:30 +0000 2507) if (!getLangOpts().ObjC) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2508) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2509) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2510) // The set of qualifiers on the type we're converting from. +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2511) Qualifiers FromQualifiers = FromType.getQualifiers(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2512) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2513) // First, we handle all conversions on ObjC object pointer types. +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2514) const ObjCObjectPointerType* ToObjCPtr = +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2515) ToType->getAs(); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2516) const ObjCObjectPointerType *FromObjCPtr = +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2517) FromType->getAs(); +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2518) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2519) if (ToObjCPtr && FromObjCPtr) { +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2520) // If the pointee types are the same (ignoring qualifications), +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2521) // then this is not a pointer conversion. +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2522) if (Context.hasSameUnqualifiedType(ToObjCPtr->getPointeeType(), +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2523) FromObjCPtr->getPointeeType())) +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2524) return false; +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2525) +ab209d83be5da (Douglas Gregor 2015-07-07 03:58:42 +0000 2526) // Conversion between Objective-C pointers. +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2527) if (Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) { +b397e43dea379 (Fariborz Jahanian 2010-03-15 18:36:00 +0000 2528) const ObjCInterfaceType* LHS = ToObjCPtr->getInterfaceType(); +b397e43dea379 (Fariborz Jahanian 2010-03-15 18:36:00 +0000 2529) const ObjCInterfaceType* RHS = FromObjCPtr->getInterfaceType(); +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 2530) if (getLangOpts().CPlusPlus && LHS && RHS && +b397e43dea379 (Fariborz Jahanian 2010-03-15 18:36:00 +0000 2531) !ToObjCPtr->getPointeeType().isAtLeastAsQualifiedAs( +b397e43dea379 (Fariborz Jahanian 2010-03-15 18:36:00 +0000 2532) FromObjCPtr->getPointeeType())) +b397e43dea379 (Fariborz Jahanian 2010-03-15 18:36:00 +0000 2533) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2534) ConvertedType = BuildSimilarlyQualifiedPointerType(FromObjCPtr, +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2535) ToObjCPtr->getPointeeType(), +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2536) ToType, Context); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2537) ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers); +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2538) return true; +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2539) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2540) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2541) if (Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) { +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2542) // Okay: this is some kind of implicit downcast of Objective-C +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2543) // interfaces, which is permitted. However, we're going to +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2544) // complain about it. +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2545) IncompatibleObjC = true; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2546) ConvertedType = BuildSimilarlyQualifiedPointerType(FromObjCPtr, +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2547) ToObjCPtr->getPointeeType(), +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2548) ToType, Context); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2549) ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers); +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2550) return true; +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2551) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2552) } +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2553) // Beyond this point, both types need to be C pointers or block pointers. +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2554) QualType ToPointeeType; +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 2555) if (const PointerType *ToCPtr = ToType->getAs()) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2556) ToPointeeType = ToCPtr->getPointeeType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2557) else if (const BlockPointerType *ToBlockPtr = +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2558) ToType->getAs()) { +879cc735fc670 (Fariborz Jahanian 2010-01-21 00:08:17 +0000 2559) // Objective C++: We're able to convert from a pointer to any object +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2560) // to a block pointer type. +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2561) if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) { +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2562) ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers); +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2563) return true; +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2564) } +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2565) ToPointeeType = ToBlockPtr->getPointeeType(); +4efdec067731b (Fariborz Jahanian 2010-01-20 22:54:38 +0000 2566) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2567) else if (FromType->getAs() && +e4951fdc4b958 (Fariborz Jahanian 2010-01-21 00:05:09 +0000 2568) ToObjCPtr && ToObjCPtr->isObjCBuiltinType()) { +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2569) // Objective C++: We're able to convert from a block pointer type to a +879cc735fc670 (Fariborz Jahanian 2010-01-21 00:08:17 +0000 2570) // pointer to any object. +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2571) ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers); +e4951fdc4b958 (Fariborz Jahanian 2010-01-21 00:05:09 +0000 2572) return true; +e4951fdc4b958 (Fariborz Jahanian 2010-01-21 00:05:09 +0000 2573) } +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2574) else +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2575) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2576) +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2577) QualType FromPointeeType; +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 2578) if (const PointerType *FromCPtr = FromType->getAs()) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 2579) FromPointeeType = FromCPtr->getPointeeType(); +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2580) else if (const BlockPointerType *FromBlockPtr = +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 2581) FromType->getAs()) +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2582) FromPointeeType = FromBlockPtr->getPointeeType(); +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2583) else +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2584) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2585) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2586) // If we have pointers to pointers, recursively check whether this +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2587) // is an Objective-C conversion. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2588) if (FromPointeeType->isPointerType() && ToPointeeType->isPointerType() && +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2589) isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType, +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2590) IncompatibleObjC)) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2591) // We always complain about this conversion. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2592) IncompatibleObjC = true; +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2593) ConvertedType = Context.getPointerType(ConvertedType); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2594) ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers); +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2595) return true; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2596) } +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2597) // Allow conversion of pointee being objective-c pointer to another one; +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2598) // as in I* to id. +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2599) if (FromPointeeType->getAs() && +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2600) ToPointeeType->getAs() && +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2601) isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType, +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2602) IncompatibleObjC)) { +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2603) +8d6d06761fcb7 (Douglas Gregor 2010-12-01 21:43:58 +0000 2604) ConvertedType = Context.getPointerType(ConvertedType); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2605) ConvertedType = AdoptQualifiers(Context, ConvertedType, FromQualifiers); +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2606) return true; +42ffdb32fb546 (Fariborz Jahanian 2010-01-18 22:59:22 +0000 2607) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2608) +033f56d5335ab (Douglas Gregor 2008-12-23 00:53:59 +0000 2609) // If we have pointers to functions or blocks, check whether the only +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2610) // differences in the argument and result types are in Objective-C +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2611) // pointer conversions. If so, we permit the conversion (but +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2612) // complain about it). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2613) const FunctionProtoType *FromFunctionType +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2614) = FromPointeeType->getAs(); +deaad8cc34239 (Douglas Gregor 2009-02-26 23:50:07 +0000 2615) const FunctionProtoType *ToFunctionType +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 2616) = ToPointeeType->getAs(); +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2617) if (FromFunctionType && ToFunctionType) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2618) // If the function types are exactly the same, this isn't an +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2619) // Objective-C pointer conversion. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2620) if (Context.getCanonicalType(FromPointeeType) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2621) == Context.getCanonicalType(ToPointeeType)) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2622) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2623) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2624) // Perform the quick checks that will tell us whether these +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2625) // function types are obviously different. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2626) if (FromFunctionType->getNumParams() != ToFunctionType->getNumParams() || +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2627) FromFunctionType->isVariadic() != ToFunctionType->isVariadic() || +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 2628) FromFunctionType->getMethodQuals() != ToFunctionType->getMethodQuals()) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2629) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2630) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2631) bool HasObjCConversion = false; +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2632) if (Context.getCanonicalType(FromFunctionType->getReturnType()) == +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2633) Context.getCanonicalType(ToFunctionType->getReturnType())) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2634) // Okay, the types match exactly. Nothing to do. +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2635) } else if (isObjCPointerConversion(FromFunctionType->getReturnType(), +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2636) ToFunctionType->getReturnType(), +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2637) ConvertedType, IncompatibleObjC)) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2638) // Okay, we have an Objective-C pointer conversion. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2639) HasObjCConversion = true; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2640) } else { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2641) // Function types are too different. Abort. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2642) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2643) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 2644) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2645) // Check argument types. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2646) for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumParams(); +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2647) ArgIdx != NumArgs; ++ArgIdx) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2648) QualType FromArgType = FromFunctionType->getParamType(ArgIdx); +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2649) QualType ToArgType = ToFunctionType->getParamType(ArgIdx); +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2650) if (Context.getCanonicalType(FromArgType) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2651) == Context.getCanonicalType(ToArgType)) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2652) // Okay, the types match exactly. Nothing to do. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2653) } else if (isObjCPointerConversion(FromArgType, ToArgType, +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2654) ConvertedType, IncompatibleObjC)) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2655) // Okay, we have an Objective-C pointer conversion. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2656) HasObjCConversion = true; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2657) } else { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2658) // Argument types are too different. Abort. +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2659) return false; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2660) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2661) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2662) +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2663) if (HasObjCConversion) { +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2664) // We had an Objective-C conversion. Allow this pointer +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2665) // conversion, but complain about it. +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 2666) ConvertedType = AdoptQualifiers(Context, ToType, FromQualifiers); +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2667) IncompatibleObjC = true; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2668) return true; +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2669) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2670) } +a119f10482c3f (Douglas Gregor 2008-12-19 19:13:09 +0000 2671) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 2672) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2673) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 2674) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 2675) /// Determine whether this is an Objective-C writeback conversion, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2676) /// used for parameter passing when performing automatic reference counting. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2677) /// +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2678) /// \param FromType The type we're converting form. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2679) /// +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2680) /// \param ToType The type we're converting to. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2681) /// +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2682) /// \param ConvertedType The type that will be produced after applying +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2683) /// this conversion. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2684) bool Sema::isObjCWritebackConversion(QualType FromType, QualType ToType, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2685) QualType &ConvertedType) { +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2686) if (!getLangOpts().ObjCAutoRefCount || +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2687) Context.hasSameUnqualifiedType(FromType, ToType)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2688) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2689) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2690) // Parameter must be a pointer to __autoreleasing (with no other qualifiers). +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2691) QualType ToPointee; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2692) if (const PointerType *ToPointer = ToType->getAs()) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2693) ToPointee = ToPointer->getPointeeType(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2694) else +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2695) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2696) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2697) Qualifiers ToQuals = ToPointee.getQualifiers(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2698) if (!ToPointee->isObjCLifetimeType() || +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2699) ToQuals.getObjCLifetime() != Qualifiers::OCL_Autoreleasing || +18ce25e1ec096 (John McCall 2012-02-08 00:46:36 +0000 2700) !ToQuals.withoutObjCLifetime().empty()) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2701) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2702) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2703) // Argument must be a pointer to __strong to __weak. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2704) QualType FromPointee; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2705) if (const PointerType *FromPointer = FromType->getAs()) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2706) FromPointee = FromPointer->getPointeeType(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2707) else +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2708) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2709) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2710) Qualifiers FromQuals = FromPointee.getQualifiers(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2711) if (!FromPointee->isObjCLifetimeType() || +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2712) (FromQuals.getObjCLifetime() != Qualifiers::OCL_Strong && +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2713) FromQuals.getObjCLifetime() != Qualifiers::OCL_Weak)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2714) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2715) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2716) // Make sure that we have compatible qualifiers. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2717) FromQuals.setObjCLifetime(Qualifiers::OCL_Autoreleasing); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2718) if (!ToQuals.compatiblyIncludes(FromQuals)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2719) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2720) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2721) // Remove qualifiers from the pointee type we're converting from; they +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2722) // aren't used in the compatibility check belong, and we'll be adding back +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2723) // qualifiers (with __autoreleasing) if the compatibility check succeeds. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2724) FromPointee = FromPointee.getUnqualifiedType(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2725) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2726) // The unqualified form of the pointee types must be compatible. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2727) ToPointee = ToPointee.getUnqualifiedType(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2728) bool IncompatibleObjC; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2729) if (Context.typesAreCompatible(FromPointee, ToPointee)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2730) FromPointee = ToPointee; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2731) else if (!isObjCPointerConversion(FromPointee, ToPointee, FromPointee, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2732) IncompatibleObjC)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2733) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2734) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 2735) /// Construct the type we're converting to, which is a pointer to +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2736) /// __autoreleasing pointee. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2737) FromPointee = Context.getQualifiedType(FromPointee, FromQuals); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2738) ConvertedType = Context.getPointerType(FromPointee); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2739) return true; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2740) } +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 2741) +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2742) bool Sema::IsBlockPointerConversion(QualType FromType, QualType ToType, +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2743) QualType& ConvertedType) { +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2744) QualType ToPointeeType; +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2745) if (const BlockPointerType *ToBlockPtr = +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2746) ToType->getAs()) +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2747) ToPointeeType = ToBlockPtr->getPointeeType(); +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2748) else +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2749) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2750) +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2751) QualType FromPointeeType; +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2752) if (const BlockPointerType *FromBlockPtr = +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2753) FromType->getAs()) +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2754) FromPointeeType = FromBlockPtr->getPointeeType(); +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2755) else +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2756) return false; +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2757) // We have pointer to blocks, check whether the only +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2758) // differences in the argument and result types are in Objective-C +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2759) // pointer conversions. If so, we permit the conversion. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2760) +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2761) const FunctionProtoType *FromFunctionType +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2762) = FromPointeeType->getAs(); +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2763) const FunctionProtoType *ToFunctionType +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2764) = ToPointeeType->getAs(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2765) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2766) if (!FromFunctionType || !ToFunctionType) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2767) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2768) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2769) if (Context.hasSameType(FromPointeeType, ToPointeeType)) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2770) return true; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2771) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2772) // Perform the quick checks that will tell us whether these +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2773) // function types are obviously different. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2774) if (FromFunctionType->getNumParams() != ToFunctionType->getNumParams() || +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2775) FromFunctionType->isVariadic() != ToFunctionType->isVariadic()) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2776) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2777) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2778) FunctionType::ExtInfo FromEInfo = FromFunctionType->getExtInfo(); +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2779) FunctionType::ExtInfo ToEInfo = ToFunctionType->getExtInfo(); +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2780) if (FromEInfo != ToEInfo) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2781) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2782) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2783) bool IncompatibleObjC = false; +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2784) if (Context.hasSameType(FromFunctionType->getReturnType(), +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2785) ToFunctionType->getReturnType())) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2786) // Okay, the types match exactly. Nothing to do. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2787) } else { +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2788) QualType RHS = FromFunctionType->getReturnType(); +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2789) QualType LHS = ToFunctionType->getReturnType(); +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 2790) if ((!getLangOpts().CPlusPlus || !RHS->isRecordType()) && +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2791) !RHS.hasQualifiers() && LHS.hasQualifiers()) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2792) LHS = LHS.getUnqualifiedType(); +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2793) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2794) if (Context.hasSameType(RHS,LHS)) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2795) // OK exact match. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2796) } else if (isObjCPointerConversion(RHS, LHS, +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2797) ConvertedType, IncompatibleObjC)) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2798) if (IncompatibleObjC) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2799) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2800) // Okay, we have an Objective-C pointer conversion. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2801) } +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2802) else +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2803) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2804) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2805) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2806) // Check argument types. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2807) for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumParams(); +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2808) ArgIdx != NumArgs; ++ArgIdx) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2809) IncompatibleObjC = false; +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2810) QualType FromArgType = FromFunctionType->getParamType(ArgIdx); +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2811) QualType ToArgType = ToFunctionType->getParamType(ArgIdx); +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2812) if (Context.hasSameType(FromArgType, ToArgType)) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2813) // Okay, the types match exactly. Nothing to do. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2814) } else if (isObjCPointerConversion(ToArgType, FromArgType, +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2815) ConvertedType, IncompatibleObjC)) { +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2816) if (IncompatibleObjC) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2817) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2818) // Okay, we have an Objective-C pointer conversion. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2819) } else +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2820) // Argument types are too different. Abort. +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2821) return false; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2822) } +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2823) +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2824) SmallVector NewParamInfos; +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2825) bool CanUseToFPT, CanUseFromFPT; +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2826) if (!Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType, +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2827) CanUseToFPT, CanUseFromFPT, +98a49337be3fd (Akira Hatanaka 2017-09-22 00:41:05 +0000 2828) NewParamInfos)) +97676979a7eed (Fariborz Jahanian 2011-09-28 21:52:05 +0000 2829) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 2830) +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2831) ConvertedType = ToType; +4de45dc6a7701 (Fariborz Jahanian 2011-02-13 20:01:48 +0000 2832) return true; +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2833) } +42455ea935b04 (Fariborz Jahanian 2011-02-12 19:07:46 +0000 2834) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2835) enum { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2836) ft_default, +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2837) ft_different_class, +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2838) ft_parameter_arity, +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2839) ft_parameter_mismatch, +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2840) ft_return_type, +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2841) ft_qualifer_mismatch, +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2842) ft_noexcept +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2843) }; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2844) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2845) /// Attempts to get the FunctionProtoType from a Type. Handles +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2846) /// MemberFunctionPointers properly. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2847) static const FunctionProtoType *tryGetFunctionProtoType(QualType FromType) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2848) if (auto *FPT = FromType->getAs()) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2849) return FPT; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2850) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2851) if (auto *MPT = FromType->getAs()) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2852) return MPT->getPointeeType()->getAs(); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2853) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2854) return nullptr; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2855) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2856) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2857) /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2858) /// function types. Catches different number of parameter, mismatch in +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2859) /// parameter types, and different return types. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2860) void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2861) QualType FromType, QualType ToType) { +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2862) // If either type is not valid, include no extra info. +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2863) if (FromType.isNull() || ToType.isNull()) { +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2864) PDiag << ft_default; +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2865) return; +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2866) } +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2867) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2868) // Get the function type from the pointers. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2869) if (FromType->isMemberPointerType() && ToType->isMemberPointerType()) { +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 2870) const auto *FromMember = FromType->castAs(), +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 2871) *ToMember = ToType->castAs(); +9098c9f1a8220 (Richard Trieu 2014-05-22 01:39:16 +0000 2872) if (!Context.hasSameType(FromMember->getClass(), ToMember->getClass())) { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2873) PDiag << ft_different_class << QualType(ToMember->getClass(), 0) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2874) << QualType(FromMember->getClass(), 0); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2875) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2876) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2877) FromType = FromMember->getPointeeType(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2878) ToType = ToMember->getPointeeType(); +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2879) } +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2880) +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2881) if (FromType->isPointerType()) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2882) FromType = FromType->getPointeeType(); +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2883) if (ToType->isPointerType()) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2884) ToType = ToType->getPointeeType(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2885) +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2886) // Remove references. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2887) FromType = FromType.getNonReferenceType(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2888) ToType = ToType.getNonReferenceType(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2889) +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2890) // Don't print extra info for non-specialized template functions. +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2891) if (FromType->isInstantiationDependentType() && +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2892) !FromType->getAs()) { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2893) PDiag << ft_default; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2894) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2895) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2896) +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2897) // No extra info for same types. +96ed5b6b47666 (Richard Trieu 2011-12-13 23:19:45 +0000 2898) if (Context.hasSameType(FromType, ToType)) { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2899) PDiag << ft_default; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2900) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2901) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2902) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2903) const FunctionProtoType *FromFunction = tryGetFunctionProtoType(FromType), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 2904) *ToFunction = tryGetFunctionProtoType(ToType); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2905) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2906) // Both types need to be function types. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2907) if (!FromFunction || !ToFunction) { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2908) PDiag << ft_default; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2909) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2910) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2911) +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2912) if (FromFunction->getNumParams() != ToFunction->getNumParams()) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2913) PDiag << ft_parameter_arity << ToFunction->getNumParams() +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2914) << FromFunction->getNumParams(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2915) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2916) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2917) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2918) // Handle different parameter types. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2919) unsigned ArgPos; +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2920) if (!FunctionParamTypesAreEqual(FromFunction, ToFunction, &ArgPos)) { +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2921) PDiag << ft_parameter_mismatch << ArgPos + 1 +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2922) << ToFunction->getParamType(ArgPos) +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2923) << FromFunction->getParamType(ArgPos); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2924) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2925) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2926) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2927) // Handle different return type. +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2928) if (!Context.hasSameType(FromFunction->getReturnType(), +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2929) ToFunction->getReturnType())) { +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2930) PDiag << ft_return_type << ToFunction->getReturnType() +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 2931) << FromFunction->getReturnType(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2932) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2933) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2934) +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 2935) if (FromFunction->getMethodQuals() != ToFunction->getMethodQuals()) { +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 2936) PDiag << ft_qualifer_mismatch << ToFunction->getMethodQuals() +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 2937) << FromFunction->getMethodQuals(); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2938) return; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2939) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2940) +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2941) // Handle exception specification differences on canonical type (in C++17 +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2942) // onwards). +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2943) if (cast(FromFunction->getCanonicalTypeUnqualified()) +eaf11ad709046 (Richard Smith 2018-05-03 03:58:32 +0000 2944) ->isNothrow() != +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2945) cast(ToFunction->getCanonicalTypeUnqualified()) +eaf11ad709046 (Richard Smith 2018-05-03 03:58:32 +0000 2946) ->isNothrow()) { +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2947) PDiag << ft_noexcept; +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2948) return; +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2949) } +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 2950) +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2951) // Unable to find a difference, so add no extra info. +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2952) PDiag << ft_default; +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2953) } +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 2954) +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2955) /// FunctionParamTypesAreEqual - This routine checks two function proto types +2039ca061f07f (Douglas Gregor 2011-12-15 17:15:07 +0000 2956) /// for equality of their argument types. Caller has already checked that +5f508953bc478 (Eli Friedman 2013-06-18 22:41:37 +0000 2957) /// they have same number of arguments. If the parameters are different, +5f508953bc478 (Eli Friedman 2013-06-18 22:41:37 +0000 2958) /// ArgPos will have the parameter index of the first different parameter. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2959) bool Sema::FunctionParamTypesAreEqual(const FunctionProtoType *OldType, +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2960) const FunctionProtoType *NewType, +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2961) unsigned *ArgPos) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2962) for (FunctionProtoType::param_type_iterator O = OldType->param_type_begin(), +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2963) N = NewType->param_type_begin(), +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2964) E = OldType->param_type_end(); +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2965) O && (O != E); ++O, ++N) { +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2966) // Ignore address spaces in pointee type. This is to disallow overloading +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2967) // on __ptr32/__ptr64 address spaces. +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2968) QualType Old = Context.removePtrSizeAddrSpace(O->getUnqualifiedType()); +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2969) QualType New = Context.removePtrSizeAddrSpace(N->getUnqualifiedType()); +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2970) +a85f5efd9597d (Amy Huang 2019-10-24 16:34:25 -0700 2971) if (!Context.hasSameType(Old, New)) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2972) if (ArgPos) +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 2973) *ArgPos = O - OldType->param_type_begin(); +4154f46c5a9aa (Larisse Voufo 2013-08-06 03:57:41 +0000 2974) return false; +5e5998f014a2d (Fariborz Jahanian 2010-05-03 21:06:18 +0000 2975) } +5e5998f014a2d (Fariborz Jahanian 2010-05-03 21:06:18 +0000 2976) } +5e5998f014a2d (Fariborz Jahanian 2010-05-03 21:06:18 +0000 2977) return true; +5e5998f014a2d (Fariborz Jahanian 2010-05-03 21:06:18 +0000 2978) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 2979) +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2980) /// CheckPointerConversion - Check the pointer conversion from the +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2981) /// expression From to the type ToType. This routine checks for +9f831dbbcdfab (Sebastian Redl 2009-07-25 15:41:38 +0000 2982) /// ambiguous or inaccessible derived-to-base pointer +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2983) /// conversions for which IsPointerConversion has already returned +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2984) /// true. It returns true and produces a diagnostic if there was an +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2985) /// error, or returns false otherwise. +7ec8ccde01d1a (Anders Carlsson 2009-09-12 04:46:44 +0000 2986) bool Sema::CheckPointerConversion(Expr *From, QualType ToType, +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 2987) CastKind &Kind, +cf1421650953d (John McCall 2010-08-07 06:22:56 +0000 2988) CXXCastPath& BasePath, +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 2989) bool IgnoreBaseAccess, +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 2990) bool Diagnose) { +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2991) QualType FromType = From->getType(); +d6ea6bd2a3f54 (Argyrios Kyrtzidis 2010-09-28 14:54:11 +0000 2992) bool IsCStyleOrFunctionalCast = IgnoreBaseAccess; +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 2993) +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 2994) Kind = CK_BitCast; +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 2995) +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 2996) if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() && +3e3305dabaa26 (Argyrios Kyrtzidis 2014-02-02 05:26:43 +0000 2997) From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) == +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 2998) Expr::NPCK_ZeroExpression) { +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 2999) if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy)) +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3000) DiagRuntimeBehavior(From->getExprLoc(), From, +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3001) PDiag(diag::warn_impcast_bool_to_null_pointer) +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3002) << ToType << From->getSourceRange()); +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3003) else if (!isUnevaluatedContext()) +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3004) Diag(From->getExprLoc(), diag::warn_non_literal_null_pointer) +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3005) << ToType << From->getSourceRange(); +1c7c8f763769d (David Blaikie 2012-08-08 17:33:31 +0000 3006) } +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3007) if (const PointerType *ToPtrType = ToType->getAs()) { +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3008) if (const PointerType *FromPtrType = FromType->getAs()) { +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3009) QualType FromPointeeType = FromPtrType->getPointeeType(), +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3010) ToPointeeType = ToPtrType->getPointeeType(); +1e57a3fb46808 (Douglas Gregor 2008-12-18 23:43:31 +0000 3011) +cc3f325fa69e7 (Douglas Gregor 2010-03-03 23:55:11 +0000 3012) if (FromPointeeType->isRecordType() && ToPointeeType->isRecordType() && +cc3f325fa69e7 (Douglas Gregor 2010-03-03 23:55:11 +0000 3013) !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) { +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3014) // We must have a derived-to-base conversion. Check an +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3015) // ambiguous or inaccessible conversion. +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3016) unsigned InaccessibleID = 0; +68b30bc02b3a7 (Casey Carter 2020-04-28 14:50:52 -0700 3017) unsigned AmbiguousID = 0; +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3018) if (Diagnose) { +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3019) InaccessibleID = diag::err_upcast_to_inaccessible_base; +68b30bc02b3a7 (Casey Carter 2020-04-28 14:50:52 -0700 3020) AmbiguousID = diag::err_ambiguous_derived_to_base_conv; +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3021) } +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3022) if (CheckDerivedToBaseConversion( +68b30bc02b3a7 (Casey Carter 2020-04-28 14:50:52 -0700 3023) FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID, +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3024) From->getExprLoc(), From->getSourceRange(), DeclarationName(), +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3025) &BasePath, IgnoreBaseAccess)) +7ec8ccde01d1a (Anders Carlsson 2009-09-12 04:46:44 +0000 3026) return true; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3027) +7ec8ccde01d1a (Anders Carlsson 2009-09-12 04:46:44 +0000 3028) // The conversion was successful. +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 3029) Kind = CK_DerivedToBase; +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3030) } +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3031) +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3032) if (Diagnose && !IsCStyleOrFunctionalCast && +60bc9725755e1 (George Burgess IV 2016-01-13 23:36:34 +0000 3033) FromPointeeType->isFunctionType() && ToPointeeType->isVoidType()) { +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3034) assert(getLangOpts().MSVCCompat && +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3035) "this should only be possible with MSVCCompat!"); +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3036) Diag(From->getExprLoc(), diag::ext_ms_impcast_fn_obj) +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3037) << From->getSourceRange(); +6bf02820bced5 (David Majnemer 2015-10-31 08:42:14 +0000 3038) } +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3039) } +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3040) } else if (const ObjCObjectPointerType *ToPtrType = +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3041) ToType->getAs()) { +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3042) if (const ObjCObjectPointerType *FromPtrType = +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3043) FromType->getAs()) { +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 3044) // Objective-C++ conversions are always okay. +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 3045) // FIXME: We should have a different class of conversions for the +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 3046) // Objective-C++ implicit conversions. +1329fa0ed9162 (Steve Naroff 2009-07-15 18:40:39 +0000 3047) if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType()) +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 3048) return false; +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3049) } else if (FromType->isBlockPointerType()) { +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3050) Kind = CK_BlockPointerToObjCPointerCast; +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3051) } else { +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3052) Kind = CK_CPointerToObjCPointerCast; +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3053) } +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3054) } else if (ToType->isBlockPointerType()) { +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3055) if (!FromType->isBlockPointerType()) +9320b87cff21e (John McCall 2011-09-09 05:25:32 +0000 3056) Kind = CK_AnyPointerToBlockPointerCast; +7cae42b07a3aa (Steve Naroff 2009-07-10 23:34:53 +0000 3057) } +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3058) +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3059) // We shouldn't fall into this case unless it's valid for other +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3060) // reasons. +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3061) if (From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3062) Kind = CK_NullToPointer; +8cb679e4e1e20 (John McCall 2010-11-15 09:13:47 +0000 3063) +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3064) return false; +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3065) } +39c16d445e8e3 (Douglas Gregor 2008-10-24 04:54:22 +0000 3066) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3067) /// IsMemberPointerConversion - Determines whether the conversion of the +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3068) /// expression From, which has the (possibly adjusted) type FromType, can be +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3069) /// converted to the type ToType via a member pointer conversion (C++ 4.11). +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3070) /// If so, returns true and places the converted type (that might differ from +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3071) /// ToType in its cv-qualifiers at some level) into ConvertedType. +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3072) bool Sema::IsMemberPointerConversion(Expr *From, QualType FromType, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3073) QualType ToType, +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3074) bool InOverloadResolution, +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3075) QualType &ConvertedType) { +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 3076) const MemberPointerType *ToTypePtr = ToType->getAs(); +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3077) if (!ToTypePtr) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3078) return false; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3079) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3080) // A null pointer constant can be converted to a member pointer (C++ 4.11p1) +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3081) if (From->isNullPointerConstant(Context, +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3082) InOverloadResolution? Expr::NPC_ValueDependentIsNotNull +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3083) : Expr::NPC_ValueDependentIsNull)) { +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3084) ConvertedType = ToType; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3085) return true; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3086) } +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3087) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3088) // Otherwise, both types have to be member pointers. +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 3089) const MemberPointerType *FromTypePtr = FromType->getAs(); +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3090) if (!FromTypePtr) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3091) return false; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3092) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3093) // A pointer to member of B can be converted to a pointer to member of D, +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3094) // where D is derived from B (C++ 4.11p2). +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3095) QualType FromClass(FromTypePtr->getClass(), 0); +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3096) QualType ToClass(ToTypePtr->getClass(), 0); +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3097) +7f6ae6958cbc2 (Douglas Gregor 2010-12-21 21:40:41 +0000 3098) if (!Context.hasSameUnqualifiedType(FromClass, ToClass) && +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3099) IsDerivedFrom(From->getBeginLoc(), ToClass, FromClass)) { +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3100) ConvertedType = Context.getMemberPointerType(FromTypePtr->getPointeeType(), +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3101) ToClass.getTypePtr()); +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3102) return true; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3103) } +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3104) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3105) return false; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3106) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3107) +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3108) /// CheckMemberPointerConversion - Check the member pointer conversion from the +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3109) /// expression From to the type ToType. This routine checks for ambiguous or +5b0829a321d56 (John McCall 2010-02-10 09:31:12 +0000 3110) /// virtual or inaccessible base-to-derived member pointer conversions +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3111) /// for which IsMemberPointerConversion has already returned true. It returns +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3112) /// true and produces a diagnostic if there was an error, or returns false +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3113) /// otherwise. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 3114) bool Sema::CheckMemberPointerConversion(Expr *From, QualType ToType, +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 3115) CastKind &Kind, +cf1421650953d (John McCall 2010-08-07 06:22:56 +0000 3116) CXXCastPath &BasePath, +7c353685bcb7f (Sebastian Redl 2009-11-14 21:15:49 +0000 3117) bool IgnoreBaseAccess) { +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3118) QualType FromType = From->getType(); +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 3119) const MemberPointerType *FromPtrType = FromType->getAs(); +d7923c6ed7ad6 (Anders Carlsson 2009-08-22 23:33:40 +0000 3120) if (!FromPtrType) { +d7923c6ed7ad6 (Anders Carlsson 2009-08-22 23:33:40 +0000 3121) // This must be a null pointer to member pointer conversion +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3122) assert(From->isNullPointerConstant(Context, +56751b5981c3b (Douglas Gregor 2009-09-25 04:25:58 +0000 3123) Expr::NPC_ValueDependentIsNull) && +d7923c6ed7ad6 (Anders Carlsson 2009-08-22 23:33:40 +0000 3124) "Expr must be null pointer constant!"); +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 3125) Kind = CK_NullToMemberPointer; +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3126) return false; +d7923c6ed7ad6 (Anders Carlsson 2009-08-22 23:33:40 +0000 3127) } +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3128) +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 3129) const MemberPointerType *ToPtrType = ToType->getAs(); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3130) assert(ToPtrType && "No member pointer cast has a target type " +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3131) "that is not a member pointer."); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3132) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3133) QualType FromClass = QualType(FromPtrType->getClass(), 0); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3134) QualType ToClass = QualType(ToPtrType->getClass(), 0); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3135) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3136) // FIXME: What about dependent types? +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3137) assert(FromClass->isRecordType() && "Pointer into non-class."); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3138) assert(ToClass->isRecordType() && "Pointer into non-class."); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3139) +7d3360f123182 (Anders Carlsson 2010-04-24 19:36:51 +0000 3140) CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, +36d1b14ddedb3 (Douglas Gregor 2009-10-06 17:59:45 +0000 3141) /*DetectVirtual=*/true); +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 3142) bool DerivationOkay = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3143) IsDerivedFrom(From->getBeginLoc(), ToClass, FromClass, Paths); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3144) assert(DerivationOkay && +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3145) "Should not have been called if derivation isn't OK."); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3146) (void)DerivationOkay; +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3147) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3148) if (Paths.isAmbiguous(Context.getCanonicalType(FromClass). +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3149) getUnqualifiedType())) { +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3150) std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3151) Diag(From->getExprLoc(), diag::err_ambiguous_memptr_conv) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3152) << 0 << FromClass << ToClass << PathDisplayStr << From->getSourceRange(); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3153) return true; +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3154) } +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3155) +89ee6822d8a6a (Douglas Gregor 2009-02-28 01:32:25 +0000 3156) if (const RecordType *VBase = Paths.getDetectedVirtual()) { +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3157) Diag(From->getExprLoc(), diag::err_memptr_conv_via_virtual) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3158) << FromClass << ToClass << QualType(VBase, 0) +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3159) << From->getSourceRange(); +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3160) return true; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3161) } +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3162) +5b0829a321d56 (John McCall 2010-02-10 09:31:12 +0000 3163) if (!IgnoreBaseAccess) +1064d7ef29922 (John McCall 2010-03-16 05:22:47 +0000 3164) CheckBaseClassAccess(From->getExprLoc(), FromClass, ToClass, +1064d7ef29922 (John McCall 2010-03-16 05:22:47 +0000 3165) Paths.front(), +1064d7ef29922 (John McCall 2010-03-16 05:22:47 +0000 3166) diag::err_downcast_from_inaccessible_base); +5b0829a321d56 (John McCall 2010-02-10 09:31:12 +0000 3167) +d7923c6ed7ad6 (Anders Carlsson 2009-08-22 23:33:40 +0000 3168) // Must be a base to derived member conversion. +7d3360f123182 (Anders Carlsson 2010-04-24 19:36:51 +0000 3169) BuildBasePathArray(Paths, BasePath); +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 3170) Kind = CK_BaseToDerivedMemberPointer; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3171) return false; +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3172) } +72b597d6b6ae7 (Sebastian Redl 2009-01-25 19:43:20 +0000 3173) +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3174) /// Determine whether the lifetime conversion between the two given +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3175) /// qualifiers sets is nontrivial. +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3176) static bool isNonTrivialObjCLifetimeConversion(Qualifiers FromQuals, +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3177) Qualifiers ToQuals) { +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3178) // Converting anything to const __unsafe_unretained is trivial. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3179) if (ToQuals.hasConst() && +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3180) ToQuals.getObjCLifetime() == Qualifiers::OCL_ExplicitNone) +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3181) return false; +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3182) +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3183) return true; +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3184) } +c9f019ab0f95e (Douglas Gregor 2013-11-08 02:04:24 +0000 3185) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3186) /// Perform a single iteration of the loop for checking if a qualification +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3187) /// conversion is valid. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3188) /// +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3189) /// Specifically, check whether any change between the qualifiers of \p +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3190) /// FromType and \p ToType is permissible, given knowledge about whether every +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3191) /// outer layer is const-qualified. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3192) static bool isQualificationConversionStep(QualType FromType, QualType ToType, +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3193) bool CStyle, bool IsTopLevel, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3194) bool &PreviousToQualsIncludeConst, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3195) bool &ObjCLifetimeConversion) { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3196) Qualifiers FromQuals = FromType.getQualifiers(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3197) Qualifiers ToQuals = ToType.getQualifiers(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3198) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3199) // Ignore __unaligned qualifier if this type is void. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3200) if (ToType.getUnqualifiedType()->isVoidType()) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3201) FromQuals.removeUnaligned(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3202) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3203) // Objective-C ARC: +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3204) // Check Objective-C lifetime conversions. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3205) if (FromQuals.getObjCLifetime() != ToQuals.getObjCLifetime()) { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3206) if (ToQuals.compatiblyIncludesObjCLifetime(FromQuals)) { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3207) if (isNonTrivialObjCLifetimeConversion(FromQuals, ToQuals)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3208) ObjCLifetimeConversion = true; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3209) FromQuals.removeObjCLifetime(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3210) ToQuals.removeObjCLifetime(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3211) } else { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3212) // Qualification conversions cannot cast between different +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3213) // Objective-C lifetime qualifiers. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3214) return false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3215) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3216) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3217) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3218) // Allow addition/removal of GC attributes but not changing GC attributes. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3219) if (FromQuals.getObjCGCAttr() != ToQuals.getObjCGCAttr() && +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3220) (!FromQuals.hasObjCGCAttr() || !ToQuals.hasObjCGCAttr())) { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3221) FromQuals.removeObjCGCAttr(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3222) ToQuals.removeObjCGCAttr(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3223) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3224) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3225) // -- for every j > 0, if const is in cv 1,j then const is in cv +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3226) // 2,j, and similarly for volatile. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3227) if (!CStyle && !ToQuals.compatiblyIncludes(FromQuals)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3228) return false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3229) +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3230) // If address spaces mismatch: +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3231) // - in top level it is only valid to convert to addr space that is a +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3232) // superset in all cases apart from C-style casts where we allow +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3233) // conversions between overlapping address spaces. +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3234) // - in non-top levels it is not a valid conversion. +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3235) if (ToQuals.getAddressSpace() != FromQuals.getAddressSpace() && +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3236) (!IsTopLevel || +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3237) !(ToQuals.isAddressSpaceSupersetOf(FromQuals) || +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3238) (CStyle && FromQuals.isAddressSpaceSupersetOf(ToQuals))))) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3239) return false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3240) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3241) // -- if the cv 1,j and cv 2,j are different, then const is in +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3242) // every cv for 0 < k < j. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3243) if (!CStyle && FromQuals.getCVRQualifiers() != ToQuals.getCVRQualifiers() && +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3244) !PreviousToQualsIncludeConst) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3245) return false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3246) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3247) // Keep track of whether all prior cv-qualifiers in the "to" type +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3248) // include const. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3249) PreviousToQualsIncludeConst = +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3250) PreviousToQualsIncludeConst && ToQuals.hasConst(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3251) return true; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3252) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3253) +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3254) /// IsQualificationConversion - Determines whether the conversion from +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3255) /// an rvalue of type FromType to ToType is a qualification conversion +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3256) /// (C++ 4.4). +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3257) /// +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3258) /// \param ObjCLifetimeConversion Output parameter that will be set to indicate +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3259) /// when the qualification conversion involves a change in the Objective-C +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3260) /// object lifetime. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 3261) bool +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3262) Sema::IsQualificationConversion(QualType FromType, QualType ToType, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3263) bool CStyle, bool &ObjCLifetimeConversion) { +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3264) FromType = Context.getCanonicalType(FromType); +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3265) ToType = Context.getCanonicalType(ToType); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 3266) ObjCLifetimeConversion = false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3267) +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3268) // If FromType and ToType are the same type, this is not a +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3269) // qualification conversion. +cbdffb15856e4 (Sebastian Redl 2010-02-03 19:36:07 +0000 3270) if (FromType.getUnqualifiedType() == ToType.getUnqualifiedType()) +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3271) return false; +ed8f2003185cc (Sebastian Redl 2009-01-28 18:33:18 +0000 3272) +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3273) // (C++ 4.4p4): +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3274) // A conversion can add cv-qualifiers at levels other than the first +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3275) // in multi-level pointers, subject to the following rules: [...] +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3276) bool PreviousToQualsIncludeConst = true; +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3277) bool UnwrappedAnyPointer = false; +a3405ffcecc6a (Richard Smith 2018-07-11 00:19:19 +0000 3278) while (Context.UnwrapSimilarTypes(FromType, ToType)) { +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3279) if (!isQualificationConversionStep( +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3280) FromType, ToType, CStyle, !UnwrappedAnyPointer, +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 3281) PreviousToQualsIncludeConst, ObjCLifetimeConversion)) +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 3282) return false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3283) UnwrappedAnyPointer = true; +99a9f75948598 (Yaxun Liu 2018-07-20 11:32:51 +0000 3284) } +99a9f75948598 (Yaxun Liu 2018-07-20 11:32:51 +0000 3285) +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3286) // We are left with FromType and ToType being the pointee types +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3287) // after unwrapping the original FromType and ToType the same number +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 3288) // of times. If we unwrapped any pointers, and if FromType and +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3289) // ToType have the same unqualified type (since we checked +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3290) // qualifiers above), then this is a qualification conversion. +1b8fe5b716b8b (Douglas Gregor 2009-11-16 21:35:15 +0000 3291) return UnwrappedAnyPointer && Context.hasSameUnqualifiedType(FromType,ToType); +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3292) } +9a6579340fabd (Douglas Gregor 2008-10-21 23:43:52 +0000 3293) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 3294) /// - Determine whether this is a conversion from a scalar type to an +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3295) /// atomic type. +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3296) /// +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3297) /// If successful, updates \c SCS's second and third steps in the conversion +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3298) /// sequence to finish the conversion. +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 3299) static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 3300) bool InOverloadResolution, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 3301) StandardConversionSequence &SCS, +f9e36cccb5910 (Douglas Gregor 2012-04-12 20:48:09 +0000 3302) bool CStyle) { +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3303) const AtomicType *ToAtomic = ToType->getAs(); +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3304) if (!ToAtomic) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3305) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3306) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3307) StandardConversionSequence InnerSCS; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3308) if (!IsStandardConversion(S, From, ToAtomic->getValueType(), +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3309) InOverloadResolution, InnerSCS, +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3310) CStyle, /*AllowObjCWritebackConversion=*/false)) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3311) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3312) +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3313) SCS.Second = InnerSCS.Second; +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3314) SCS.setToType(1, InnerSCS.getToType(1)); +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3315) SCS.Third = InnerSCS.Third; +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3316) SCS.QualificationIncludesObjCLifetime +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3317) = InnerSCS.QualificationIncludesObjCLifetime; +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3318) SCS.setToType(2, InnerSCS.getToType(2)); +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3319) return true; +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3320) } +c79862f017e37 (Douglas Gregor 2012-04-12 17:51:55 +0000 3321) +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3322) static bool isFirstArgumentCompatibleWithType(ASTContext &Context, +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3323) CXXConstructorDecl *Constructor, +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3324) QualType Type) { +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 3325) const auto *CtorType = Constructor->getType()->castAs(); +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 3326) if (CtorType->getNumParams() > 0) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 3327) QualType FirstArg = CtorType->getParamType(0); +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3328) if (Context.hasSameUnqualifiedType(Type, FirstArg.getNonReferenceType())) +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3329) return true; +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3330) } +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3331) return false; +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3332) } +e541716286fe6 (Sebastian Redl 2012-03-27 18:33:03 +0000 3333) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3334) static OverloadingResult +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3335) IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3336) CXXRecordDecl *To, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3337) UserDefinedConversionSequence &User, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3338) OverloadCandidateSet &CandidateSet, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3339) bool AllowExplicit) { +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 3340) CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion); +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3341) for (auto *D : S.LookupConstructors(To)) { +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3342) auto Info = getConstructorInfo(D); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 3343) if (!Info) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3344) continue; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3345) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3346) bool Usable = !Info.Constructor->isInvalidDecl() && +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3347) S.isInitListConstructor(Info.Constructor); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3348) if (Usable) { +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3349) bool SuppressUserConversions = false; +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3350) if (Info.ConstructorTmpl) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3351) S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl, +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3352) /*ExplicitArgs*/ nullptr, From, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3353) CandidateSet, SuppressUserConversions, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3354) /*PartialOverloading*/ false, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3355) AllowExplicit); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3356) else +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3357) S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, From, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3358) CandidateSet, SuppressUserConversions, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3359) /*PartialOverloading*/ false, AllowExplicit); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3360) } +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3361) } +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3362) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3363) bool HadMultipleCandidates = (CandidateSet.size() > 1); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3364) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3365) OverloadCandidateSet::iterator Best; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3366) switch (auto Result = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3367) CandidateSet.BestViableFunction(S, From->getBeginLoc(), Best)) { +dcf06f42324a3 (Fariborz Jahanian 2015-04-14 17:21:58 +0000 3368) case OR_Deleted: +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3369) case OR_Success: { +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3370) // Record the standard conversion we used and the conversion function. +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3371) CXXConstructorDecl *Constructor = cast(Best->Function); +5488ab4ddd47a (Brian Gesiak 2019-01-11 01:54:53 +0000 3372) QualType ThisType = Constructor->getThisType(); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3373) // Initializer lists don't have conversions as such. +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3374) User.Before.setAsIdentityConversion(); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3375) User.HadMultipleCandidates = HadMultipleCandidates; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3376) User.ConversionFunction = Constructor; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3377) User.FoundConversionFunction = Best->FoundDecl; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3378) User.After.setAsIdentityConversion(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 3379) User.After.setFromType(ThisType->castAs()->getPointeeType()); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3380) User.After.setAllToTypes(ToType); +dcf06f42324a3 (Fariborz Jahanian 2015-04-14 17:21:58 +0000 3381) return Result; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3382) } +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3383) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3384) case OR_No_Viable_Function: +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3385) return OR_No_Viable_Function; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3386) case OR_Ambiguous: +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3387) return OR_Ambiguous; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3388) } +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3389) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3390) llvm_unreachable("Invalid OverloadResult!"); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3391) } +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3392) +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3393) /// Determines whether there is a user-defined conversion sequence +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3394) /// (C++ [over.ics.user]) that converts expression From to the type +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3395) /// ToType. If such a conversion exists, User will contain the +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3396) /// user-defined conversion sequence that performs such a conversion +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3397) /// and this routine will return true. Otherwise, this routine returns +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3398) /// false and User is unspecified. +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3399) /// +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3400) /// \param AllowExplicit true if the conversion should consider C++0x +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3401) /// "explicit" conversion functions as well as non-explicit conversion +576e98cc1e513 (Douglas Gregor 2009-01-30 23:27:23 +0000 3402) /// functions (C++0x [class.conv.fct]p2). +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3403) /// +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3404) /// \param AllowObjCConversionOnExplicit true if the conversion should +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3405) /// allow an extra Objective-C pointer conversion on uses of explicit +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3406) /// constructors. Requires \c AllowExplicit to also be set. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3407) static OverloadingResult +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3408) IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3409) UserDefinedConversionSequence &User, +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3410) OverloadCandidateSet &CandidateSet, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3411) AllowedExplicit AllowExplicit, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3412) bool AllowObjCConversionOnExplicit) { +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3413) assert(AllowExplicit != AllowedExplicit::None || +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3414) !AllowObjCConversionOnExplicit); +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 3415) CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion); +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 3416) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3417) // Whether we will only visit constructors. +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3418) bool ConstructorsOnly = false; +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3419) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3420) // If the type we are conversion to is a class type, enumerate its +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3421) // constructors. +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 3422) if (const RecordType *ToRecordType = ToType->getAs()) { +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3423) // C++ [over.match.ctor]p1: +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3424) // When objects of class type are direct-initialized (8.5), or +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3425) // copy-initialized from an expression of the same or a +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3426) // derived class type (8.5), overload resolution selects the +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3427) // constructor. [...] For copy-initialization, the candidate +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3428) // functions are all the converting constructors (12.3.1) of +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3429) // that class. The argument list is the expression-list within +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3430) // the parentheses of the initializer. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3431) if (S.Context.hasSameUnqualifiedType(ToType, From->getType()) || +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3432) (From->getType()->getAs() && +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3433) S.IsDerivedFrom(From->getBeginLoc(), From->getType(), ToType))) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3434) ConstructorsOnly = true; +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3435) +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 3436) if (!S.isCompleteType(From->getExprLoc(), ToType)) { +3ec1bf240d4ab (Douglas Gregor 2009-11-05 13:06:35 +0000 3437) // We're not going to find any constructors. +3ec1bf240d4ab (Douglas Gregor 2009-11-05 13:06:35 +0000 3438) } else if (CXXRecordDecl *ToRecordDecl +3ec1bf240d4ab (Douglas Gregor 2009-11-05 13:06:35 +0000 3439) = dyn_cast(ToRecordType->getDecl())) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3440) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3441) Expr **Args = &From; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3442) unsigned NumArgs = 1; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3443) bool ListInitializing = false; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3444) if (InitListExpr *InitList = dyn_cast(From)) { +60509af49add1 (Benjamin Kramer 2013-09-09 14:48:42 +0000 3445) // But first, see if there is an init-list-constructor that will work. +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3446) OverloadingResult Result = IsInitializerListConstructorConversion( +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3447) S, From, ToType, ToRecordDecl, User, CandidateSet, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3448) AllowExplicit == AllowedExplicit::All); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3449) if (Result != OR_No_Viable_Function) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3450) return Result; +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3451) // Never mind. +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 3452) CandidateSet.clear( +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 3453) OverloadCandidateSet::CSK_InitByUserDefinedConversion); +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3454) +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3455) // If we're list-initializing, we pass the individual elements as +82ace98d5505e (Sebastian Redl 2012-02-11 23:51:08 +0000 3456) // arguments, not the entire list. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3457) Args = InitList->getInits(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3458) NumArgs = InitList->getNumInits(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3459) ListInitializing = true; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3460) } +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3461) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3462) for (auto *D : S.LookupConstructors(ToRecordDecl)) { +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3463) auto Info = getConstructorInfo(D); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 3464) if (!Info) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3465) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3466) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3467) bool Usable = !Info.Constructor->isInvalidDecl(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3468) if (!ListInitializing) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3469) Usable = Usable && Info.Constructor->isConvertingConstructor( +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3470) /*AllowExplicit*/ true); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3471) if (Usable) { +d9170b09e6726 (Sebastian Redl 2012-03-20 21:24:14 +0000 3472) bool SuppressUserConversions = !ConstructorsOnly; +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3473) // C++20 [over.best.ics.general]/4.5: +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3474) // if the target is the first parameter of a constructor [of class +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3475) // X] and the constructor [...] is a candidate by [...] the second +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3476) // phase of [over.match.list] when the initializer list has exactly +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3477) // one element that is itself an initializer list, [...] and the +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3478) // conversion is to X or reference to cv X, user-defined conversion +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3479) // sequences are not cnosidered. +d9170b09e6726 (Sebastian Redl 2012-03-20 21:24:14 +0000 3480) if (SuppressUserConversions && ListInitializing) { +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3481) SuppressUserConversions = +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3482) NumArgs == 1 && isa(Args[0]) && +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3483) isFirstArgumentCompatibleWithType(S.Context, Info.Constructor, +40beb1f84a3d7 (Richard Smith 2021-04-22 16:48:34 -0700 3484) ToType); +d9170b09e6726 (Sebastian Redl 2012-03-20 21:24:14 +0000 3485) } +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3486) if (Info.ConstructorTmpl) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3487) S.AddTemplateOverloadCandidate( +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3488) Info.ConstructorTmpl, Info.FoundDecl, +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3489) /*ExplicitArgs*/ nullptr, llvm::makeArrayRef(Args, NumArgs), +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3490) CandidateSet, SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3491) /*PartialOverloading*/ false, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3492) AllowExplicit == AllowedExplicit::All); +5ed5ae476e5c7 (Douglas Gregor 2009-08-21 18:42:58 +0000 3493) else +b3c44f9ee9e66 (Fariborz Jahanian 2009-10-01 20:39:51 +0000 3494) // Allow one user-defined conversion when user specifies a +b3c44f9ee9e66 (Fariborz Jahanian 2009-10-01 20:39:51 +0000 3495) // From->ToType conversion via an static cast (c-style, etc). +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 3496) S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 3497) llvm::makeArrayRef(Args, NumArgs), +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 3498) CandidateSet, SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3499) /*PartialOverloading*/ false, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3500) AllowExplicit == AllowedExplicit::All); +5ed5ae476e5c7 (Douglas Gregor 2009-08-21 18:42:58 +0000 3501) } +89ee6822d8a6a (Douglas Gregor 2009-02-28 01:32:25 +0000 3502) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3503) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3504) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3505) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3506) // Enumerate conversion functions, if we're allowed to. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3507) if (ConstructorsOnly || isa(From)) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3508) } else if (!S.isCompleteType(From->getBeginLoc(), From->getType())) { +8a2e601917708 (Douglas Gregor 2009-08-24 15:23:48 +0000 3509) // No conversion functions from incomplete types. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3510) } else if (const RecordType *FromRecordType = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3511) From->getType()->getAs()) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 3512) if (CXXRecordDecl *FromRecordDecl +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3513) = dyn_cast(FromRecordType->getDecl())) { +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3514) // Add all of the conversion functions as candidates. +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 3515) const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions(); +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 3516) for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 3517) DeclAccessPair FoundDecl = I.getPair(); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 3518) NamedDecl *D = FoundDecl.getDecl(); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 3519) CXXRecordDecl *ActingContext = cast(D->getDeclContext()); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 3520) if (isa(D)) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 3521) D = cast(D)->getTargetDecl(); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 3522) +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3523) CXXConversionDecl *Conv; +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3524) FunctionTemplateDecl *ConvTemplate; +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 3525) if ((ConvTemplate = dyn_cast(D))) +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 3526) Conv = cast(ConvTemplate->getTemplatedDecl()); +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3527) else +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 3528) Conv = cast(D); +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3529) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3530) if (ConvTemplate) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3531) S.AddTemplateConversionCandidate( +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3532) ConvTemplate, FoundDecl, ActingContext, From, ToType, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3533) CandidateSet, AllowObjCConversionOnExplicit, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3534) AllowExplicit != AllowedExplicit::None); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 3535) else +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3536) S.AddConversionCandidate(Conv, FoundDecl, ActingContext, From, ToType, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3537) CandidateSet, AllowObjCConversionOnExplicit, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3538) AllowExplicit != AllowedExplicit::None); +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3539) } +f9012a3e9d9e7 (Fariborz Jahanian 2009-09-11 18:46:22 +0000 3540) } +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 3541) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3542) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 3543) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 3544) +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3545) OverloadCandidateSet::iterator Best; +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3546) switch (auto Result = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3547) CandidateSet.BestViableFunction(S, From->getBeginLoc(), Best)) { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3548) case OR_Success: +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 3549) case OR_Deleted: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3550) // Record the standard conversion we used and the conversion function. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3551) if (CXXConstructorDecl *Constructor +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3552) = dyn_cast(Best->Function)) { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3553) // C++ [over.ics.user]p1: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3554) // If the user-defined conversion is specified by a +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3555) // constructor (12.3.1), the initial standard conversion +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3556) // sequence converts the source type to the type required by +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3557) // the argument of the constructor. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3558) // +5488ab4ddd47a (Brian Gesiak 2019-01-11 01:54:53 +0000 3559) QualType ThisType = Constructor->getThisType(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3560) if (isa(From)) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3561) // Initializer lists don't have conversions as such. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3562) User.Before.setAsIdentityConversion(); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3563) } else { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3564) if (Best->Conversions[0].isEllipsis()) +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3565) User.EllipsisConversion = true; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3566) else { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3567) User.Before = Best->Conversions[0].Standard; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3568) User.EllipsisConversion = false; +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 3569) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3570) } +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 3571) User.HadMultipleCandidates = HadMultipleCandidates; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3572) User.ConversionFunction = Constructor; +30909031a7f76 (John McCall 2011-09-21 08:36:56 +0000 3573) User.FoundConversionFunction = Best->FoundDecl; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3574) User.After.setAsIdentityConversion(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 3575) User.After.setFromType(ThisType->castAs()->getPointeeType()); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3576) User.After.setAllToTypes(ToType); +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 3577) return Result; +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 3578) } +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 3579) if (CXXConversionDecl *Conversion +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3580) = dyn_cast(Best->Function)) { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3581) // C++ [over.ics.user]p1: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3582) // +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3583) // [...] If the user-defined conversion is specified by a +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3584) // conversion function (12.3.2), the initial standard +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3585) // conversion sequence converts the source type to the +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3586) // implicit object parameter of the conversion function. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3587) User.Before = Best->Conversions[0].Standard; +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 3588) User.HadMultipleCandidates = HadMultipleCandidates; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3589) User.ConversionFunction = Conversion; +30909031a7f76 (John McCall 2011-09-21 08:36:56 +0000 3590) User.FoundConversionFunction = Best->FoundDecl; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3591) User.EllipsisConversion = false; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3592) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3593) // C++ [over.ics.user]p2: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3594) // The second standard conversion sequence converts the +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3595) // result of the user-defined conversion to the target type +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3596) // for the sequence. Since an implicit conversion sequence +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3597) // is an initialization, the special rules for +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3598) // initialization by user-defined conversion apply when +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3599) // selecting the best user-defined conversion for a +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3600) // user-defined conversion sequence (see 13.3.3 and +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3601) // 13.3.3.1). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3602) User.After = Best->FinalConversion; +48372b68fefb9 (Richard Smith 2015-01-27 03:30:40 +0000 3603) return Result; +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3604) } +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 3605) llvm_unreachable("Not a constructor or conversion function?"); +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3606) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3607) case OR_No_Viable_Function: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3608) return OR_No_Viable_Function; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3609) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3610) case OR_Ambiguous: +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3611) return OR_Ambiguous; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3612) } +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3613) +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 3614) llvm_unreachable("Invalid OverloadResult!"); +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3615) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3616) +f0647a5fbcebf (Fariborz Jahanian 2009-09-22 20:24:30 +0000 3617) bool +76197416ac15c (Fariborz Jahanian 2009-11-18 18:26:29 +0000 3618) Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) { +f0647a5fbcebf (Fariborz Jahanian 2009-09-22 20:24:30 +0000 3619) ImplicitConversionSequence ICS; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 3620) OverloadCandidateSet CandidateSet(From->getExprLoc(), +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 3621) OverloadCandidateSet::CSK_Normal); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3622) OverloadingResult OvResult = +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3623) IsUserDefinedConversion(*this, From, ToType, ICS.UserDefined, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 3624) CandidateSet, AllowedExplicit::None, false); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3625) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3626) if (!(OvResult == OR_Ambiguous || +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3627) (OvResult == OR_No_Viable_Function && !CandidateSet.empty()))) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3628) return false; +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3629) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 3630) auto Cands = CandidateSet.CompleteCandidates( +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 3631) *this, +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 3632) OvResult == OR_Ambiguous ? OCD_AmbiguousCandidates : OCD_AllCandidates, +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 3633) From); +76197416ac15c (Fariborz Jahanian 2009-11-18 18:26:29 +0000 3634) if (OvResult == OR_Ambiguous) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3635) Diag(From->getBeginLoc(), diag::err_typecheck_ambiguous_condition) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3636) << From->getType() << ToType << From->getSourceRange(); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3637) else { // OR_No_Viable_Function && !CandidateSet.empty() +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3638) if (!RequireCompleteType(From->getBeginLoc(), ToType, +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3639) diag::err_typecheck_nonviable_condition_incomplete, +64cf3efd47bc7 (Larisse Voufo 2013-06-27 01:50:25 +0000 3640) From->getType(), From->getSourceRange())) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 3641) Diag(From->getBeginLoc(), diag::err_typecheck_nonviable_condition) +08426e2098aaa (Nick Lewycky 2015-08-25 22:18:46 +0000 3642) << false << From->getType() << From->getSourceRange() << ToType; +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3643) } +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3644) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3645) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 3646) *this, From, Cands); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3647) return true; +f0647a5fbcebf (Fariborz Jahanian 2009-09-22 20:24:30 +0000 3648) } +26bee0b326227 (Douglas Gregor 2008-10-31 16:23:19 +0000 3649) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3650) // Helper for compareConversionFunctions that gets the FunctionType that the +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3651) // conversion-operator return value 'points' to, or nullptr. +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3652) static const FunctionType * +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3653) getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv) { +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3654) const FunctionType *ConvFuncTy = Conv->getType()->castAs(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3655) const PointerType *RetPtrTy = +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3656) ConvFuncTy->getReturnType()->getAs(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3657) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3658) if (!RetPtrTy) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3659) return nullptr; +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3660) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3661) return RetPtrTy->getPointeeType()->getAs(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3662) } +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3663) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 3664) /// Compare the user-defined conversion functions or constructors +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3665) /// of two user-defined conversion sequences to determine whether any ordering +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3666) /// is possible. +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3667) static ImplicitConversionSequence::CompareKind +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3668) compareConversionFunctions(Sema &S, FunctionDecl *Function1, +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3669) FunctionDecl *Function2) { +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3670) CXXConversionDecl *Conv1 = dyn_cast_or_null(Function1); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3671) CXXConversionDecl *Conv2 = dyn_cast_or_null(Function2); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3672) if (!Conv1 || !Conv2) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3673) return ImplicitConversionSequence::Indistinguishable; +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3674) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3675) if (!Conv1->getParent()->isLambda() || !Conv2->getParent()->isLambda()) +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3676) return ImplicitConversionSequence::Indistinguishable; +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3677) +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3678) // Objective-C++: +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3679) // If both conversion functions are implicitly-declared conversions from +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3680) // a lambda closure type to a function pointer and a block pointer, +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3681) // respectively, always prefer the conversion to a function pointer, +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3682) // because the function pointer is more lightweight and is more likely +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3683) // to keep code working. +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3684) if (S.getLangOpts().ObjC && S.getLangOpts().CPlusPlus11) { +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3685) bool Block1 = Conv1->getConversionType()->isBlockPointerType(); +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3686) bool Block2 = Conv2->getConversionType()->isBlockPointerType(); +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3687) if (Block1 != Block2) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3688) return Block1 ? ImplicitConversionSequence::Worse +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3689) : ImplicitConversionSequence::Better; +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3690) } +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3691) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3692) // In order to support multiple calling conventions for the lambda conversion +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3693) // operator (such as when the free and member function calling convention is +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3694) // different), prefer the 'free' mechanism, followed by the calling-convention +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3695) // of operator(). The latter is in place to support the MSVC-like solution of +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3696) // defining ALL of the possible conversions in regards to calling-convention. +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3697) const FunctionType *Conv1FuncRet = getConversionOpReturnTyAsFunction(Conv1); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3698) const FunctionType *Conv2FuncRet = getConversionOpReturnTyAsFunction(Conv2); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3699) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3700) if (Conv1FuncRet && Conv2FuncRet && +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3701) Conv1FuncRet->getCallConv() != Conv2FuncRet->getCallConv()) { +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3702) CallingConv Conv1CC = Conv1FuncRet->getCallConv(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3703) CallingConv Conv2CC = Conv2FuncRet->getCallConv(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3704) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3705) CXXMethodDecl *CallOp = Conv2->getParent()->getLambdaCallOperator(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3706) const FunctionProtoType *CallOpProto = +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3707) CallOp->getType()->getAs(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3708) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3709) CallingConv CallOpCC = +2901dc7575873 (Simon Pilgrim 2021-04-06 12:04:01 +0100 3710) CallOp->getType()->castAs()->getCallConv(); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3711) CallingConv DefaultFree = S.Context.getDefaultCallingConvention( +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3712) CallOpProto->isVariadic(), /*IsCXXMethod=*/false); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3713) CallingConv DefaultMember = S.Context.getDefaultCallingConvention( +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3714) CallOpProto->isVariadic(), /*IsCXXMethod=*/true); +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3715) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3716) CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC}; +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3717) for (CallingConv CC : PrefOrder) { +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3718) if (Conv1CC == CC) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3719) return ImplicitConversionSequence::Better; +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3720) if (Conv2CC == CC) +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3721) return ImplicitConversionSequence::Worse; +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3722) } +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3723) } +ec809e4cfe0be (Erich Keane 2020-10-16 09:09:09 -0700 3724) +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3725) return ImplicitConversionSequence::Indistinguishable; +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3726) } +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3727) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3728) static bool hasDeprecatedStringLiteralToCharPtrConversion( +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3729) const ImplicitConversionSequence &ICS) { +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3730) return (ICS.isStandard() && ICS.Standard.DeprecatedStringLiteralToCharPtr) || +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3731) (ICS.isUserDefined() && +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3732) ICS.UserDefined.Before.DeprecatedStringLiteralToCharPtr); +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3733) } +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3734) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3735) /// CompareImplicitConversionSequences - Compare two implicit +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3736) /// conversion sequences to determine whether one is better than the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3737) /// other or if they are indistinguishable (C++ 13.3.3.2). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3738) static ImplicitConversionSequence::CompareKind +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 3739) CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3740) const ImplicitConversionSequence& ICS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3741) const ImplicitConversionSequence& ICS2) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3742) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3743) // (C++ 13.3.3.2p2): When comparing the basic forms of implicit +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3744) // conversion sequences (as defined in 13.3.3.1) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3745) // -- a standard conversion sequence (13.3.3.1.1) is a better +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3746) // conversion sequence than a user-defined conversion sequence or +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3747) // an ellipsis conversion sequence, and +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3748) // -- a user-defined conversion sequence (13.3.3.1.2) is a better +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3749) // conversion sequence than an ellipsis conversion sequence +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3750) // (13.3.3.1.3). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 3751) // +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3752) // C++0x [over.best.ics]p10: +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3753) // For the purpose of ranking implicit conversion sequences as +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3754) // described in 13.3.3.2, the ambiguous conversion sequence is +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3755) // treated as a user-defined sequence that is indistinguishable +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3756) // from any other user-defined conversion sequence. +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3757) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3758) // String literal to 'char *' conversion has been deprecated in C++03. It has +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3759) // been removed from C++11. We still accept this conversion, if it happens at +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3760) // the best viable function. Otherwise, this conversion is considered worse +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3761) // than ellipsis conversion. Consider this as an extension; this is not in the +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3762) // standard. For example: +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3763) // +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3764) // int &f(...); // #1 +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3765) // void f(char*); // #2 +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3766) // void g() { int &r = f("foo"); } +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3767) // +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3768) // In C++03, we pick #2 as the best viable function. +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3769) // In C++11, we pick #1 as the best viable function, because ellipsis +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3770) // conversion is better than string-literal to char* conversion (since there +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3771) // is no such conversion in C++11). If there was no #1 at all or #1 couldn't +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3772) // convert arguments, #2 would be the best viable function in C++11. +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3773) // If the best viable function has this conversion, a warning will be issued +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3774) // in C++03, or an ExtWarn (+SFINAE failure) will be issued in C++11. +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3775) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3776) if (S.getLangOpts().CPlusPlus11 && !S.getLangOpts().WritableStrings && +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3777) hasDeprecatedStringLiteralToCharPtrConversion(ICS1) != +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3778) hasDeprecatedStringLiteralToCharPtrConversion(ICS2)) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3779) return hasDeprecatedStringLiteralToCharPtrConversion(ICS1) +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3780) ? ImplicitConversionSequence::Worse +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3781) : ImplicitConversionSequence::Better; +1121de36c26b9 (Ismail Pazarbasi 2014-01-17 21:08:52 +0000 3782) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3783) if (ICS1.getKindRank() < ICS2.getKindRank()) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3784) return ImplicitConversionSequence::Better; +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 3785) if (ICS2.getKindRank() < ICS1.getKindRank()) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 3786) return ImplicitConversionSequence::Worse; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3787) +98ff7f873089b (Benjamin Kramer 2010-04-18 12:05:54 +0000 3788) // The following checks require both conversion sequences to be of +98ff7f873089b (Benjamin Kramer 2010-04-18 12:05:54 +0000 3789) // the same kind. +98ff7f873089b (Benjamin Kramer 2010-04-18 12:05:54 +0000 3790) if (ICS1.getKind() != ICS2.getKind()) +98ff7f873089b (Benjamin Kramer 2010-04-18 12:05:54 +0000 3791) return ImplicitConversionSequence::Indistinguishable; +98ff7f873089b (Benjamin Kramer 2010-04-18 12:05:54 +0000 3792) +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3793) ImplicitConversionSequence::CompareKind Result = +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3794) ImplicitConversionSequence::Indistinguishable; +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3795) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3796) // Two implicit conversion sequences of the same form are +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3797) // indistinguishable conversion sequences unless one of the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3798) // following rules apply: (C++ 13.3.3.2p3): +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3799) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3800) // List-initialization sequence L1 is a better conversion sequence than +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3801) // list-initialization sequence L2 if: +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3802) // - L1 converts to std::initializer_list for some X and L2 does not, or, +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3803) // if not that, +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3804) // — L1 and L2 convert to arrays of the same element type, and either the +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3805) // number of elements n_1 initialized by L1 is less than the number of +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3806) // elements n_2 initialized by L2, or (unimplemented:C++20) n_1 = n_2 and L2 +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3807) // converts to an array of unknown bound and L1 does not, +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3808) // even if one of the other rules in this paragraph would otherwise apply. +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3809) if (!ICS1.isBad()) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3810) bool StdInit1 = false, StdInit2 = false; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3811) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3812) if (ICS1.isInitializerListToType()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3813) StdInit1 = +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3814) S.isStdInitializerList(ICS1.getInitializerListToType(), nullptr); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3815) if (ICS2.isInitializerListToType()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3816) StdInit2 = +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3817) S.isStdInitializerList(ICS2.getInitializerListToType(), nullptr); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3818) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3819) if (StdInit1 && !StdInit2) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3820) return ImplicitConversionSequence::Better; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3821) if (!StdInit1 && StdInit2) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3822) return ImplicitConversionSequence::Worse; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3823) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3824) if (ICS1.isInitializerListToType() && ICS2.isInitializerListToType()) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3825) if (auto *AT1 = +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3826) S.Context.getAsArrayType(ICS1.getInitializerListToType())) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3827) if (auto *AT2 = +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3828) S.Context.getAsArrayType(ICS2.getInitializerListToType())) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3829) if (AT1->getElementType() == AT2->getElementType()) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3830) if (auto CAT1 = dyn_cast(AT1)) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3831) if (auto CAT2 = dyn_cast(AT2)) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3832) if (CAT1->getSize() != CAT2->getSize()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3833) return CAT1->getSize().ult(CAT2->getSize()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3834) ? ImplicitConversionSequence::Better +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3835) : ImplicitConversionSequence::Worse; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3836) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3837) llvm_unreachable("C++20 incomplete array init?"); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3838) } else if (isa(AT2)) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3839) llvm_unreachable("C++20 incomplete array init?"); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3840) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3841) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3842) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 3843) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3844) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3845) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3846) if (ICS1.isStandard()) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3847) // Standard conversion sequence S1 is a better conversion sequence than +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 3848) // standard conversion sequence S2 if [...] +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 3849) Result = CompareStandardConversionSequences(S, Loc, +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3850) ICS1.Standard, ICS2.Standard); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 3851) else if (ICS1.isUserDefined()) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3852) // User-defined conversion sequence U1 is a better conversion +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3853) // sequence than another user-defined conversion sequence U2 if +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3854) // they contain the same user-defined conversion function or +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3855) // constructor and if the second standard conversion sequence of +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3856) // U1 is better than the second standard conversion sequence of +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3857) // U2 (C++ 13.3.3.2p3). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 3858) if (ICS1.UserDefined.ConversionFunction == +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3859) ICS2.UserDefined.ConversionFunction) +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 3860) Result = CompareStandardConversionSequences(S, Loc, +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3861) ICS1.UserDefined.After, +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3862) ICS2.UserDefined.After); +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3863) else +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 3864) Result = compareConversionFunctions(S, +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3865) ICS1.UserDefined.ConversionFunction, +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 3866) ICS2.UserDefined.ConversionFunction); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3867) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3868) +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 3869) return Result; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3870) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3871) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3872) // Per 13.3.3.2p3, compare the given standard conversion sequences to +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3873) // determine if one is a proper subset of the other. +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3874) static ImplicitConversionSequence::CompareKind +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3875) compareStandardConversionSubsets(ASTContext &Context, +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3876) const StandardConversionSequence& SCS1, +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3877) const StandardConversionSequence& SCS2) { +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3878) ImplicitConversionSequence::CompareKind Result +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3879) = ImplicitConversionSequence::Indistinguishable; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3880) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3881) // the identity conversion sequence is considered to be a subsequence of +e87561aa2efec (Douglas Gregor 2010-05-23 22:10:15 +0000 3882) // any non-identity conversion sequence +377c109f21e01 (Douglas Gregor 2011-06-05 06:15:20 +0000 3883) if (SCS1.isIdentityConversion() && !SCS2.isIdentityConversion()) +377c109f21e01 (Douglas Gregor 2011-06-05 06:15:20 +0000 3884) return ImplicitConversionSequence::Better; +377c109f21e01 (Douglas Gregor 2011-06-05 06:15:20 +0000 3885) else if (!SCS1.isIdentityConversion() && SCS2.isIdentityConversion()) +377c109f21e01 (Douglas Gregor 2011-06-05 06:15:20 +0000 3886) return ImplicitConversionSequence::Worse; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3887) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3888) if (SCS1.Second != SCS2.Second) { +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3889) if (SCS1.Second == ICK_Identity) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3890) Result = ImplicitConversionSequence::Better; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3891) else if (SCS2.Second == ICK_Identity) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3892) Result = ImplicitConversionSequence::Worse; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3893) else +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3894) return ImplicitConversionSequence::Indistinguishable; +a3405ffcecc6a (Richard Smith 2018-07-11 00:19:19 +0000 3895) } else if (!Context.hasSimilarType(SCS1.getToType(1), SCS2.getToType(1))) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3896) return ImplicitConversionSequence::Indistinguishable; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3897) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3898) if (SCS1.Third == SCS2.Third) { +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3899) return Context.hasSameType(SCS1.getToType(2), SCS2.getToType(2))? Result +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3900) : ImplicitConversionSequence::Indistinguishable; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3901) } +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3902) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3903) if (SCS1.Third == ICK_Identity) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3904) return Result == ImplicitConversionSequence::Worse +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3905) ? ImplicitConversionSequence::Indistinguishable +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3906) : ImplicitConversionSequence::Better; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3907) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3908) if (SCS2.Third == ICK_Identity) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3909) return Result == ImplicitConversionSequence::Better +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3910) ? ImplicitConversionSequence::Indistinguishable +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3911) : ImplicitConversionSequence::Worse; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3912) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3913) return ImplicitConversionSequence::Indistinguishable; +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3914) } +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3915) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 3916) /// Determine whether one of the given reference bindings is better +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3917) /// than the other based on what kind of bindings they are. +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 3918) static bool +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 3919) isBetterReferenceBindingKind(const StandardConversionSequence &SCS1, +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 3920) const StandardConversionSequence &SCS2) { +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3921) // C++0x [over.ics.rank]p3b4: +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3922) // -- S1 and S2 are reference bindings (8.5.3) and neither refers to an +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3923) // implicit object parameter of a non-static member function declared +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3924) // without a ref-qualifier, and *either* S1 binds an rvalue reference +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3925) // to an rvalue and S2 binds an lvalue reference *or S1 binds an +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3926) // lvalue reference to a function lvalue and S2 binds an rvalue +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3927) // reference*. +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3928) // +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3929) // FIXME: Rvalue references. We're going rogue with the above edits, +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3930) // because the semantics in the current C++0x working paper (N3225 at the +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3931) // time of this writing) break the standard definition of std::forward +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3932) // and std::reference_wrapper when dealing with references to functions. +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3933) // Proposed wording changes submitted to CWG for consideration. +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 3934) if (SCS1.BindsImplicitObjectArgumentWithoutRefQualifier || +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 3935) SCS2.BindsImplicitObjectArgumentWithoutRefQualifier) +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 3936) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3937) +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3938) return (!SCS1.IsLvalueReference && SCS1.BindsToRvalue && +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3939) SCS2.IsLvalueReference) || +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3940) (SCS1.IsLvalueReference && SCS1.BindsToFunctionLvalue && +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 3941) !SCS2.IsLvalueReference && SCS2.BindsToFunctionLvalue); +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 3942) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 3943) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3944) enum class FixedEnumPromotion { +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3945) None, +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3946) ToUnderlyingType, +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3947) ToPromotedUnderlyingType +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3948) }; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3949) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3950) /// Returns kind of fixed enum promotion the \a SCS uses. +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3951) static FixedEnumPromotion +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3952) getFixedEnumPromtion(Sema &S, const StandardConversionSequence &SCS) { +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3953) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3954) if (SCS.Second != ICK_Integral_Promotion) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3955) return FixedEnumPromotion::None; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3956) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3957) QualType FromType = SCS.getFromType(); +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3958) if (!FromType->isEnumeralType()) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3959) return FixedEnumPromotion::None; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3960) +2901dc7575873 (Simon Pilgrim 2021-04-06 12:04:01 +0100 3961) EnumDecl *Enum = FromType->castAs()->getDecl(); +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3962) if (!Enum->isFixed()) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3963) return FixedEnumPromotion::None; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3964) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3965) QualType UnderlyingType = Enum->getIntegerType(); +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3966) if (S.Context.hasSameType(SCS.getToType(1), UnderlyingType)) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3967) return FixedEnumPromotion::ToUnderlyingType; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3968) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3969) return FixedEnumPromotion::ToPromotedUnderlyingType; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3970) } +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 3971) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3972) /// CompareStandardConversionSequences - Compare two standard +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3973) /// conversion sequences to determine whether one is better than the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3974) /// other or if they are indistinguishable (C++ 13.3.3.2p3). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3975) static ImplicitConversionSequence::CompareKind +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 3976) CompareStandardConversionSequences(Sema &S, SourceLocation Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3977) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3978) const StandardConversionSequence& SCS2) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3979) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3980) // Standard conversion sequence S1 is a better conversion sequence +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3981) // than standard conversion sequence S2 if (C++ 13.3.3.2p3): +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3982) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3983) // -- S1 is a proper subsequence of S2 (comparing the conversion +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3984) // sequences in the canonical form defined by 13.3.3.1.1, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3985) // excluding any Lvalue Transformation; the identity conversion +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3986) // sequence is considered to be a subsequence of any +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3987) // non-identity conversion sequence) or, if not that, +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3988) if (ImplicitConversionSequence::CompareKind CK +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 3989) = compareStandardConversionSubsets(S.Context, SCS1, SCS2)) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 3990) return CK; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3991) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3992) // -- the rank of S1 is better than the rank of S2 (by the rules +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3993) // defined below), or, if not that, +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3994) ImplicitConversionRank Rank1 = SCS1.getRank(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3995) ImplicitConversionRank Rank2 = SCS2.getRank(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3996) if (Rank1 < Rank2) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3997) return ImplicitConversionSequence::Better; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3998) else if (Rank2 < Rank1) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 3999) return ImplicitConversionSequence::Worse; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 4000) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4001) // (C++ 13.3.3.2p4): Two conversion sequences with the same rank +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4002) // are indistinguishable unless one of the following rules +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4003) // applies: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4004) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4005) // A conversion that is not a conversion of a pointer, or +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4006) // pointer to member, to bool is better than another conversion +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4007) // that is such a conversion. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4008) if (SCS1.isPointerConversionToBool() != SCS2.isPointerConversionToBool()) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4009) return SCS2.isPointerConversionToBool() +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4010) ? ImplicitConversionSequence::Better +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4011) : ImplicitConversionSequence::Worse; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4012) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4013) // C++14 [over.ics.rank]p4b2: +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4014) // This is retroactively applied to C++11 by CWG 1601. +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4015) // +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4016) // A conversion that promotes an enumeration whose underlying type is fixed +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4017) // to its underlying type is better than one that promotes to the promoted +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4018) // underlying type, if the two are different. +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4019) FixedEnumPromotion FEP1 = getFixedEnumPromtion(S, SCS1); +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4020) FixedEnumPromotion FEP2 = getFixedEnumPromtion(S, SCS2); +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4021) if (FEP1 != FixedEnumPromotion::None && FEP2 != FixedEnumPromotion::None && +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4022) FEP1 != FEP2) +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4023) return FEP1 == FixedEnumPromotion::ToUnderlyingType +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4024) ? ImplicitConversionSequence::Better +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4025) : ImplicitConversionSequence::Worse; +344df110e56fa (Richard Smith 2019-10-06 18:50:40 +0000 4026) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4027) // C++ [over.ics.rank]p4b2: +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4028) // +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4029) // If class B is derived directly or indirectly from class A, +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4030) // conversion of B* to A* is better than conversion of B* to +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4031) // void*, and conversion of A* to void* is better than conversion +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4032) // of B* to void*. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4033) bool SCS1ConvertsToVoid +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4034) = SCS1.isPointerConversionToVoidPointer(S.Context); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4035) bool SCS2ConvertsToVoid +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4036) = SCS2.isPointerConversionToVoidPointer(S.Context); +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4037) if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) { +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4038) // Exactly one of the conversion sequences is a conversion to +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4039) // a void pointer; it's the worse conversion. +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4040) return SCS2ConvertsToVoid ? ImplicitConversionSequence::Better +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4041) : ImplicitConversionSequence::Worse; +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4042) } else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) { +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4043) // Neither conversion sequence converts to a void pointer; compare +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4044) // their derived-to-base conversions. +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4045) if (ImplicitConversionSequence::CompareKind DerivedCK +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4046) = CompareDerivedToBaseConversions(S, Loc, SCS1, SCS2)) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4047) return DerivedCK; +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4048) } else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid && +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4049) !S.Context.hasSameType(SCS1.getFromType(), SCS2.getFromType())) { +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4050) // Both conversion sequences are conversions to void +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4051) // pointers. Compare the source types to determine if there's an +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4052) // inheritance relationship in their sources. +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 4053) QualType FromType1 = SCS1.getFromType(); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 4054) QualType FromType2 = SCS2.getFromType(); +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4055) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4056) // Adjust the types we're converting from via the array-to-pointer +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4057) // conversion, if we need to. +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4058) if (SCS1.First == ICK_Array_To_Pointer) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4059) FromType1 = S.Context.getArrayDecayedType(FromType1); +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4060) if (SCS2.First == ICK_Array_To_Pointer) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4061) FromType2 = S.Context.getArrayDecayedType(FromType2); +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4062) +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4063) QualType FromPointee1 = FromType1->getPointeeType().getUnqualifiedType(); +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4064) QualType FromPointee2 = FromType2->getPointeeType().getUnqualifiedType(); +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4065) +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4066) if (S.IsDerivedFrom(Loc, FromPointee2, FromPointee1)) +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4067) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4068) else if (S.IsDerivedFrom(Loc, FromPointee1, FromPointee2)) +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4069) return ImplicitConversionSequence::Worse; +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4070) +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4071) // Objective-C++: If one interface is more specific than the +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4072) // other, it is the better one. +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4073) const ObjCObjectPointerType* FromObjCPtr1 +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4074) = FromType1->getAs(); +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4075) const ObjCObjectPointerType* FromObjCPtr2 +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4076) = FromType2->getAs(); +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4077) if (FromObjCPtr1 && FromObjCPtr2) { +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4078) bool AssignLeft = S.Context.canAssignObjCInterfaces(FromObjCPtr1, +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4079) FromObjCPtr2); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4080) bool AssignRight = S.Context.canAssignObjCInterfaces(FromObjCPtr2, +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4081) FromObjCPtr1); +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4082) if (AssignLeft != AssignRight) { +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4083) return AssignLeft? ImplicitConversionSequence::Better +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4084) : ImplicitConversionSequence::Worse; +30ee16f5ddbdf (Douglas Gregor 2011-04-27 00:01:52 +0000 4085) } +1aa450a07872e (Douglas Gregor 2009-12-13 21:37:05 +0000 4086) } +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4087) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4088) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4089) if (SCS1.ReferenceBinding && SCS2.ReferenceBinding) { +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4090) // Check for a better reference binding based on the kind of bindings. +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4091) if (isBetterReferenceBindingKind(SCS1, SCS2)) +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4092) return ImplicitConversionSequence::Better; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4093) else if (isBetterReferenceBindingKind(SCS2, SCS1)) +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4094) return ImplicitConversionSequence::Worse; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4095) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4096) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4097) // Compare based on qualification conversions (C++ 13.3.3.2p3, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4098) // bullet 3). +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4099) if (ImplicitConversionSequence::CompareKind QualCK +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4100) = CompareQualificationConversions(S, SCS1, SCS2)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4101) return QualCK; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4102) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4103) if (SCS1.ReferenceBinding && SCS2.ReferenceBinding) { +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4104) // C++ [over.ics.rank]p3b4: +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4105) // -- S1 and S2 are reference bindings (8.5.3), and the types to +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4106) // which the references refer are the same type except for +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4107) // top-level cv-qualifiers, and the type to which the reference +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4108) // initialized by S2 refers is more cv-qualified than the type +b28b40712121c (Sebastian Redl 2009-03-22 23:49:27 +0000 4109) // to which the reference initialized by S1 refers. +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4110) QualType T1 = SCS1.getToType(2); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4111) QualType T2 = SCS2.getToType(2); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4112) T1 = S.Context.getCanonicalType(T1); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4113) T2 = S.Context.getCanonicalType(T2); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4114) Qualifiers T1Quals, T2Quals; +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4115) QualType UnqualT1 = S.Context.getUnqualifiedArrayType(T1, T1Quals); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4116) QualType UnqualT2 = S.Context.getUnqualifiedArrayType(T2, T2Quals); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4117) if (UnqualT1 == UnqualT2) { +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4118) // Objective-C++ ARC: If the references refer to objects with different +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4119) // lifetimes, prefer bindings that don't change lifetime. +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4120) if (SCS1.ObjCLifetimeConversionBinding != +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4121) SCS2.ObjCLifetimeConversionBinding) { +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4122) return SCS1.ObjCLifetimeConversionBinding +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4123) ? ImplicitConversionSequence::Worse +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4124) : ImplicitConversionSequence::Better; +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4125) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4126) +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4127) // If the type is an array type, promote the element qualifiers to the +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4128) // type for comparison. +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4129) if (isa(T1) && T1Quals) +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4130) T1 = S.Context.getQualifiedType(UnqualT1, T1Quals); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4131) if (isa(T2) && T2Quals) +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4132) T2 = S.Context.getQualifiedType(UnqualT2, T2Quals); +d8018233d1ea4 (David Blaikie 2019-12-27 12:17:01 -0800 4133) if (T2.isMoreQualifiedThan(T1)) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4134) return ImplicitConversionSequence::Better; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4135) if (T1.isMoreQualifiedThan(T2)) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4136) return ImplicitConversionSequence::Worse; +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4137) } +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4138) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4139) +2ec7f639c49fd (Marek Kurdej 2021-04-02 08:57:42 +0200 4140) // In Microsoft mode (below 19.28), prefer an integral conversion to a +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4141) // floating-to-integral conversion if the integral conversion +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4142) // is between types of the same size. +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4143) // For example: +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4144) // void f(float); +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4145) // void f(int); +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4146) // int main { +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4147) // long a; +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4148) // f(a); +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4149) // } +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4150) // Here, MSVC will call f(int) instead of generating a compile error +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4151) // as clang will do in standard mode. +2ec7f639c49fd (Marek Kurdej 2021-04-02 08:57:42 +0200 4152) if (S.getLangOpts().MSVCCompat && +2ec7f639c49fd (Marek Kurdej 2021-04-02 08:57:42 +0200 4153) !S.getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2019_8) && +2ec7f639c49fd (Marek Kurdej 2021-04-02 08:57:42 +0200 4154) SCS1.Second == ICK_Integral_Conversion && +bfa3934f27e72 (Alp Toker 2014-01-14 12:51:41 +0000 4155) SCS2.Second == ICK_Floating_Integral && +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4156) S.Context.getTypeSize(SCS1.getFromType()) == +bfa3934f27e72 (Alp Toker 2014-01-14 12:51:41 +0000 4157) S.Context.getTypeSize(SCS1.getToType(2))) +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4158) return ImplicitConversionSequence::Better; +08d2fa0a78216 (Francois Pichet 2011-09-18 21:37:37 +0000 4159) +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4160) // Prefer a compatible vector conversion over a lax vector conversion +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4161) // For example: +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4162) // +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4163) // typedef float __v4sf __attribute__((__vector_size__(16))); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4164) // void f(vector float); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4165) // void f(vector signed int); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4166) // int main() { +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4167) // __v4sf a; +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4168) // f(a); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4169) // } +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4170) // Here, we'd like to choose f(vector float) and not +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4171) // report an ambiguous call error +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4172) if (SCS1.Second == ICK_Vector_Conversion && +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4173) SCS2.Second == ICK_Vector_Conversion) { +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4174) bool SCS1IsCompatibleVectorConversion = S.Context.areCompatibleVectorTypes( +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4175) SCS1.getFromType(), SCS1.getToType(2)); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4176) bool SCS2IsCompatibleVectorConversion = S.Context.areCompatibleVectorTypes( +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4177) SCS2.getFromType(), SCS2.getToType(2)); +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4178) +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4179) if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion) +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4180) return SCS1IsCompatibleVectorConversion +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4181) ? ImplicitConversionSequence::Better +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4182) : ImplicitConversionSequence::Worse; +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4183) } +64d85a29edd8d (Zi Xuan Wu 2018-11-16 03:00:00 +0000 4184) +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4185) if (SCS1.Second == ICK_SVE_Vector_Conversion && +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4186) SCS2.Second == ICK_SVE_Vector_Conversion) { +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4187) bool SCS1IsCompatibleSVEVectorConversion = +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4188) S.Context.areCompatibleSveTypes(SCS1.getFromType(), SCS1.getToType(2)); +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4189) bool SCS2IsCompatibleSVEVectorConversion = +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4190) S.Context.areCompatibleSveTypes(SCS2.getFromType(), SCS2.getToType(2)); +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4191) +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4192) if (SCS1IsCompatibleSVEVectorConversion != +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4193) SCS2IsCompatibleSVEVectorConversion) +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4194) return SCS1IsCompatibleSVEVectorConversion +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4195) ? ImplicitConversionSequence::Better +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4196) : ImplicitConversionSequence::Worse; +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4197) } +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 4198) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 4199) return ImplicitConversionSequence::Indistinguishable; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 4200) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 4201) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4202) /// CompareQualificationConversions - Compares two standard conversion +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4203) /// sequences to determine whether they can be ranked based on their +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4204) /// qualification conversions (C++ 13.3.3.2p3 bullet 3). +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 4205) static ImplicitConversionSequence::CompareKind +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4206) CompareQualificationConversions(Sema &S, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4207) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4208) const StandardConversionSequence& SCS2) { +4b62ec6353164 (Douglas Gregor 2008-10-22 15:04:37 +0000 4209) // C++ 13.3.3.2p3: +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4210) // -- S1 and S2 differ only in their qualification conversion and +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4211) // yield similar types T1 and T2 (C++ 4.4), respectively, and the +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4212) // cv-qualification signature of type T1 is a proper subset of +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4213) // the cv-qualification signature of type T2, and S1 is not the +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4214) // deprecated string literal array-to-pointer conversion (4.2). +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4215) if (SCS1.First != SCS2.First || SCS1.Second != SCS2.Second || +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4216) SCS1.Third != SCS2.Third || SCS1.Third != ICK_Qualification) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4217) return ImplicitConversionSequence::Indistinguishable; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4218) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4219) // FIXME: the example in the standard doesn't use a qualification +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4220) // conversion (!) +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4221) QualType T1 = SCS1.getToType(2); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4222) QualType T2 = SCS2.getToType(2); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4223) T1 = S.Context.getCanonicalType(T1); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4224) T2 = S.Context.getCanonicalType(T2); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4225) assert(!T1->isReferenceType() && !T2->isReferenceType()); +607f38e05fac3 (Chandler Carruth 2009-12-29 07:16:59 +0000 4226) Qualifiers T1Quals, T2Quals; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4227) QualType UnqualT1 = S.Context.getUnqualifiedArrayType(T1, T1Quals); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4228) QualType UnqualT2 = S.Context.getUnqualifiedArrayType(T2, T2Quals); +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4229) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4230) // If the types are the same, we won't learn anything by unwrapping +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4231) // them. +607f38e05fac3 (Chandler Carruth 2009-12-29 07:16:59 +0000 4232) if (UnqualT1 == UnqualT2) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4233) return ImplicitConversionSequence::Indistinguishable; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4234) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4235) ImplicitConversionSequence::CompareKind Result +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4236) = ImplicitConversionSequence::Indistinguishable; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4237) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4238) // Objective-C++ ARC: +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4239) // Prefer qualification conversions not involving a change in lifetime +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4240) // to qualification conversions that do not change lifetime. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4241) if (SCS1.QualificationIncludesObjCLifetime != +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4242) SCS2.QualificationIncludesObjCLifetime) { +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4243) Result = SCS1.QualificationIncludesObjCLifetime +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4244) ? ImplicitConversionSequence::Worse +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4245) : ImplicitConversionSequence::Better; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4246) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4247) +a3405ffcecc6a (Richard Smith 2018-07-11 00:19:19 +0000 4248) while (S.Context.UnwrapSimilarTypes(T1, T2)) { +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4249) // Within each iteration of the loop, we check the qualifiers to +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4250) // determine if this still looks like a qualification +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4251) // conversion. Then, if all is well, we unwrap one more level of +29a9247ec2515 (Douglas Gregor 2008-10-22 17:49:05 +0000 4252) // pointers or pointers-to-members and do it all again +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4253) // until there are no more pointers or pointers-to-members left +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4254) // to unwrap. This essentially mimics what +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4255) // IsQualificationConversion does, but here we're checking for a +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4256) // strict subset of qualifiers. +ef19af19428b3 (Anastasia Stulova 2019-01-18 11:38:16 +0000 4257) if (T1.getQualifiers().withoutObjCLifetime() == +ef19af19428b3 (Anastasia Stulova 2019-01-18 11:38:16 +0000 4258) T2.getQualifiers().withoutObjCLifetime()) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4259) // The qualifiers are the same, so this doesn't tell us anything +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4260) // about how the sequences rank. +ef19af19428b3 (Anastasia Stulova 2019-01-18 11:38:16 +0000 4261) // ObjC ownership quals are omitted above as they interfere with +ef19af19428b3 (Anastasia Stulova 2019-01-18 11:38:16 +0000 4262) // the ARC overload rule. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4263) ; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4264) else if (T2.isMoreQualifiedThan(T1)) { +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4265) // T1 has fewer qualifiers, so it could be the better sequence. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4266) if (Result == ImplicitConversionSequence::Worse) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4267) // Neither has qualifiers that are a subset of the other's +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4268) // qualifiers. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4269) return ImplicitConversionSequence::Indistinguishable; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4270) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4271) Result = ImplicitConversionSequence::Better; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4272) } else if (T1.isMoreQualifiedThan(T2)) { +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4273) // T2 has fewer qualifiers, so it could be the better sequence. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4274) if (Result == ImplicitConversionSequence::Better) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4275) // Neither has qualifiers that are a subset of the other's +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4276) // qualifiers. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4277) return ImplicitConversionSequence::Indistinguishable; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4278) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4279) Result = ImplicitConversionSequence::Worse; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4280) } else { +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4281) // Qualifiers are disjoint. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4282) return ImplicitConversionSequence::Indistinguishable; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4283) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4284) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4285) // If the types after this point are equivalent, we're done. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4286) if (S.Context.hasSameUnqualifiedType(T1, T2)) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4287) break; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4288) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4289) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4290) // Check that the winning standard conversion sequence isn't using +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4291) // the deprecated string literal array to pointer conversion. +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4292) switch (Result) { +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4293) case ImplicitConversionSequence::Better: +e489a7d3d3972 (Douglas Gregor 2010-02-28 18:30:25 +0000 4294) if (SCS1.DeprecatedStringLiteralToCharPtr) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4295) Result = ImplicitConversionSequence::Indistinguishable; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4296) break; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4297) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4298) case ImplicitConversionSequence::Indistinguishable: +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4299) break; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4300) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4301) case ImplicitConversionSequence::Worse: +e489a7d3d3972 (Douglas Gregor 2010-02-28 18:30:25 +0000 4302) if (SCS2.DeprecatedStringLiteralToCharPtr) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4303) Result = ImplicitConversionSequence::Indistinguishable; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4304) break; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4305) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4306) +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4307) return Result; +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4308) } +e1eb9d8cc4c12 (Douglas Gregor 2008-10-22 14:17:15 +0000 4309) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4310) /// CompareDerivedToBaseConversions - Compares two standard conversion +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4311) /// sequences to determine whether they can be ranked based on their +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 4312) /// various kinds of derived-to-base conversions (C++ +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 4313) /// [over.ics.rank]p4b3). As part of these checks, we also look at +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 4314) /// conversions between Objective-C interface types. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 4315) static ImplicitConversionSequence::CompareKind +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4316) CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4317) const StandardConversionSequence& SCS1, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4318) const StandardConversionSequence& SCS2) { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 4319) QualType FromType1 = SCS1.getFromType(); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4320) QualType ToType1 = SCS1.getToType(1); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 4321) QualType FromType2 = SCS2.getFromType(); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 4322) QualType ToType2 = SCS2.getToType(1); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4323) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4324) // Adjust the types we're converting from via the array-to-pointer +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4325) // conversion, if we need to. +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4326) if (SCS1.First == ICK_Array_To_Pointer) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4327) FromType1 = S.Context.getArrayDecayedType(FromType1); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4328) if (SCS2.First == ICK_Array_To_Pointer) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4329) FromType2 = S.Context.getArrayDecayedType(FromType2); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4330) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4331) // Canonicalize all of the types. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4332) FromType1 = S.Context.getCanonicalType(FromType1); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4333) ToType1 = S.Context.getCanonicalType(ToType1); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4334) FromType2 = S.Context.getCanonicalType(FromType2); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4335) ToType2 = S.Context.getCanonicalType(ToType2); +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4336) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4337) // C++ [over.ics.rank]p4b3: +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4338) // +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4339) // If class B is derived directly or indirectly from class A and +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4340) // class C is derived directly or indirectly from B, +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 4341) // +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4342) // Compare based on pointer conversions. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4343) if (SCS1.Second == ICK_Pointer_Conversion && +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 4344) SCS2.Second == ICK_Pointer_Conversion && +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 4345) /*FIXME: Remove if Objective-C id conversions get their own rank*/ +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 4346) FromType1->isPointerType() && FromType2->isPointerType() && +a29dc05eafe20 (Douglas Gregor 2008-11-27 01:19:21 +0000 4347) ToType1->isPointerType() && ToType2->isPointerType()) { +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4348) QualType FromPointee1 = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4349) FromType1->castAs()->getPointeeType().getUnqualifiedType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4350) QualType ToPointee1 = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4351) ToType1->castAs()->getPointeeType().getUnqualifiedType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4352) QualType FromPointee2 = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4353) FromType2->castAs()->getPointeeType().getUnqualifiedType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4354) QualType ToPointee2 = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4355) ToType2->castAs()->getPointeeType().getUnqualifiedType(); +237f96c40f6bf (Douglas Gregor 2008-11-26 23:31:11 +0000 4356) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4357) // -- conversion of C* to B* is better than conversion of C* to A*, +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4358) if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4359) if (S.IsDerivedFrom(Loc, ToPointee1, ToPointee2)) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4360) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4361) else if (S.IsDerivedFrom(Loc, ToPointee2, ToPointee1)) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4362) return ImplicitConversionSequence::Worse; +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4363) } +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4364) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4365) // -- conversion of B* to A* is better than conversion of C* to A*, +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4366) if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4367) if (S.IsDerivedFrom(Loc, FromPointee2, FromPointee1)) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4368) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4369) else if (S.IsDerivedFrom(Loc, FromPointee1, FromPointee2)) +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4370) return ImplicitConversionSequence::Worse; +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4371) } +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4372) } else if (SCS1.Second == ICK_Pointer_Conversion && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4373) SCS2.Second == ICK_Pointer_Conversion) { +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4374) const ObjCObjectPointerType *FromPtr1 +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4375) = FromType1->getAs(); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4376) const ObjCObjectPointerType *FromPtr2 +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4377) = FromType2->getAs(); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4378) const ObjCObjectPointerType *ToPtr1 +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4379) = ToType1->getAs(); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4380) const ObjCObjectPointerType *ToPtr2 +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4381) = ToType2->getAs(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4382) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4383) if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) { +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4384) // Apply the same conversion ranking rules for Objective-C pointer types +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4385) // that we do for C++ pointers to class types. However, we employ the +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4386) // Objective-C pseudo-subtyping relationship used for assignment of +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4387) // Objective-C pointer types. +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4388) bool FromAssignLeft +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4389) = S.Context.canAssignObjCInterfaces(FromPtr1, FromPtr2); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4390) bool FromAssignRight +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4391) = S.Context.canAssignObjCInterfaces(FromPtr2, FromPtr1); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4392) bool ToAssignLeft +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4393) = S.Context.canAssignObjCInterfaces(ToPtr1, ToPtr2); +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4394) bool ToAssignRight +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4395) = S.Context.canAssignObjCInterfaces(ToPtr2, ToPtr1); +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4396) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4397) // A conversion to an a non-id object pointer type or qualified 'id' +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4398) // type is better than a conversion to 'id'. +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4399) if (ToPtr1->isObjCIdType() && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4400) (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl())) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4401) return ImplicitConversionSequence::Worse; +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4402) if (ToPtr2->isObjCIdType() && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4403) (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl())) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4404) return ImplicitConversionSequence::Better; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4405) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4406) // A conversion to a non-id object pointer type is better than a +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4407) // conversion to a qualified 'id' type +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4408) if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl()) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4409) return ImplicitConversionSequence::Worse; +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4410) if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl()) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4411) return ImplicitConversionSequence::Better; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4412) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4413) // A conversion to an a non-Class object pointer type or qualified 'Class' +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4414) // type is better than a conversion to 'Class'. +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4415) if (ToPtr1->isObjCClassType() && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4416) (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl())) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4417) return ImplicitConversionSequence::Worse; +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4418) if (ToPtr2->isObjCClassType() && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4419) (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl())) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4420) return ImplicitConversionSequence::Better; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4421) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4422) // A conversion to a non-Class object pointer type is better than a +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4423) // conversion to a qualified 'Class' type. +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4424) if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl()) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4425) return ImplicitConversionSequence::Worse; +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4426) if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl()) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4427) return ImplicitConversionSequence::Better; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 4428) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4429) // -- "conversion of C* to B* is better than conversion of C* to A*," +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4430) if (S.Context.hasSameType(FromType1, FromType2) && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4431) !FromPtr1->isObjCIdType() && !FromPtr1->isObjCClassType() && +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4432) (ToAssignLeft != ToAssignRight)) { +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4433) if (FromPtr1->isSpecialized()) { +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4434) // "conversion of B * to B * is better than conversion of B * to +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4435) // C *. +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4436) bool IsFirstSame = +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4437) FromPtr1->getInterfaceDecl() == ToPtr1->getInterfaceDecl(); +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4438) bool IsSecondSame = +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4439) FromPtr1->getInterfaceDecl() == ToPtr2->getInterfaceDecl(); +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4440) if (IsFirstSame) { +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4441) if (!IsSecondSame) +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4442) return ImplicitConversionSequence::Better; +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4443) } else if (IsSecondSame) +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4444) return ImplicitConversionSequence::Worse; +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4445) } +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4446) return ToAssignLeft? ImplicitConversionSequence::Worse +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4447) : ImplicitConversionSequence::Better; +a9832134597af (Alex Lorenz 2017-04-06 13:06:34 +0000 4448) } +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4449) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4450) // -- "conversion of B* to A* is better than conversion of C* to A*," +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4451) if (S.Context.hasSameUnqualifiedType(ToType1, ToType2) && +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4452) (FromAssignLeft != FromAssignRight)) +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4453) return FromAssignLeft? ImplicitConversionSequence::Better +058d3deab8924 (Douglas Gregor 2011-01-31 18:51:41 +0000 4454) : ImplicitConversionSequence::Worse; +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4455) } +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4456) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4457) +ac741ffd44eec (Fariborz Jahanian 2009-10-20 20:07:35 +0000 4458) // Ranking of member-pointer types. +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4459) if (SCS1.Second == ICK_Pointer_Member && SCS2.Second == ICK_Pointer_Member && +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4460) FromType1->isMemberPointerType() && FromType2->isMemberPointerType() && +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4461) ToType1->isMemberPointerType() && ToType2->isMemberPointerType()) { +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 4462) const auto *FromMemPointer1 = FromType1->castAs(); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 4463) const auto *ToMemPointer1 = ToType1->castAs(); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 4464) const auto *FromMemPointer2 = FromType2->castAs(); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 4465) const auto *ToMemPointer2 = ToType2->castAs(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4466) const Type *FromPointeeType1 = FromMemPointer1->getClass(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4467) const Type *ToPointeeType1 = ToMemPointer1->getClass(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4468) const Type *FromPointeeType2 = FromMemPointer2->getClass(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4469) const Type *ToPointeeType2 = ToMemPointer2->getClass(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4470) QualType FromPointee1 = QualType(FromPointeeType1, 0).getUnqualifiedType(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4471) QualType ToPointee1 = QualType(ToPointeeType1, 0).getUnqualifiedType(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4472) QualType FromPointee2 = QualType(FromPointeeType2, 0).getUnqualifiedType(); +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4473) QualType ToPointee2 = QualType(ToPointeeType2, 0).getUnqualifiedType(); +ac741ffd44eec (Fariborz Jahanian 2009-10-20 20:07:35 +0000 4474) // conversion of A::* to B::* is better than conversion of A::* to C::*, +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4475) if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4476) if (S.IsDerivedFrom(Loc, ToPointee1, ToPointee2)) +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4477) return ImplicitConversionSequence::Worse; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4478) else if (S.IsDerivedFrom(Loc, ToPointee2, ToPointee1)) +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4479) return ImplicitConversionSequence::Better; +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4480) } +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4481) // conversion of B::* to C::* is better than conversion of A::* to C::* +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4482) if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4483) if (S.IsDerivedFrom(Loc, FromPointee1, FromPointee2)) +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4484) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4485) else if (S.IsDerivedFrom(Loc, FromPointee2, FromPointee1)) +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4486) return ImplicitConversionSequence::Worse; +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4487) } +9a587b01118ed (Fariborz Jahanian 2009-10-20 20:04:46 +0000 4488) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4489) +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 4490) if (SCS1.Second == ICK_Derived_To_Base) { +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4491) // -- conversion of C to B is better than conversion of C to A, +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4492) // -- binding of an expression of type C to a reference of type +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4493) // B& is better than binding an expression of type C to a +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4494) // reference of type A&, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4495) if (S.Context.hasSameUnqualifiedType(FromType1, FromType2) && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4496) !S.Context.hasSameUnqualifiedType(ToType1, ToType2)) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4497) if (S.IsDerivedFrom(Loc, ToType1, ToType2)) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4498) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4499) else if (S.IsDerivedFrom(Loc, ToType2, ToType1)) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4500) return ImplicitConversionSequence::Worse; +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4501) } +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4502) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4503) // -- conversion of B to A is better than conversion of C to A. +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4504) // -- binding of an expression of type B to a reference of type +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4505) // A& is better than binding an expression of type C to a +83af86a6bc101 (Douglas Gregor 2010-02-25 19:01:05 +0000 4506) // reference of type A&, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4507) if (!S.Context.hasSameUnqualifiedType(FromType1, FromType2) && +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4508) S.Context.hasSameUnqualifiedType(ToType1, ToType2)) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4509) if (S.IsDerivedFrom(Loc, FromType2, FromType1)) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4510) return ImplicitConversionSequence::Better; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4511) else if (S.IsDerivedFrom(Loc, FromType1, FromType2)) +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4512) return ImplicitConversionSequence::Worse; +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4513) } +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 4514) } +ef30a5ff98e19 (Douglas Gregor 2008-10-29 14:50:44 +0000 4515) +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4516) return ImplicitConversionSequence::Indistinguishable; +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4517) } +5c407d9a9b8c5 (Douglas Gregor 2008-10-23 00:40:37 +0000 4518) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 4519) /// Determine whether the given type is valid, e.g., it is not an invalid +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4520) /// C++ class. +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4521) static bool isTypeValid(QualType T) { +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4522) if (CXXRecordDecl *Record = T->getAsCXXRecordDecl()) +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4523) return !Record->isInvalidDecl(); +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4524) +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4525) return true; +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4526) } +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4527) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4528) static QualType withoutUnaligned(ASTContext &Ctx, QualType T) { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4529) if (!T.getQualifiers().hasUnaligned()) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4530) return T; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4531) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4532) Qualifiers Q; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4533) T = Ctx.getUnqualifiedArrayType(T, Q); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4534) Q.removeUnaligned(); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4535) return Ctx.getQualifiedType(T, Q); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4536) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4537) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4538) /// CompareReferenceRelationship - Compare the two types T1 and T2 to +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4539) /// determine whether they are reference-compatible, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4540) /// reference-related, or incompatible, for use in C++ initialization by +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4541) /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4542) /// type, and the first type (T1) is the pointee type of the reference +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4543) /// type being initialized. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4544) Sema::ReferenceCompareResult +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4545) Sema::CompareReferenceRelationship(SourceLocation Loc, +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4546) QualType OrigT1, QualType OrigT2, +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4547) ReferenceConversions *ConvOut) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4548) assert(!OrigT1->isReferenceType() && +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4549) "T1 must be the pointee type of the reference type"); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4550) assert(!OrigT2->isReferenceType() && "T2 cannot be a reference type"); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4551) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4552) QualType T1 = Context.getCanonicalType(OrigT1); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4553) QualType T2 = Context.getCanonicalType(OrigT2); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4554) Qualifiers T1Quals, T2Quals; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4555) QualType UnqualT1 = Context.getUnqualifiedArrayType(T1, T1Quals); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4556) QualType UnqualT2 = Context.getUnqualifiedArrayType(T2, T2Quals); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4557) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4558) ReferenceConversions ConvTmp; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4559) ReferenceConversions &Conv = ConvOut ? *ConvOut : ConvTmp; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4560) Conv = ReferenceConversions(); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4561) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4562) // C++2a [dcl.init.ref]p4: +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4563) // Given types "cv1 T1" and "cv2 T2," "cv1 T1" is +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4564) // reference-related to "cv2 T2" if T1 is similar to T2, or +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4565) // T1 is a base class of T2. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4566) // "cv1 T1" is reference-compatible with "cv2 T2" if +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4567) // a prvalue of type "pointer to cv2 T2" can be converted to the type +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4568) // "pointer to cv1 T1" via a standard conversion sequence. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4569) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4570) // Check for standard conversions we can apply to pointers: derived-to-base +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4571) // conversions, ObjC pointer conversions, and function pointer conversions. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4572) // (Qualification conversions are checked last.) +1be59c510612d (Richard Smith 2016-10-22 01:32:19 +0000 4573) QualType ConvertedT2; +8b2d2fe234163 (Douglas Gregor 2010-08-07 11:51:51 +0000 4574) if (UnqualT1 == UnqualT2) { +8b2d2fe234163 (Douglas Gregor 2010-08-07 11:51:51 +0000 4575) // Nothing to do. +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 4576) } else if (isCompleteType(Loc, OrigT2) && +45bb4834e9671 (Douglas Gregor 2013-03-26 23:36:30 +0000 4577) isTypeValid(UnqualT1) && isTypeValid(UnqualT2) && +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 4578) IsDerivedFrom(Loc, UnqualT2, UnqualT1)) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4579) Conv |= ReferenceConversions::DerivedToBase; +8b2d2fe234163 (Douglas Gregor 2010-08-07 11:51:51 +0000 4580) else if (UnqualT1->isObjCObjectOrInterfaceType() && +8b2d2fe234163 (Douglas Gregor 2010-08-07 11:51:51 +0000 4581) UnqualT2->isObjCObjectOrInterfaceType() && +8b2d2fe234163 (Douglas Gregor 2010-08-07 11:51:51 +0000 4582) Context.canBindObjCObjectType(UnqualT1, UnqualT2)) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4583) Conv |= ReferenceConversions::ObjC; +1be59c510612d (Richard Smith 2016-10-22 01:32:19 +0000 4584) else if (UnqualT2->isFunctionType() && +766f15814a012 (Peter Collingbourne 2019-10-19 00:34:54 +0000 4585) IsFunctionConversion(UnqualT2, UnqualT1, ConvertedT2)) { +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4586) Conv |= ReferenceConversions::Function; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4587) // No need to check qualifiers; function types don't have them. +1be59c510612d (Richard Smith 2016-10-22 01:32:19 +0000 4588) return Ref_Compatible; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4589) } +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4590) bool ConvertedReferent = Conv != 0; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4591) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4592) // We can have a qualification conversion. Compute whether the types are +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4593) // similar at the same time. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4594) bool PreviousToQualsIncludeConst = true; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4595) bool TopLevel = true; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4596) do { +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4597) if (T1 == T2) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4598) break; +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 4599) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4600) // We will need a qualification conversion. +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4601) Conv |= ReferenceConversions::Qualification; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4602) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4603) // Track whether we performed a qualification conversion anywhere other +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4604) // than the top level. This matters for ranking reference bindings in +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4605) // overload resolution. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4606) if (!TopLevel) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4607) Conv |= ReferenceConversions::NestedQualification; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4608) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4609) // MS compiler ignores __unaligned qualifier for references; do the same. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4610) T1 = withoutUnaligned(Context, T1); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4611) T2 = withoutUnaligned(Context, T2); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4612) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4613) // If we find a qualifier mismatch, the types are not reference-compatible, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4614) // but are still be reference-related if they're similar. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4615) bool ObjCLifetimeConversion = false; +6064f426a1830 (Anastasia Stulova 2020-02-06 11:56:21 +0000 4616) if (!isQualificationConversionStep(T2, T1, /*CStyle=*/false, TopLevel, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4617) PreviousToQualsIncludeConst, +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4618) ObjCLifetimeConversion)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4619) return (ConvertedReferent || Context.hasSimilarType(T1, T2)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4620) ? Ref_Related +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4621) : Ref_Incompatible; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4622) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4623) // FIXME: Should we track this for any level other than the first? +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4624) if (ObjCLifetimeConversion) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4625) Conv |= ReferenceConversions::ObjCLifetime; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4626) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4627) TopLevel = false; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4628) } while (Context.UnwrapSimilarTypes(T1, T2)); +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4629) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4630) // At this point, if the types are reference-related, we must either have the +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4631) // same inner type (ignoring qualifiers), or must have already worked out how +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4632) // to convert the referent. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4633) return (ConvertedReferent || Context.hasSameUnqualifiedType(T1, T2)) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4634) ? Ref_Compatible +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4635) : Ref_Incompatible; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4636) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4637) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 4638) /// Look for a user-defined conversion to a value reference-compatible +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4639) /// with DeclType. Return true if something definite is found. +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4640) static bool +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4641) FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4642) QualType DeclType, SourceLocation DeclLoc, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4643) Expr *Init, QualType T2, bool AllowRvalues, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4644) bool AllowExplicit) { +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4645) assert(T2->isRecordType() && "Can only find conversions of record types."); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 4646) auto *T2RecordDecl = cast(T2->castAs()->getDecl()); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4647) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 4648) OverloadCandidateSet CandidateSet( +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 4649) DeclLoc, OverloadCandidateSet::CSK_InitByUserDefinedConversion); +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 4650) const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions(); +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 4651) for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4652) NamedDecl *D = *I; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4653) CXXRecordDecl *ActingDC = cast(D->getDeclContext()); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4654) if (isa(D)) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4655) D = cast(D)->getTargetDecl(); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4656) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4657) FunctionTemplateDecl *ConvTemplate +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4658) = dyn_cast(D); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4659) CXXConversionDecl *Conv; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4660) if (ConvTemplate) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4661) Conv = cast(ConvTemplate->getTemplatedDecl()); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4662) else +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4663) Conv = cast(D); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4664) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4665) if (AllowRvalues) { +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4666) // If we are initializing an rvalue reference, don't permit conversion +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4667) // functions that return lvalues. +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4668) if (!ConvTemplate && DeclType->isRValueReferenceType()) { +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4669) const ReferenceType *RefType +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4670) = Conv->getConversionType()->getAs(); +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4671) if (RefType && !RefType->getPointeeType()->isFunctionType()) +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4672) continue; +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 4673) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 4674) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4675) if (!ConvTemplate && +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 4676) S.CompareReferenceRelationship( +766f15814a012 (Peter Collingbourne 2019-10-19 00:34:54 +0000 4677) DeclLoc, +766f15814a012 (Peter Collingbourne 2019-10-19 00:34:54 +0000 4678) Conv->getConversionType() +766f15814a012 (Peter Collingbourne 2019-10-19 00:34:54 +0000 4679) .getNonReferenceType() +766f15814a012 (Peter Collingbourne 2019-10-19 00:34:54 +0000 4680) .getUnqualifiedType(), +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4681) DeclType.getNonReferenceType().getUnqualifiedType()) == +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4682) Sema::Ref_Incompatible) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4683) continue; +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4684) } else { +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4685) // If the conversion function doesn't return a reference type, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4686) // it can't be considered for this conversion. An rvalue reference +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4687) // is only acceptable if its referencee is a function type. +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4688) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4689) const ReferenceType *RefType = +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4690) Conv->getConversionType()->getAs(); +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4691) if (!RefType || +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4692) (!RefType->isLValueReferenceType() && +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4693) !RefType->getPointeeType()->isFunctionType())) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4694) continue; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4695) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4696) +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4697) if (ConvTemplate) +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4698) S.AddTemplateConversionCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4699) ConvTemplate, I.getPair(), ActingDC, Init, DeclType, CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4700) /*AllowObjCConversionOnExplicit=*/false, AllowExplicit); +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4701) else +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4702) S.AddConversionCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4703) Conv, I.getPair(), ActingDC, Init, DeclType, CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 4704) /*AllowObjCConversionOnExplicit=*/false, AllowExplicit); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4705) } +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4706) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 4707) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 4708) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4709) OverloadCandidateSet::iterator Best; +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 4710) switch (CandidateSet.BestViableFunction(S, DeclLoc, Best)) { +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4711) case OR_Success: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4712) // C++ [over.ics.ref]p1: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4713) // +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4714) // [...] If the parameter binds directly to the result of +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4715) // applying a conversion function to the argument +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4716) // expression, the implicit conversion sequence is a +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4717) // user-defined conversion sequence (13.3.3.1.2), with the +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4718) // second standard conversion sequence either an identity +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4719) // conversion or, if the conversion function returns an +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4720) // entity of a type that is a derived class of the parameter +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4721) // type, a derived-to-base Conversion. +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4722) if (!Best->FinalConversion.DirectBinding) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4723) return false; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4724) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4725) ICS.setUserDefined(); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4726) ICS.UserDefined.Before = Best->Conversions[0].Standard; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4727) ICS.UserDefined.After = Best->FinalConversion; +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 4728) ICS.UserDefined.HadMultipleCandidates = HadMultipleCandidates; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4729) ICS.UserDefined.ConversionFunction = Best->Function; +30909031a7f76 (John McCall 2011-09-21 08:36:56 +0000 4730) ICS.UserDefined.FoundConversionFunction = Best->FoundDecl; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4731) ICS.UserDefined.EllipsisConversion = false; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4732) assert(ICS.UserDefined.After.ReferenceBinding && +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4733) ICS.UserDefined.After.DirectBinding && +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4734) "Expected a direct reference binding!"); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4735) return true; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4736) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4737) case OR_Ambiguous: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4738) ICS.setAmbiguous(); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4739) for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4740) Cand != CandidateSet.end(); ++Cand) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 4741) if (Cand->Best) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 4742) ICS.Ambiguous.addConversion(Cand->FoundDecl, Cand->Function); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4743) return true; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4744) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4745) case OR_No_Viable_Function: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4746) case OR_Deleted: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4747) // There was no suitable conversion, or we found a deleted +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4748) // conversion; continue with other checks. +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4749) return false; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4750) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4751) +8a40f700e62b8 (David Blaikie 2012-01-17 06:56:22 +0000 4752) llvm_unreachable("Invalid OverloadResult!"); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4753) } +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4754) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 4755) /// Compute an implicit conversion sequence for reference +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4756) /// initialization. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4757) static ImplicitConversionSequence +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 4758) TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4759) SourceLocation DeclLoc, +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4760) bool SuppressUserConversions, +adc7a704d2a38 (Douglas Gregor 2010-04-16 17:45:54 +0000 4761) bool AllowExplicit) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4762) assert(DeclType->isReferenceType() && "Reference init needs a reference"); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4763) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4764) // Most paths end in a failed conversion. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4765) ImplicitConversionSequence ICS; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4766) ICS.setBad(BadConversionSequence::no_conversion, Init, DeclType); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4767) +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 4768) QualType T1 = DeclType->castAs()->getPointeeType(); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4769) QualType T2 = Init->getType(); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4770) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4771) // If the initializer is the address of an overloaded function, try +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4772) // to resolve the overloaded function. If all goes well, T2 is the +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4773) // type of the resulting function. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4774) if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4775) DeclAccessPair Found; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4776) if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Init, DeclType, +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4777) false, Found)) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4778) T2 = Fn->getType(); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4779) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4780) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4781) // Compute some basic properties of the types and the initializer. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4782) bool isRValRef = DeclType->isRValueReferenceType(); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4783) Expr::Classification InitCategory = Init->Classify(S.Context); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4784) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4785) Sema::ReferenceConversions RefConv; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4786) Sema::ReferenceCompareResult RefRelationship = +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4787) S.CompareReferenceRelationship(DeclLoc, T1, T2, &RefConv); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4788) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4789) auto SetAsReferenceBinding = [&](bool BindsDirectly) { +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4790) ICS.setStandard(); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4791) ICS.Standard.First = ICK_Identity; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4792) // FIXME: A reference binding can be a function conversion too. We should +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4793) // consider that when ordering reference-to-function bindings. +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4794) ICS.Standard.Second = (RefConv & Sema::ReferenceConversions::DerivedToBase) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4795) ? ICK_Derived_To_Base +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4796) : (RefConv & Sema::ReferenceConversions::ObjC) +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4797) ? ICK_Compatible_Conversion +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4798) : ICK_Identity; +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4799) // FIXME: As a speculative fix to a defect introduced by CWG2352, we rank +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4800) // a reference binding that performs a non-top-level qualification +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4801) // conversion as a qualification conversion, not as an identity conversion. +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4802) ICS.Standard.Third = (RefConv & +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4803) Sema::ReferenceConversions::NestedQualification) +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4804) ? ICK_Qualification +f041e9ad706ae (Richard Smith 2020-01-09 15:31:56 -0800 4805) : ICK_Identity; +065fc1eafe7c6 (Richard Smith 2020-07-07 18:25:57 -0700 4806) ICS.Standard.setFromType(T2); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4807) ICS.Standard.setToType(0, T2); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4808) ICS.Standard.setToType(1, T1); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4809) ICS.Standard.setToType(2, T1); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4810) ICS.Standard.ReferenceBinding = true; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4811) ICS.Standard.DirectBinding = BindsDirectly; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4812) ICS.Standard.IsLvalueReference = !isRValRef; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4813) ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType(); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4814) ICS.Standard.BindsToRvalue = InitCategory.isRValue(); +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4815) ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4816) ICS.Standard.ObjCLifetimeConversionBinding = +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4817) (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4818) ICS.Standard.CopyConstructor = nullptr; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4819) ICS.Standard.DeprecatedStringLiteralToCharPtr = false; +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4820) }; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4821) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4822) // C++0x [dcl.init.ref]p5: +870f3743e4883 (Douglas Gregor 2010-04-18 09:22:00 +0000 4823) // A reference to type "cv1 T1" is initialized by an expression +870f3743e4883 (Douglas Gregor 2010-04-18 09:22:00 +0000 4824) // of type "cv2 T2" as follows: +870f3743e4883 (Douglas Gregor 2010-04-18 09:22:00 +0000 4825) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4826) // -- If reference is an lvalue reference and the initializer expression +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4827) if (!isRValRef) { +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4828) // -- is an lvalue (but is not a bit-field), and "cv1 T1" is +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4829) // reference-compatible with "cv2 T2," or +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4830) // +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4831) // Per C++ [over.ics.ref]p4, we don't check the bit-field property here. +ce76629905aa1 (Richard Smith 2016-10-21 23:01:55 +0000 4832) if (InitCategory.isLValue() && RefRelationship == Sema::Ref_Compatible) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4833) // C++ [over.ics.ref]p1: +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4834) // When a parameter of reference type binds directly (8.5.3) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4835) // to an argument expression, the implicit conversion sequence +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4836) // is the identity conversion, unless the argument expression +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4837) // has a type that is a derived class of the parameter type, +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4838) // in which case the implicit conversion sequence is a +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4839) // derived-to-base Conversion (13.3.3.1). +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4840) SetAsReferenceBinding(/*BindsDirectly=*/true); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4841) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4842) // Nothing more to do: the inaccessibility/ambiguity check for +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4843) // derived-to-base conversions is suppressed when we're +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4844) // computing the implicit conversion sequence (C++ +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4845) // [over.best.ics]p2). +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4846) return ICS; +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4847) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4848) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4849) // -- has a class type (i.e., T2 is a class type), where T1 is +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4850) // not reference-related to T2, and can be implicitly +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4851) // converted to an lvalue of type "cv3 T3," where "cv1 T1" +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4852) // is reference-compatible with "cv3 T3" 92) (this +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4853) // conversion is selected by enumerating the applicable +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4854) // conversion functions (13.3.1.6) and choosing the best +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4855) // one through overload resolution (13.3)), +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4856) if (!SuppressUserConversions && T2->isRecordType() && +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 4857) S.isCompleteType(DeclLoc, T2) && +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4858) RefRelationship == Sema::Ref_Incompatible) { +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4859) if (FindConversionForRefInit(S, ICS, DeclType, DeclLoc, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4860) Init, T2, /*AllowRvalues=*/false, +836a7e8468a76 (Douglas Gregor 2010-08-11 02:15:33 +0000 4861) AllowExplicit)) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4862) return ICS; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4863) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4864) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4865) +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4866) // -- Otherwise, the reference shall be an lvalue reference to a +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4867) // non-volatile const type (i.e., cv1 shall be const), or the reference +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4868) // shall be an rvalue reference. +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4869) if (!isRValRef && (!T1.isConstQualified() || T1.isVolatileQualified())) { +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4870) if (InitCategory.isRValue() && RefRelationship != Sema::Ref_Incompatible) +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4871) ICS.setBad(BadConversionSequence::lvalue_ref_to_rvalue, Init, DeclType); +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4872) return ICS; +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4873) } +d92badfd9c998 (Sebastian Redl 2010-06-30 18:13:39 +0000 4874) +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4875) // -- If the initializer expression +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4876) // +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4877) // -- is an xvalue, class prvalue, array prvalue or function +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4878) // lvalue and "cv1 T1" is reference-compatible with "cv2 T2", or +ce76629905aa1 (Richard Smith 2016-10-21 23:01:55 +0000 4879) if (RefRelationship == Sema::Ref_Compatible && +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4880) (InitCategory.isXValue() || +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4881) (InitCategory.isPRValue() && +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4882) (T2->isRecordType() || T2->isArrayType())) || +ce76629905aa1 (Richard Smith 2016-10-21 23:01:55 +0000 4883) (InitCategory.isLValue() && T2->isFunctionType()))) { +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4884) // In C++11, this is always a direct binding. In C++98/03, it's a direct +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4885) // binding unless we're binding to a class prvalue. +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4886) // Note: Although xvalues wouldn't normally show up in C++98/03 code, we +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4887) // allow the use of rvalue references in C++98/03 for the benefit of +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4888) // standard library implementors; therefore, we need the xvalue check here. +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4889) SetAsReferenceBinding(/*BindsDirectly=*/S.getLangOpts().CPlusPlus11 || +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 4890) !(InitCategory.isPRValue() || T2->isRecordType())); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4891) return ICS; +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4892) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4893) +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4894) // -- has a class type (i.e., T2 is a class type), where T1 is not +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4895) // reference-related to T2, and can be implicitly converted to +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4896) // an xvalue, class prvalue, or function lvalue of type +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4897) // "cv3 T3", where "cv1 T1" is reference-compatible with +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4898) // "cv3 T3", +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4899) // +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4900) // then the reference is bound to the value of the initializer +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4901) // expression in the first case and to the result of the conversion +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4902) // in the second case (or, in either case, to an appropriate base +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4903) // class subobject). +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4904) if (!SuppressUserConversions && RefRelationship == Sema::Ref_Incompatible && +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 4905) T2->isRecordType() && S.isCompleteType(DeclLoc, T2) && +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4906) FindConversionForRefInit(S, ICS, DeclType, DeclLoc, +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4907) Init, T2, /*AllowRvalues=*/true, +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4908) AllowExplicit)) { +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4909) // In the second case, if the reference is an rvalue reference +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4910) // and the second standard conversion sequence of the +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4911) // user-defined conversion sequence includes an lvalue-to-rvalue +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4912) // conversion, the program is ill-formed. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4913) if (ICS.isUserDefined() && isRValRef && +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4914) ICS.UserDefined.After.First == ICK_Lvalue_To_Rvalue) +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4915) ICS.setBad(BadConversionSequence::no_conversion, Init, DeclType); +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 4916) +f143cd5051581 (Douglas Gregor 2011-01-24 16:14:37 +0000 4917) return ICS; +be468d9a2b39a (Rafael Espindola 2011-01-22 15:32:35 +0000 4918) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 4919) +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4920) // A temporary of function type cannot be created; don't even try. +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4921) if (T1->isFunctionType()) +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4922) return ICS; +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4923) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4924) // -- Otherwise, a temporary of type "cv1 T1" is created and +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4925) // initialized from the initializer expression using the +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4926) // rules for a non-reference copy initialization (8.5). The +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4927) // reference is then bound to the temporary. If T1 is +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4928) // reference-related to T2, cv1 must be the same +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4929) // cv-qualification as, or greater cv-qualification than, +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4930) // cv2; otherwise, the program is ill-formed. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4931) if (RefRelationship == Sema::Ref_Related) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4932) // If cv1 == cv2 or cv1 is a greater cv-qualified than cv2, then +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4933) // we would be reference-compatible or reference-compatible with +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4934) // added qualification. But that wasn't the case, so the reference +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4935) // initialization fails. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4936) // +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4937) // Note that we only want to check address spaces and cvr-qualifiers here. +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 4938) // ObjC GC, lifetime and unaligned qualifiers aren't important. +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4939) Qualifiers T1Quals = T1.getQualifiers(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4940) Qualifiers T2Quals = T2.getQualifiers(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4941) T1Quals.removeObjCGCAttr(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4942) T1Quals.removeObjCLifetime(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4943) T2Quals.removeObjCGCAttr(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4944) T2Quals.removeObjCLifetime(); +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 4945) // MS compiler ignores __unaligned qualifier for references; do the same. +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 4946) T1Quals.removeUnaligned(); +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 4947) T2Quals.removeUnaligned(); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4948) if (!T1Quals.compatiblyIncludes(T2Quals)) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4949) return ICS; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4950) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4951) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4952) // If at least one of the types is a class type, the types are not +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4953) // related, and we aren't allowed any user conversions, the +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4954) // reference binding fails. This case is important for breaking +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4955) // recursion, since TryImplicitConversion below will attempt to +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4956) // create a temporary through the use of a copy constructor. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4957) if (SuppressUserConversions && RefRelationship == Sema::Ref_Incompatible && +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4958) (T1->isRecordType() || T2->isRecordType())) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4959) return ICS; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4960) +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 4961) // If T1 is reference-related to T2 and the reference is an rvalue +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 4962) // reference, the initializer expression shall not be an lvalue. +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4963) if (RefRelationship >= Sema::Ref_Related && isRValRef && +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4964) Init->Classify(S.Context).isLValue()) { +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4965) ICS.setBad(BadConversionSequence::rvalue_ref_to_lvalue, Init, DeclType); +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 4966) return ICS; +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 4967) } +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 4968) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4969) // C++ [over.ics.ref]p2: +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4970) // When a parameter of reference type is not bound directly to +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4971) // an argument expression, the conversion sequence is the one +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4972) // required to convert the argument expression to the +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4973) // underlying type of the reference according to +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4974) // 13.3.3.1. Conceptually, this conversion sequence corresponds +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4975) // to copy-initializing a temporary of the underlying type with +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4976) // the argument expression. Any difference in top-level +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4977) // cv-qualification is subsumed by the initialization itself +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4978) // and does not constitute a conversion. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 4979) ICS = TryImplicitConversion(S, Init, T1, SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 4980) AllowedExplicit::None, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 4981) /*InOverloadResolution=*/false, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4982) /*CStyle=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 4983) /*AllowObjCWritebackConversion=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 4984) /*AllowObjCConversionOnExplicit=*/false); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4985) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4986) // Of course, that's still a reference binding. +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4987) if (ICS.isStandard()) { +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4988) ICS.Standard.ReferenceBinding = true; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4989) ICS.Standard.IsLvalueReference = !isRValRef; +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4990) ICS.Standard.BindsToFunctionLvalue = false; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 4991) ICS.Standard.BindsToRvalue = true; +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 4992) ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 4993) ICS.Standard.ObjCLifetimeConversionBinding = false; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 4994) } else if (ICS.isUserDefined()) { +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4995) const ReferenceType *LValRefType = +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4996) ICS.UserDefined.ConversionFunction->getReturnType() +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4997) ->getAs(); +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4998) +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 4999) // C++ [over.ics.ref]p3: +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5000) // Except for an implicit object parameter, for which see 13.3.1, a +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5001) // standard conversion sequence cannot be formed if it requires [...] +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5002) // binding an rvalue reference to an lvalue other than a function +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5003) // lvalue. +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5004) // Note that the function case is not possible here. +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 5005) if (isRValRef && LValRefType) { +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 5006) ICS.setBad(BadConversionSequence::no_conversion, Init, DeclType); +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5007) return ICS; +b0e6c8a3500c1 (Douglas Gregor 2011-10-04 23:59:32 +0000 5008) } +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5009) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5010) ICS.UserDefined.After.ReferenceBinding = true; +3ec7910e10b6f (Douglas Gregor 2011-08-15 13:59:46 +0000 5011) ICS.UserDefined.After.IsLvalueReference = !isRValRef; +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5012) ICS.UserDefined.After.BindsToFunctionLvalue = false; +19172c4f70fac (Richard Smith 2014-07-14 02:28:44 +0000 5013) ICS.UserDefined.After.BindsToRvalue = !LValRefType; +3ec7910e10b6f (Douglas Gregor 2011-08-15 13:59:46 +0000 5014) ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = false; +3ec7910e10b6f (Douglas Gregor 2011-08-15 13:59:46 +0000 5015) ICS.UserDefined.After.ObjCLifetimeConversionBinding = false; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5016) } +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 5017) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5018) return ICS; +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5019) } +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5020) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5021) static ImplicitConversionSequence +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5022) TryCopyInitialization(Sema &S, Expr *From, QualType ToType, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5023) bool SuppressUserConversions, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5024) bool InOverloadResolution, +6073dcab38e4e (Douglas Gregor 2012-02-24 23:56:31 +0000 5025) bool AllowObjCWritebackConversion, +6073dcab38e4e (Douglas Gregor 2012-02-24 23:56:31 +0000 5026) bool AllowExplicit = false); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5027) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5028) /// TryListConversion - Try to copy-initialize a value of type ToType from the +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5029) /// initializer list From. +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5030) static ImplicitConversionSequence +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5031) TryListConversion(Sema &S, InitListExpr *From, QualType ToType, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5032) bool SuppressUserConversions, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5033) bool InOverloadResolution, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5034) bool AllowObjCWritebackConversion) { +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5035) // C++11 [over.ics.list]p1: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5036) // When an argument is an initializer list, it is not an expression and +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5037) // special rules apply for converting it to a parameter type. +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5038) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5039) ImplicitConversionSequence Result; +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5040) Result.setBad(BadConversionSequence::no_conversion, From, ToType); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5041) +09edce0400716 (Sebastian Redl 2012-01-23 22:09:39 +0000 5042) // We need a complete type for what follows. Incomplete types can never be +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5043) // initialized from init lists. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5044) if (!S.isCompleteType(From->getBeginLoc(), ToType)) +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5045) return Result; +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5046) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5047) // Per DR1467: +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5048) // If the parameter type is a class X and the initializer list has a single +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5049) // element of type cv U, where U is X or a class derived from X, the +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5050) // implicit conversion sequence is the one required to convert the element +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5051) // to the parameter type. +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5052) // +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5053) // Otherwise, if the parameter type is a character array [... ] +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5054) // and the initializer list has a single element that is an +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5055) // appropriately-typed string literal (8.5.2 [dcl.init.string]), the +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5056) // implicit conversion sequence is the identity conversion. +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5057) if (From->getNumInits() == 1) { +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5058) if (ToType->isRecordType()) { +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5059) QualType InitType = From->getInit(0)->getType(); +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5060) if (S.Context.hasSameUnqualifiedType(InitType, ToType) || +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5061) S.IsDerivedFrom(From->getBeginLoc(), InitType, ToType)) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5062) return TryCopyInitialization(S, From->getInit(0), ToType, +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5063) SuppressUserConversions, +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5064) InOverloadResolution, +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5065) AllowObjCWritebackConversion); +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5066) } +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5067) +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5068) if (const auto *AT = S.Context.getAsArrayType(ToType)) { +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5069) if (S.IsStringInit(From->getInit(0), AT)) { +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5070) InitializedEntity Entity = +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5071) InitializedEntity::InitializeParameter(S.Context, ToType, +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5072) /*Consumed=*/false); +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5073) if (S.CanPerformCopyInitialization(Entity, From)) { +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5074) Result.setStandard(); +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5075) Result.Standard.setAsIdentityConversion(); +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5076) Result.Standard.setFromType(ToType); +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5077) Result.Standard.setAllToTypes(ToType); +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5078) return Result; +0ce6d6b46eb70 (Mark de Wever 2020-10-03 14:31:46 +0200 5079) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5080) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5081) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5082) } +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5083) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5084) // C++14 [over.ics.list]p2: Otherwise, if the parameter type [...] (below). +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5085) // C++11 [over.ics.list]p2: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5086) // If the parameter type is std::initializer_list or "array of X" and +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5087) // all the elements can be implicitly converted to X, the implicit +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5088) // conversion sequence is the worst conversion necessary to convert an +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5089) // element of the list to X. +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5090) // +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5091) // C++14 [over.ics.list]p3: +b01d86b3159a5 (NAKAMURA Takumi 2015-02-25 11:02:00 +0000 5092) // Otherwise, if the parameter type is "array of N X", if the initializer +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5093) // list has exactly N elements or if it has fewer than N elements and X is +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5094) // default-constructible, and if all the elements of the initializer list +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5095) // can be implicitly converted to X, the implicit conversion sequence is +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5096) // the worst conversion necessary to convert an element of the list to X. +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 5097) // +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5098) QualType InitTy = ToType; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5099) ArrayType const *AT = S.Context.getAsArrayType(ToType); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5100) if (AT || S.isStdInitializerList(ToType, &InitTy)) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5101) unsigned e = From->getNumInits(); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5102) bool Clear = true; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5103) if (AT) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5104) InitTy = AT->getElementType(); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5105) if (ConstantArrayType const *CT = dyn_cast(AT)) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5106) if (CT->getSize().ult(e)) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5107) Clear = false; // Too many inits, fatally bad +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5108) else if (CT->getSize().ugt(e)) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5109) // Need an init from empty {}, is there one? +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5110) // FIXME: Is there a simpler way than this? +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5111) InitListExpr EmptyList(S.Context, From->getEndLoc(), None, +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5112) From->getEndLoc()); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5113) EmptyList.setType(S.Context.VoidTy); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5114) auto ICS = TryListConversion( +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5115) S, &EmptyList, InitTy, SuppressUserConversions, +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5116) InOverloadResolution, AllowObjCWritebackConversion); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5117) if (!ICS.isBad()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5118) Result = ICS; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5119) Clear = false; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5120) } +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5121) } +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5122) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5123) if (Clear) { +0f5c1c01273da (Douglas Gregor 2012-04-04 23:09:20 +0000 5124) Result.setStandard(); +0f5c1c01273da (Douglas Gregor 2012-04-04 23:09:20 +0000 5125) Result.Standard.setAsIdentityConversion(); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5126) Result.Standard.setFromType(InitTy); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5127) Result.Standard.setAllToTypes(InitTy); +0f5c1c01273da (Douglas Gregor 2012-04-04 23:09:20 +0000 5128) } +0f5c1c01273da (Douglas Gregor 2012-04-04 23:09:20 +0000 5129) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5130) if (!Result.isBad()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5131) for (unsigned i = 0; i < e; ++i) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5132) Expr *Init = From->getInit(i); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5133) ImplicitConversionSequence ICS = TryCopyInitialization( +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5134) S, Init, InitTy, SuppressUserConversions, InOverloadResolution, +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5135) AllowObjCWritebackConversion); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5136) // Keep the worse conversion. +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5137) if (CompareImplicitConversionSequences(S, From->getBeginLoc(), ICS, +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5138) Result) == +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5139) ImplicitConversionSequence::Worse) { +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5140) Result = ICS; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5141) // Bail as soon as we find something unconvertible. +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5142) if (Result.isBad()) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5143) break; +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5144) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5145) } +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5146) +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5147) // Record the type being initialized so that we may compare sequences +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5148) Result.setInitializerListToType(ToType); +e7fc04448749f (Nathan Sidwell 2021-05-25 07:04:25 -0700 5149) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5150) return Result; +10f0fc04a8f50 (Sebastian Redl 2012-01-17 22:49:48 +0000 5151) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5152) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5153) // C++14 [over.ics.list]p4: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5154) // C++11 [over.ics.list]p3: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5155) // Otherwise, if the parameter is a non-aggregate class X and overload +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5156) // resolution chooses a single best constructor [...] the implicit +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5157) // conversion sequence is a user-defined conversion sequence. If multiple +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5158) // constructors are viable but none is better than the others, the +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5159) // implicit conversion sequence is a user-defined conversion sequence. +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 5160) if (ToType->isRecordType() && !ToType->isAggregateType()) { +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 5161) // This function can deal with initializer lists. +a93f1028a07a9 (Richard Smith 2013-09-06 22:30:28 +0000 5162) return TryUserDefinedConversion(S, From, ToType, SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 5163) AllowedExplicit::None, +a93f1028a07a9 (Richard Smith 2013-09-06 22:30:28 +0000 5164) InOverloadResolution, /*CStyle=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5165) AllowObjCWritebackConversion, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5166) /*AllowObjCConversionOnExplicit=*/false); +6901c0de675f3 (Sebastian Redl 2011-12-22 18:58:38 +0000 5167) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5168) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5169) // C++14 [over.ics.list]p5: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5170) // C++11 [over.ics.list]p4: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5171) // Otherwise, if the parameter has an aggregate type which can be +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5172) // initialized from the initializer list [...] the implicit conversion +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5173) // sequence is a user-defined conversion sequence. +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5174) if (ToType->isAggregateType()) { +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5175) // Type is an aggregate, argument is an init list. At this point it comes +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5176) // down to checking whether the initialization works. +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5177) // FIXME: Find out whether this parameter is consumed or not. +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5178) InitializedEntity Entity = +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5179) InitializedEntity::InitializeParameter(S.Context, ToType, +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5180) /*Consumed=*/false); +5030928d60a1d (Richard Smith 2019-08-30 22:52:55 +0000 5181) if (S.CanPerformAggregateInitializationForOverloadResolution(Entity, +5030928d60a1d (Richard Smith 2019-08-30 22:52:55 +0000 5182) From)) { +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5183) Result.setUserDefined(); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5184) Result.UserDefined.Before.setAsIdentityConversion(); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5185) // Initializer lists don't have a type. +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5186) Result.UserDefined.Before.setFromType(QualType()); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5187) Result.UserDefined.Before.setAllToTypes(QualType()); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5188) +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5189) Result.UserDefined.After.setAsIdentityConversion(); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5190) Result.UserDefined.After.setFromType(ToType); +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5191) Result.UserDefined.After.setAllToTypes(ToType); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 5192) Result.UserDefined.ConversionFunction = nullptr; +72ef7bc2b580f (Sebastian Redl 2011-11-01 15:53:09 +0000 5193) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5194) return Result; +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5195) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5196) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5197) // C++14 [over.ics.list]p6: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5198) // C++11 [over.ics.list]p5: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5199) // Otherwise, if the parameter is a reference, see 13.3.3.1.4. +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5200) if (ToType->isReferenceType()) { +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5201) // The standard is notoriously unclear here, since 13.3.3.1.4 doesn't +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5202) // mention initializer lists in any way. So we go by what list- +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5203) // initialization would do and try to extrapolate from that. +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5204) +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 5205) QualType T1 = ToType->castAs()->getPointeeType(); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5206) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5207) // If the initializer list has a single element that is reference-related +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5208) // to the parameter type, we initialize the reference from that. +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5209) if (From->getNumInits() == 1) { +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5210) Expr *Init = From->getInit(0); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5211) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5212) QualType T2 = Init->getType(); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5213) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5214) // If the initializer is the address of an overloaded function, try +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5215) // to resolve the overloaded function. If all goes well, T2 is the +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5216) // type of the resulting function. +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5217) if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5218) DeclAccessPair Found; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5219) if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction( +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5220) Init, ToType, false, Found)) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5221) T2 = Fn->getType(); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5222) } +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5223) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5224) // Compute some basic properties of the types and the initializer. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5225) Sema::ReferenceCompareResult RefRelationship = +3ced23976aa8a (Richard Smith 2019-12-18 14:01:40 -0800 5226) S.CompareReferenceRelationship(From->getBeginLoc(), T1, T2); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5227) +4d2bbd78ff7eb (Richard Smith 2013-09-06 01:22:42 +0000 5228) if (RefRelationship >= Sema::Ref_Related) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5229) return TryReferenceInit(S, Init, ToType, /*FIXME*/ From->getBeginLoc(), +a93f1028a07a9 (Richard Smith 2013-09-06 22:30:28 +0000 5230) SuppressUserConversions, +a93f1028a07a9 (Richard Smith 2013-09-06 22:30:28 +0000 5231) /*AllowExplicit=*/false); +4d2bbd78ff7eb (Richard Smith 2013-09-06 01:22:42 +0000 5232) } +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5233) } +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5234) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5235) // Otherwise, we bind the reference to a temporary created from the +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5236) // initializer list. +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5237) Result = TryListConversion(S, From, T1, SuppressUserConversions, +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5238) InOverloadResolution, +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5239) AllowObjCWritebackConversion); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5240) if (Result.isFailure()) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5241) return Result; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5242) assert(!Result.isEllipsis() && +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5243) "Sub-initialization cannot result in ellipsis conversion."); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5244) +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5245) // Can we even bind to a temporary? +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5246) if (ToType->isRValueReferenceType() || +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5247) (T1.isConstQualified() && !T1.isVolatileQualified())) { +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5248) StandardConversionSequence &SCS = Result.isStandard() ? Result.Standard : +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5249) Result.UserDefined.After; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5250) SCS.ReferenceBinding = true; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5251) SCS.IsLvalueReference = ToType->isLValueReferenceType(); +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5252) SCS.BindsToRvalue = true; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5253) SCS.BindsToFunctionLvalue = false; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5254) SCS.BindsImplicitObjectArgumentWithoutRefQualifier = false; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5255) SCS.ObjCLifetimeConversionBinding = false; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5256) } else +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5257) Result.setBad(BadConversionSequence::lvalue_ref_to_rvalue, +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5258) From, ToType); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5259) return Result; +df888642733dd (Sebastian Redl 2011-12-03 14:54:30 +0000 5260) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5261) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5262) // C++14 [over.ics.list]p7: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5263) // C++11 [over.ics.list]p6: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5264) // Otherwise, if the parameter type is not a class: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5265) if (!ToType->isRecordType()) { +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5266) // - if the initializer list has one element that is not itself an +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5267) // initializer list, the implicit conversion sequence is the one +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5268) // required to convert the element to the parameter type. +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5269) unsigned NumInits = From->getNumInits(); +1bbaba874633e (Richard Smith 2015-01-27 23:23:39 +0000 5270) if (NumInits == 1 && !isa(From->getInit(0))) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5271) Result = TryCopyInitialization(S, From->getInit(0), ToType, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5272) SuppressUserConversions, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5273) InOverloadResolution, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5274) AllowObjCWritebackConversion); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5275) // - if the initializer list has no elements, the implicit conversion +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5276) // sequence is the identity conversion. +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5277) else if (NumInits == 0) { +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5278) Result.setStandard(); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5279) Result.Standard.setAsIdentityConversion(); +b73bc9af60367 (John McCall 2012-04-04 02:40:27 +0000 5280) Result.Standard.setFromType(ToType); +b73bc9af60367 (John McCall 2012-04-04 02:40:27 +0000 5281) Result.Standard.setAllToTypes(ToType); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5282) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5283) return Result; +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5284) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5285) +19d08672844ee (Larisse Voufo 2015-01-27 18:47:05 +0000 5286) // C++14 [over.ics.list]p8: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5287) // C++11 [over.ics.list]p7: +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5288) // In all cases other than those enumerated above, no conversion is possible +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5289) return Result; +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5290) } +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5291) +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5292) /// TryCopyInitialization - Try to copy-initialize a value of type +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5293) /// ToType from the expression From. Return the implicit conversion +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5294) /// sequence required to pass this argument, which may be a bad +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5295) /// conversion sequence (meaning that the argument cannot be passed to +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 5296) /// a parameter of this type). If @p SuppressUserConversions, then we +e81335c85ba47 (Douglas Gregor 2010-04-16 18:00:29 +0000 5297) /// do not permit any user-defined conversion sequences. +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 5298) static ImplicitConversionSequence +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 5299) TryCopyInitialization(Sema &S, Expr *From, QualType ToType, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5300) bool SuppressUserConversions, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 5301) bool InOverloadResolution, +6073dcab38e4e (Douglas Gregor 2012-02-24 23:56:31 +0000 5302) bool AllowObjCWritebackConversion, +6073dcab38e4e (Douglas Gregor 2012-02-24 23:56:31 +0000 5303) bool AllowExplicit) { +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5304) if (InitListExpr *FromInitList = dyn_cast(From)) +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5305) return TryListConversion(S, FromInitList, ToType, SuppressUserConversions, +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5306) InOverloadResolution,AllowObjCWritebackConversion); +b17be8dcfec4a (Sebastian Redl 2011-10-16 18:19:34 +0000 5307) +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5308) if (ToType->isReferenceType()) +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 5309) return TryReferenceInit(S, From, ToType, +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5310) /*FIXME:*/ From->getBeginLoc(), +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5311) SuppressUserConversions, AllowExplicit); +38ae6ab6bc14d (Douglas Gregor 2010-04-13 16:31:36 +0000 5312) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5313) return TryImplicitConversion(S, From, ToType, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5314) SuppressUserConversions, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 5315) AllowedExplicit::None, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 5316) InOverloadResolution, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 5317) /*CStyle=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5318) AllowObjCWritebackConversion, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5319) /*AllowObjCConversionOnExplicit=*/false); +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5320) } +8e1cf608dc587 (Douglas Gregor 2008-10-29 00:13:59 +0000 5321) +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5322) static bool TryCopyInitialization(const CanQualType FromQTy, +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5323) const CanQualType ToQTy, +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5324) Sema &S, +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5325) SourceLocation Loc, +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5326) ExprValueKind FromVK) { +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5327) OpaqueValueExpr TmpExpr(Loc, FromQTy, FromVK); +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5328) ImplicitConversionSequence ICS = +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5329) TryCopyInitialization(S, &TmpExpr, ToQTy, true, true, false); +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5330) +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5331) return !ICS.isBad(); +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5332) } +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 5333) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5334) /// TryObjectArgumentInitialization - Try to initialize the object +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5335) /// parameter of the given member function (@c Method) from the +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5336) /// expression @p From. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5337) static ImplicitConversionSequence +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 5338) TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5339) Expr::Classification FromClassification, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5340) CXXMethodDecl *Method, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5341) CXXRecordDecl *ActingContext) { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5342) QualType ClassType = S.Context.getTypeDeclType(ActingContext); +931e0bd331953 (Sebastian Redl 2009-11-18 20:55:52 +0000 5343) // [class.dtor]p2: A destructor can be invoked for a const, volatile or +931e0bd331953 (Sebastian Redl 2009-11-18 20:55:52 +0000 5344) // const volatile object. +88559637641e9 (Marco Antognini 2019-07-22 09:39:13 +0000 5345) Qualifiers Quals = Method->getMethodQualifiers(); +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5346) if (isa(Method)) { +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5347) Quals.addConst(); +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5348) Quals.addVolatile(); +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5349) } +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5350) +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5351) QualType ImplicitParamType = S.Context.getQualifiedType(ClassType, Quals); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5352) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5353) // Set up the conversion sequence as a "bad" conversion, to allow us +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5354) // to exit early. +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5355) ImplicitConversionSequence ICS; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5356) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5357) // We need to have an object of class type. +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5358) if (const PointerType *PT = FromType->getAs()) { +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5359) FromType = PT->getPointeeType(); +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5360) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5361) // When we had a pointer, it's implicitly dereferenced, so we +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5362) // better have an lvalue. +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5363) assert(FromClassification.isLValue()); +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5364) } +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5365) +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5366) assert(FromType->isRecordType()); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5367) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5368) // C++0x [over.match.funcs]p4: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5369) // For non-static member functions, the type of the implicit object +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5370) // parameter is +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5371) // +7c2888689dfdd (NAKAMURA Takumi 2011-01-27 07:09:49 +0000 5372) // - "lvalue reference to cv X" for functions declared without a +7c2888689dfdd (NAKAMURA Takumi 2011-01-27 07:09:49 +0000 5373) // ref-qualifier or with the & ref-qualifier +7c2888689dfdd (NAKAMURA Takumi 2011-01-27 07:09:49 +0000 5374) // - "rvalue reference to cv X" for functions declared with the && +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5375) // ref-qualifier +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5376) // +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5377) // where X is the class of which the function is a member and cv is the +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5378) // cv-qualification on the member function declaration. +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5379) // +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5380) // However, when finding an implicit conversion sequence for the argument, we +122f88d481971 (Richard Smith 2016-12-06 23:52:28 +0000 5381) // are not allowed to perform user-defined conversions +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5382) // (C++ [over.match.funcs]p5). We perform a simplified version of +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5383) // reference binding here, that allows class rvalues to bind to +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5384) // non-constant references. +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5385) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5386) // First check the qualifiers. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5387) QualType FromTypeCanon = S.Context.getCanonicalType(FromType); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5388) if (ImplicitParamType.getCVRQualifiers() +1b8fe5b716b8b (Douglas Gregor 2009-11-16 21:35:15 +0000 5389) != FromTypeCanon.getLocalCVRQualifiers() && +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 5390) !ImplicitParamType.isAtLeastAsQualifiedAs(FromTypeCanon)) { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5391) ICS.setBad(BadConversionSequence::bad_qualifiers, +03c66d3c57b51 (Richard Smith 2013-01-26 02:07:32 +0000 5392) FromType, ImplicitParamType); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5393) return ICS; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 5394) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5395) +f2ace9d6005b4 (Michael Liao 2019-12-06 11:48:15 -0500 5396) if (FromTypeCanon.hasAddressSpace()) { +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5397) Qualifiers QualsImplicitParamType = ImplicitParamType.getQualifiers(); +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5398) Qualifiers QualsFromType = FromTypeCanon.getQualifiers(); +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5399) if (!QualsImplicitParamType.isAddressSpaceSupersetOf(QualsFromType)) { +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5400) ICS.setBad(BadConversionSequence::bad_qualifiers, +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5401) FromType, ImplicitParamType); +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5402) return ICS; +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5403) } +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5404) } +5cffa45401149 (Anastasia Stulova 2019-01-21 16:01:38 +0000 5405) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5406) // Check that we have either the same type or a derived type. It +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5407) // affects the conversion rank. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5408) QualType ClassTypeCanon = S.Context.getCanonicalType(ClassType); +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5409) ImplicitConversionKind SecondKind; +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5410) if (ClassTypeCanon == FromTypeCanon.getLocalUnqualifiedType()) { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5411) SecondKind = ICK_Identity; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 5412) } else if (S.IsDerivedFrom(Loc, FromType, ClassType)) +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5413) SecondKind = ICK_Derived_To_Base; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 5414) else { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5415) ICS.setBad(BadConversionSequence::unrelated_class, +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5416) FromType, ImplicitParamType); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5417) return ICS; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 5418) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5419) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5420) // Check the ref-qualifier. +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5421) switch (Method->getRefQualifier()) { +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5422) case RQ_None: +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5423) // Do nothing; we don't care about lvalueness or rvalueness. +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5424) break; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5425) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5426) case RQ_LValue: +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5427) if (!FromClassification.isLValue() && !Quals.hasOnlyConst()) { +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5428) // non-const lvalue reference cannot bind to an rvalue +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5429) ICS.setBad(BadConversionSequence::lvalue_ref_to_rvalue, FromType, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5430) ImplicitParamType); +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5431) return ICS; +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5432) } +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5433) break; +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5434) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5435) case RQ_RValue: +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5436) if (!FromClassification.isRValue()) { +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5437) // rvalue reference cannot bind to an lvalue +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5438) ICS.setBad(BadConversionSequence::rvalue_ref_to_lvalue, FromType, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5439) ImplicitParamType); +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5440) return ICS; +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5441) } +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5442) break; +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5443) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5444) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5445) // Success. Mark this as a reference binding. +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 5446) ICS.setStandard(); +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5447) ICS.Standard.setAsIdentityConversion(); +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 5448) ICS.Standard.Second = SecondKind; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 5449) ICS.Standard.setFromType(FromType); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 5450) ICS.Standard.setAllToTypes(ImplicitParamType); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5451) ICS.Standard.ReferenceBinding = true; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5452) ICS.Standard.DirectBinding = true; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5453) ICS.Standard.IsLvalueReference = Method->getRefQualifier() != RQ_RValue; +e696ebbd70b3d (Douglas Gregor 2011-01-26 14:52:12 +0000 5454) ICS.Standard.BindsToFunctionLvalue = false; +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 5455) ICS.Standard.BindsToRvalue = FromClassification.isRValue(); +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 5456) ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier +e1a47c176656a (Douglas Gregor 2011-01-26 19:41:18 +0000 5457) = (Method->getRefQualifier() == RQ_None); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5458) return ICS; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5459) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5460) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5461) /// PerformObjectArgumentInitialization - Perform initialization of +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5462) /// the implicit object parameter for the given Method with the given +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5463) /// expression. +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5464) ExprResult +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5465) Sema::PerformObjectArgumentInitialization(Expr *From, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5466) NestedNameSpecifier *Qualifier, +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 5467) NamedDecl *FoundDecl, +cc3f325fa69e7 (Douglas Gregor 2010-03-03 23:55:11 +0000 5468) CXXMethodDecl *Method) { +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5469) QualType FromRecordType, DestType; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 5470) QualType ImplicitParamRecordType = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 5471) Method->getThisType()->castAs()->getPointeeType(); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 5472) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5473) Expr::Classification FromClassification; +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 5474) if (const PointerType *PT = From->getType()->getAs()) { +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5475) FromRecordType = PT->getPointeeType(); +5488ab4ddd47a (Brian Gesiak 2019-01-11 01:54:53 +0000 5476) DestType = Method->getThisType(); +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5477) FromClassification = Expr::Classification::makeSimpleLValue(); +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5478) } else { +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5479) FromRecordType = From->getType(); +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5480) DestType = ImplicitParamRecordType; +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 5481) FromClassification = From->Classify(Context); +7ed5fb2d22942 (Richard Smith 2018-07-27 17:13:18 +0000 5482) +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 5483) // When performing member access on a prvalue, materialize a temporary. +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 5484) if (From->isPRValue()) { +7ed5fb2d22942 (Richard Smith 2018-07-27 17:13:18 +0000 5485) From = CreateMaterializeTemporaryExpr(FromRecordType, From, +7ed5fb2d22942 (Richard Smith 2018-07-27 17:13:18 +0000 5486) Method->getRefQualifier() != +7ed5fb2d22942 (Richard Smith 2018-07-27 17:13:18 +0000 5487) RefQualifierKind::RQ_RValue); +7ed5fb2d22942 (Richard Smith 2018-07-27 17:13:18 +0000 5488) } +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5489) } +bfdea0f13684f (Anders Carlsson 2009-05-01 18:34:30 +0000 5490) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 5491) // Note that we always use the true parent context when performing +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 5492) // the actual argument initialization. +b58e51c304112 (Nico Weber 2014-11-19 05:21:39 +0000 5493) ImplicitConversionSequence ICS = TryObjectArgumentInitialization( +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5494) *this, From->getBeginLoc(), From->getType(), FromClassification, Method, +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 5495) Method->getParent()); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5496) if (ICS.isBad()) { +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5497) switch (ICS.Bad.Kind) { +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5498) case BadConversionSequence::bad_qualifiers: { +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5499) Qualifiers FromQs = FromRecordType.getQualifiers(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5500) Qualifiers ToQs = DestType.getQualifiers(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5501) unsigned CVR = FromQs.getCVRQualifiers() & ~ToQs.getCVRQualifiers(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5502) if (CVR) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5503) Diag(From->getBeginLoc(), diag::err_member_function_call_bad_cvr) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5504) << Method->getDeclName() << FromRecordType << (CVR - 1) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5505) << From->getSourceRange(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5506) Diag(Method->getLocation(), diag::note_previous_decl) +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5507) << Method->getDeclName(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5508) return ExprError(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5509) } +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5510) break; +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5511) } +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5512) +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5513) case BadConversionSequence::lvalue_ref_to_rvalue: +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5514) case BadConversionSequence::rvalue_ref_to_lvalue: { +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5515) bool IsRValueQualified = +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5516) Method->getRefQualifier() == RefQualifierKind::RQ_RValue; +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5517) Diag(From->getBeginLoc(), diag::err_member_function_call_bad_ref) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5518) << Method->getDeclName() << FromClassification.isRValue() +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5519) << IsRValueQualified; +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5520) Diag(Method->getLocation(), diag::note_previous_decl) +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5521) << Method->getDeclName(); +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5522) return ExprError(); +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5523) } +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5524) +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5525) case BadConversionSequence::no_conversion: +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5526) case BadConversionSequence::unrelated_class: +bb93578108c52 (Jacob Bandes-Storch 2017-12-31 18:27:29 +0000 5527) break; +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5528) } +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5529) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5530) return Diag(From->getBeginLoc(), diag::err_member_function_call_bad_type) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5531) << ImplicitParamRecordType << FromRecordType +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5532) << From->getSourceRange(); +9813d3221d7d5 (Argyrios Kyrtzidis 2010-11-16 08:04:45 +0000 5533) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 5534) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5535) if (ICS.Standard.Second == ICK_Derived_To_Base) { +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5536) ExprResult FromRes = +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5537) PerformObjectMemberConversion(From, Qualifier, FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5538) if (FromRes.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5539) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 5540) From = FromRes.get(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5541) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5542) +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5543) if (!Context.hasSameType(From->getType(), DestType)) { +26e095e84f0d0 (Anastasia Stulova 2019-05-02 16:10:50 +0000 5544) CastKind CK; +82888b78d47ed (Sven van Haastregt 2019-11-04 13:12:17 +0000 5545) QualType PteeTy = DestType->getPointeeType(); +82888b78d47ed (Sven van Haastregt 2019-11-04 13:12:17 +0000 5546) LangAS DestAS = +82888b78d47ed (Sven van Haastregt 2019-11-04 13:12:17 +0000 5547) PteeTy.isNull() ? DestType.getAddressSpace() : PteeTy.getAddressSpace(); +82888b78d47ed (Sven van Haastregt 2019-11-04 13:12:17 +0000 5548) if (FromRecordType.getAddressSpace() != DestAS) +26e095e84f0d0 (Anastasia Stulova 2019-05-02 16:10:50 +0000 5549) CK = CK_AddressSpaceConversion; +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5550) else +26e095e84f0d0 (Anastasia Stulova 2019-05-02 16:10:50 +0000 5551) CK = CK_NoOp; +26e095e84f0d0 (Anastasia Stulova 2019-05-02 16:10:50 +0000 5552) From = ImpCastExprToType(From, DestType, CK, From->getValueKind()).get(); +9d2872db7495d (Mikael Nilsson 2018-12-13 10:15:27 +0000 5553) } +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 5554) return From; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5555) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 5556) +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5557) /// TryContextuallyConvertToBool - Attempt to contextually convert the +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5558) /// expression From to bool (C++0x [conv]p3). +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5559) static ImplicitConversionSequence +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5560) TryContextuallyConvertToBool(Sema &S, Expr *From) { +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5561) // C++ [dcl.init]/17.8: +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5562) // - Otherwise, if the initialization is direct-initialization, the source +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5563) // type is std::nullptr_t, and the destination type is bool, the initial +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5564) // value of the object being initialized is false. +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5565) if (From->getType()->isNullPtrType()) +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5566) return ImplicitConversionSequence::getNullptrToBool(From->getType(), +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5567) S.Context.BoolTy, +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5568) From->isGLValue()); +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5569) +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5570) // All other direct-initialization of bool is equivalent to an implicit +9ce6dc9872be4 (Richard Smith 2020-02-11 06:09:18 -0800 5571) // conversion to bool in which explicit conversions are permitted. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5572) return TryImplicitConversion(S, From, S.Context.BoolTy, +ef4c72135f8ec (Anders Carlsson 2009-08-27 17:24:15 +0000 5573) /*SuppressUserConversions=*/false, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 5574) AllowedExplicit::Conversions, +582813596a100 (Douglas Gregor 2011-01-27 00:58:17 +0000 5575) /*InOverloadResolution=*/false, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 5576) /*CStyle=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5577) /*AllowObjCWritebackConversion=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5578) /*AllowObjCConversionOnExplicit=*/false); +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5579) } +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5580) +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5581) /// PerformContextuallyConvertToBool - Perform a contextual conversion +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5582) /// of the expression From to bool (C++0x [conv]p3). +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5583) ExprResult Sema::PerformContextuallyConvertToBool(Expr *From) { +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5584) if (checkPlaceholderForOverload(*this, From)) +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5585) return ExprError(); +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5586) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5587) ImplicitConversionSequence ICS = TryContextuallyConvertToBool(*this, From); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 5588) if (!ICS.isBad()) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 5589) return PerformImplicitConversion(From, Context.BoolTy, ICS, AA_Converting); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5590) +76197416ac15c (Fariborz Jahanian 2009-11-18 18:26:29 +0000 5591) if (!DiagnoseMultipleUserDefinedConversion(From, Context.BoolTy)) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5592) return Diag(From->getBeginLoc(), diag::err_typecheck_bool_condition) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5593) << From->getType() << From->getSourceRange(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 5594) return ExprError(); +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5595) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 5596) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5597) /// Check that the specified conversion is permitted in a converted constant +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5598) /// expression, according to C++11 [expr.const]p3. Return true if the conversion +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5599) /// is acceptable. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5600) static bool CheckConvertedConstantConversions(Sema &S, +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5601) StandardConversionSequence &SCS) { +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5602) // Since we know that the target type is an integral or unscoped enumeration +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5603) // type, most conversion kinds are impossible. All possible First and Third +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5604) // conversions are fine. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5605) switch (SCS.Second) { +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5606) case ICK_Identity: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5607) case ICK_Integral_Promotion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5608) case ICK_Integral_Conversion: // Narrowing conversions are checked elsewhere. +89831421af27b (Egor Churaev 2016-12-23 14:55:49 +0000 5609) case ICK_Zero_Queue_Conversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5610) return true; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5611) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5612) case ICK_Boolean_Conversion: +ca24ed473b9ce (Richard Smith 2012-09-13 22:00:12 +0000 5613) // Conversion from an integral or unscoped enumeration type to bool is +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5614) // classified as ICK_Boolean_Conversion, but it's also arguably an integral +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5615) // conversion, so we allow it in a converted constant expression. +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5616) // +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5617) // FIXME: Per core issue 1407, we should not allow this, but that breaks +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5618) // a lot of popular code. We should at least add a warning for this +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5619) // (non-conforming) extension. +ca24ed473b9ce (Richard Smith 2012-09-13 22:00:12 +0000 5620) return SCS.getFromType()->isIntegralOrUnscopedEnumerationType() && +ca24ed473b9ce (Richard Smith 2012-09-13 22:00:12 +0000 5621) SCS.getToType(2)->isBooleanType(); +ca24ed473b9ce (Richard Smith 2012-09-13 22:00:12 +0000 5622) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5623) case ICK_Pointer_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5624) case ICK_Pointer_Member: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5625) // C++1z: null pointer conversions and null member pointer conversions are +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5626) // only permitted if the source type is std::nullptr_t. +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5627) return SCS.getFromType()->isNullPtrType(); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5628) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5629) case ICK_Floating_Promotion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5630) case ICK_Complex_Promotion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5631) case ICK_Floating_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5632) case ICK_Complex_Conversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5633) case ICK_Floating_Integral: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5634) case ICK_Compatible_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5635) case ICK_Derived_To_Base: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5636) case ICK_Vector_Conversion: +feed5a7239d8e (Cullen Rhodes 2020-08-11 13:04:21 +0000 5637) case ICK_SVE_Vector_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5638) case ICK_Vector_Splat: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5639) case ICK_Complex_Real: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5640) case ICK_Block_Pointer_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5641) case ICK_TransparentUnionConversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5642) case ICK_Writeback_Conversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5643) case ICK_Zero_Event_Conversion: +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 5644) case ICK_C_Only_Conversion: +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 5645) case ICK_Incompatible_Pointer_Conversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5646) return false; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5647) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5648) case ICK_Lvalue_To_Rvalue: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5649) case ICK_Array_To_Pointer: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5650) case ICK_Function_To_Pointer: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5651) llvm_unreachable("found a first conversion kind in Second"); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5652) +b4a2d36c3f74e (Aaron Puchert 2020-08-29 18:13:56 +0200 5653) case ICK_Function_Conversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5654) case ICK_Qualification: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5655) llvm_unreachable("found a third conversion kind in Second"); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5656) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5657) case ICK_Num_Conversion_Kinds: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5658) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5659) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5660) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5661) llvm_unreachable("unknown conversion kind"); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5662) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5663) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5664) /// CheckConvertedConstantExpression - Check that the expression From is a +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5665) /// converted constant expression of type T, perform the conversion and produce +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5666) /// the converted expression, per C++11 [expr.const]p3. +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5667) static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5668) QualType T, APValue &Value, +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5669) Sema::CCEKind CCE, +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5670) bool RequireInt, +8ba442bc2136c (Hans Wennborg 2021-01-20 15:25:33 +0100 5671) NamedDecl *Dest) { +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5672) assert(S.getLangOpts().CPlusPlus11 && +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5673) "converted constant expression outside C++11"); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5674) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5675) if (checkPlaceholderForOverload(S, From)) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5676) return ExprError(); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5677) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5678) // C++1z [expr.const]p3: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5679) // A converted constant expression of type T is an expression, +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5680) // implicitly converted to type T, where the converted +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5681) // expression is a constant expression and the implicit conversion +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5682) // sequence contains only [... list of conversions ...]. +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5683) // C++1z [stmt.if]p2: +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5684) // If the if statement is of the form if constexpr, the value of the +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5685) // condition shall be a contextually converted constant expression of type +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5686) // bool. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5687) ImplicitConversionSequence ICS = +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 5688) CCE == Sema::CCEK_ConstexprIf || CCE == Sema::CCEK_ExplicitBool +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5689) ? TryContextuallyConvertToBool(S, From) +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5690) : TryCopyInitialization(S, From, T, +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5691) /*SuppressUserConversions=*/false, +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5692) /*InOverloadResolution=*/false, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 5693) /*AllowObjCWritebackConversion=*/false, +4a00774e59c71 (Ismail Pazarbasi 2016-09-07 18:24:54 +0000 5694) /*AllowExplicit=*/false); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 5695) StandardConversionSequence *SCS = nullptr; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5696) switch (ICS.getKind()) { +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5697) case ImplicitConversionSequence::StandardConversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5698) SCS = &ICS.Standard; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5699) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5700) case ImplicitConversionSequence::UserDefinedConversion: +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5701) if (T->isRecordType()) +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5702) SCS = &ICS.UserDefined.Before; +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5703) else +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5704) SCS = &ICS.UserDefined.After; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5705) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5706) case ImplicitConversionSequence::AmbiguousConversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5707) case ImplicitConversionSequence::BadConversion: +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5708) if (!S.DiagnoseMultipleUserDefinedConversion(From, T)) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5709) return S.Diag(From->getBeginLoc(), +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5710) diag::err_typecheck_converted_constant_expression) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5711) << From->getType() << From->getSourceRange() << T; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5712) return ExprError(); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5713) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5714) case ImplicitConversionSequence::EllipsisConversion: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5715) llvm_unreachable("ellipsis conversion in converted constant expression"); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5716) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5717) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5718) // Check that we would only use permitted conversions. +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5719) if (!CheckConvertedConstantConversions(S, *SCS)) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5720) return S.Diag(From->getBeginLoc(), +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5721) diag::err_typecheck_converted_constant_expression_disallowed) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5722) << From->getType() << From->getSourceRange() << T; +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5723) } +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5724) // [...] and where the reference binding (if any) binds directly. +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5725) if (SCS->ReferenceBinding && !SCS->DirectBinding) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5726) return S.Diag(From->getBeginLoc(), +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5727) diag::err_typecheck_converted_constant_expression_indirect) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5728) << From->getType() << From->getSourceRange() << T; +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5729) } +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5730) +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5731) // Usually we can simply apply the ImplicitConversionSequence we formed +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5732) // earlier, but that's not guaranteed to work when initializing an object of +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5733) // class type. +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5734) ExprResult Result; +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5735) if (T->isRecordType()) { +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5736) assert(CCE == Sema::CCEK_TemplateArg && +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5737) "unexpected class type converted constant expr"); +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5738) Result = S.PerformCopyInitialization( +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5739) InitializedEntity::InitializeTemplateParameter( +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5740) T, cast(Dest)), +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5741) SourceLocation(), From); +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5742) } else { +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5743) Result = S.PerformImplicitConversion(From, T, ICS, Sema::AA_Converting); +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5744) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5745) if (Result.isInvalid()) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5746) return Result; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5747) +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5748) // C++2a [intro.execution]p5: +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5749) // A full-expression is [...] a constant-expression [...] +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5750) Result = +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5751) S.ActOnFinishFullExpr(Result.get(), From->getExprLoc(), +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5752) /*DiscardedValue=*/false, /*IsConstexpr=*/true); +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5753) if (Result.isInvalid()) +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5754) return Result; +40c3d6e335900 (Richard Smith 2019-09-19 22:00:16 +0000 5755) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5756) // Check for a narrowing implicit conversion. +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5757) bool ReturnPreNarrowingValue = false; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5758) APValue PreNarrowingValue; +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 5759) QualType PreNarrowingType; +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5760) switch (SCS->getNarrowingKind(S.Context, Result.get(), PreNarrowingValue, +5614ca77153b2 (Richard Smith 2012-03-23 23:55:39 +0000 5761) PreNarrowingType)) { +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5762) case NK_Dependent_Narrowing: +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5763) // Implicit conversion to a narrower type, but the expression is +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5764) // value-dependent so we can't tell whether it's actually narrowing. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5765) case NK_Variable_Narrowing: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5766) // Implicit conversion to a narrower type, and the value is not a constant +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5767) // expression. We'll diagnose this in a moment. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5768) case NK_Not_Narrowing: +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5769) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5770) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5771) case NK_Constant_Narrowing: +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5772) if (CCE == Sema::CCEK_ArrayBound && +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5773) PreNarrowingType->isIntegralOrEnumerationType() && +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5774) PreNarrowingValue.isInt()) { +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5775) // Don't diagnose array bound narrowing here; we produce more precise +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5776) // errors by allowing the un-narrowed value through. +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5777) ReturnPreNarrowingValue = true; +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5778) break; +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5779) } +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5780) S.Diag(From->getBeginLoc(), diag::ext_cce_narrowing) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5781) << CCE << /*Constant*/ 1 +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5782) << PreNarrowingValue.getAsString(S.Context, PreNarrowingType) << T; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5783) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5784) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5785) case NK_Type_Narrowing: +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5786) // FIXME: It would be better to diagnose that the expression is not a +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5787) // constant expression. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5788) S.Diag(From->getBeginLoc(), diag::ext_cce_narrowing) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5789) << CCE << /*Constant*/ 0 << From->getType() << T; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5790) break; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5791) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5792) +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5793) if (Result.get()->isValueDependent()) { +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5794) Value = APValue(); +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5795) return Result; +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5796) } +52e624f3ecbe1 (Richard Smith 2016-12-21 21:42:57 +0000 5797) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5798) // Check the expression is a constant expression. +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 5799) SmallVector Notes; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5800) Expr::EvalResult Eval; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5801) Eval.Diag = &Notes; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5802) +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5803) ConstantExprKind Kind; +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5804) if (CCE == Sema::CCEK_TemplateArg && T->isRecordType()) +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5805) Kind = ConstantExprKind::ClassTemplateArgument; +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5806) else if (CCE == Sema::CCEK_TemplateArg) +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5807) Kind = ConstantExprKind::NonClassTemplateArgument; +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5808) else +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5809) Kind = ConstantExprKind::Normal; +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5810) +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5811) if (!Result.get()->EvaluateAsConstantExpr(Eval, S.Context, Kind) || +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5812) (RequireInt && !Eval.Val.isInt())) { +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5813) // The expression can't be folded, so we can't keep it at this position in +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5814) // the AST. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5815) Result = ExprError(); +911e142f034a3 (Richard Smith 2012-01-30 22:27:01 +0000 5816) } else { +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5817) Value = Eval.Val; +911e142f034a3 (Richard Smith 2012-01-30 22:27:01 +0000 5818) +911e142f034a3 (Richard Smith 2012-01-30 22:27:01 +0000 5819) if (Notes.empty()) { +911e142f034a3 (Richard Smith 2012-01-30 22:27:01 +0000 5820) // It's a constant expression. +8ba442bc2136c (Hans Wennborg 2021-01-20 15:25:33 +0100 5821) Expr *E = ConstantExpr::Create(S.Context, Result.get(), Value); +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5822) if (ReturnPreNarrowingValue) +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5823) Value = std::move(PreNarrowingValue); +c1c1bed5d0828 (Richard Smith 2020-08-19 12:46:52 -0700 5824) return E; +911e142f034a3 (Richard Smith 2012-01-30 22:27:01 +0000 5825) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5826) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5827) +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5828) // It's not a constant expression. Produce an appropriate diagnostic. +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5829) if (Notes.size() == 1 && +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5830) Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) { +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5831) S.Diag(Notes[0].first, diag::err_expr_not_cce) << CCE; +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5832) } else if (!Notes.empty() && Notes[0].second.getDiagID() == +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5833) diag::note_constexpr_invalid_template_arg) { +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5834) Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg); +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5835) for (unsigned I = 0; I < Notes.size(); ++I) +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5836) S.Diag(Notes[I].first, Notes[I].second); +7b3515880c22c (Richard Smith 2020-10-24 22:08:24 -0700 5837) } else { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5838) S.Diag(From->getBeginLoc(), diag::err_expr_not_cce) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5839) << CCE << From->getSourceRange(); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5840) for (unsigned I = 0; I < Notes.size(); ++I) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5841) S.Diag(Notes[I].first, Notes[I].second); +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5842) } +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5843) return ExprError(); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5844) } +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5845) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5846) ExprResult Sema::CheckConvertedConstantExpression(Expr *From, QualType T, +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5847) APValue &Value, CCEKind CCE, +8ba442bc2136c (Hans Wennborg 2021-01-20 15:25:33 +0100 5848) NamedDecl *Dest) { +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5849) return ::CheckConvertedConstantExpression(*this, From, T, Value, CCE, false, +8ba442bc2136c (Hans Wennborg 2021-01-20 15:25:33 +0100 5850) Dest); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5851) } +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5852) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5853) ExprResult Sema::CheckConvertedConstantExpression(Expr *From, QualType T, +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5854) llvm::APSInt &Value, +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5855) CCEKind CCE) { +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5856) assert(T->isIntegralOrEnumerationType() && "unexpected converted const type"); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5857) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5858) APValue V; +ba4768c966581 (Richard Smith 2020-09-20 23:16:08 -0700 5859) auto R = ::CheckConvertedConstantExpression(*this, From, T, V, CCE, true, +8ba442bc2136c (Hans Wennborg 2021-01-20 15:25:33 +0100 5860) /*Dest=*/nullptr); +01bfa68fecaf5 (Richard Smith 2016-12-27 02:02:09 +0000 5861) if (!R.isInvalid() && !R.get()->isValueDependent()) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5862) Value = V.getInt(); +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5863) return R; +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5864) } +f8379a0fc3592 (Richard Smith 2012-01-18 23:55:52 +0000 5865) +410cc893745ee (Richard Smith 2014-11-26 03:26:53 +0000 5866) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5867) /// dropPointerConversions - If the given standard conversion sequence +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5868) /// involves any pointer conversions, remove them. This may change +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5869) /// the result type of the conversion sequence. +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5870) static void dropPointerConversion(StandardConversionSequence &SCS) { +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5871) if (SCS.Second == ICK_Pointer_Conversion) { +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5872) SCS.Second = ICK_Identity; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5873) SCS.Third = ICK_Identity; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5874) SCS.ToTypePtrs[2] = SCS.ToTypePtrs[1] = SCS.ToTypePtrs[0]; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5875) } +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5876) } +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5877) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5878) /// TryContextuallyConvertToObjCPointer - Attempt to contextually +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5879) /// convert the expression From to an Objective-C pointer type. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5880) static ImplicitConversionSequence +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5881) TryContextuallyConvertToObjCPointer(Sema &S, Expr *From) { +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5882) // Do an implicit conversion to 'id'. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5883) QualType Ty = S.Context.getObjCIdType(); +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5884) ImplicitConversionSequence ICS +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5885) = TryImplicitConversion(S, From, Ty, +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5886) // FIXME: Are these flags correct? +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5887) /*SuppressUserConversions=*/false, +d28763cad06e6 (Richard Smith 2020-01-29 12:07:14 -0800 5888) AllowedExplicit::Conversions, +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5889) /*InOverloadResolution=*/false, +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5890) /*CStyle=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5891) /*AllowObjCWritebackConversion=*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 5892) /*AllowObjCConversionOnExplicit=*/true); +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5893) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5894) // Strip off any final conversions to 'id'. +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5895) switch (ICS.getKind()) { +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5896) case ImplicitConversionSequence::BadConversion: +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5897) case ImplicitConversionSequence::AmbiguousConversion: +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5898) case ImplicitConversionSequence::EllipsisConversion: +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5899) break; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5900) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5901) case ImplicitConversionSequence::UserDefinedConversion: +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5902) dropPointerConversion(ICS.UserDefined.After); +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5903) break; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5904) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5905) case ImplicitConversionSequence::StandardConversion: +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5906) dropPointerConversion(ICS.Standard); +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5907) break; +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5908) } +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5909) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5910) return ICS; +cac49a8f8a11d (Fariborz Jahanian 2010-05-12 23:29:11 +0000 5911) } +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 5912) +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5913) /// PerformContextuallyConvertToObjCPointer - Perform a contextual +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5914) /// conversion of the expression From to an Objective-C pointer type. +e15a370084f37 (Richard Smith 2016-10-06 23:12:58 +0000 5915) /// Returns a valid but null ExprResult if no conversion sequence exists. +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5916) ExprResult Sema::PerformContextuallyConvertToObjCPointer(Expr *From) { +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5917) if (checkPlaceholderForOverload(*this, From)) +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5918) return ExprError(); +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 5919) +8b07ec253d404 (John McCall 2010-05-15 11:32:37 +0000 5920) QualType Ty = Context.getObjCIdType(); +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5921) ImplicitConversionSequence ICS = +fec112d50e801 (John McCall 2011-09-09 06:11:02 +0000 5922) TryContextuallyConvertToObjCPointer(*this, From); +cac49a8f8a11d (Fariborz Jahanian 2010-05-12 23:29:11 +0000 5923) if (!ICS.isBad()) +cac49a8f8a11d (Fariborz Jahanian 2010-05-12 23:29:11 +0000 5924) return PerformImplicitConversion(From, Ty, ICS, AA_Converting); +e15a370084f37 (Richard Smith 2016-10-06 23:12:58 +0000 5925) return ExprResult(); +cac49a8f8a11d (Fariborz Jahanian 2010-05-12 23:29:11 +0000 5926) } +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 5927) +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 5928) /// Determine whether the provided type is an integral type, or an enumeration +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 5929) /// type of a permitted flavor. +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 5930) bool Sema::ICEConvertDiagnoser::match(QualType T) { +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 5931) return AllowScopedEnumerations ? T->isIntegralOrEnumerationType() +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 5932) : T->isIntegralOrUnscopedEnumerationType(); +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 5933) } +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 5934) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5935) static ExprResult +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5936) diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5937) Sema::ContextualImplicitConverter &Converter, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5938) QualType T, UnresolvedSetImpl &ViableConversions) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5939) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5940) if (Converter.Suppress) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5941) return ExprError(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5942) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5943) Converter.diagnoseAmbiguous(SemaRef, Loc, T) << From->getSourceRange(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5944) for (unsigned I = 0, N = ViableConversions.size(); I != N; ++I) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5945) CXXConversionDecl *Conv = +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5946) cast(ViableConversions[I]->getUnderlyingDecl()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5947) QualType ConvTy = Conv->getConversionType().getNonReferenceType(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5948) Converter.noteAmbiguous(SemaRef, Conv, ConvTy); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5949) } +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 5950) return From; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5951) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5952) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5953) static bool +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5954) diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5955) Sema::ContextualImplicitConverter &Converter, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5956) QualType T, bool HadMultipleCandidates, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5957) UnresolvedSetImpl &ExplicitConversions) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5958) if (ExplicitConversions.size() == 1 && !Converter.Suppress) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5959) DeclAccessPair Found = ExplicitConversions[0]; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5960) CXXConversionDecl *Conversion = +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5961) cast(Found->getUnderlyingDecl()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5962) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5963) // The user probably meant to invoke the given explicit +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5964) // conversion; use it. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5965) QualType ConvTy = Conversion->getConversionType().getNonReferenceType(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5966) std::string TypeStr; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5967) ConvTy.getAsStringInternal(TypeStr, SemaRef.getPrintingPolicy()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5968) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5969) Converter.diagnoseExplicitConv(SemaRef, Loc, T, ConvTy) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 5970) << FixItHint::CreateInsertion(From->getBeginLoc(), +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5971) "static_cast<" + TypeStr + ">(") +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5972) << FixItHint::CreateInsertion( +1c301dcbc4e59 (Stephen Kelly 2018-08-09 21:09:38 +0000 5973) SemaRef.getLocForEndOfToken(From->getEndLoc()), ")"); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5974) Converter.noteExplicitConv(SemaRef, Conversion, ConvTy); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5975) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5976) // If we aren't in a SFINAE context, build a call to the +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5977) // explicit conversion function. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5978) if (SemaRef.isSFINAEContext()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5979) return true; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5980) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 5981) SemaRef.CheckMemberOperatorAccess(From->getExprLoc(), From, nullptr, Found); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5982) ExprResult Result = SemaRef.BuildCXXMemberCallExpr(From, Found, Conversion, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5983) HadMultipleCandidates); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5984) if (Result.isInvalid()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5985) return true; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5986) // Record usage of conversion in an implicit cast. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5987) From = ImplicitCastExpr::Create(SemaRef.Context, Result.get()->getType(), +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 5988) CK_UserDefinedConversion, Result.get(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 5989) nullptr, Result.get()->getValueKind(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 5990) SemaRef.CurFPFeatureOverrides()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5991) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5992) return false; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5993) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5994) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5995) static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5996) Sema::ContextualImplicitConverter &Converter, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5997) QualType T, bool HadMultipleCandidates, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5998) DeclAccessPair &Found) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 5999) CXXConversionDecl *Conversion = +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6000) cast(Found->getUnderlyingDecl()); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 6001) SemaRef.CheckMemberOperatorAccess(From->getExprLoc(), From, nullptr, Found); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6002) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6003) QualType ToType = Conversion->getConversionType().getNonReferenceType(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6004) if (!Converter.SuppressConversion) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6005) if (SemaRef.isSFINAEContext()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6006) return true; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6007) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6008) Converter.diagnoseConversion(SemaRef, Loc, T, ToType) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6009) << From->getSourceRange(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6010) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6011) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6012) ExprResult Result = SemaRef.BuildCXXMemberCallExpr(From, Found, Conversion, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6013) HadMultipleCandidates); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6014) if (Result.isInvalid()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6015) return true; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6016) // Record usage of conversion in an implicit cast. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6017) From = ImplicitCastExpr::Create(SemaRef.Context, Result.get()->getType(), +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 6018) CK_UserDefinedConversion, Result.get(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 6019) nullptr, Result.get()->getValueKind(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 6020) SemaRef.CurFPFeatureOverrides()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6021) return false; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6022) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6023) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6024) static ExprResult finishContextualImplicitConversion( +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6025) Sema &SemaRef, SourceLocation Loc, Expr *From, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6026) Sema::ContextualImplicitConverter &Converter) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6027) if (!Converter.match(From->getType()) && !Converter.Suppress) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6028) Converter.diagnoseNoMatch(SemaRef, Loc, From->getType()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6029) << From->getSourceRange(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6030) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6031) return SemaRef.DefaultLvalueConversion(From); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6032) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6033) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6034) static void +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6035) collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6036) UnresolvedSetImpl &ViableConversions, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6037) OverloadCandidateSet &CandidateSet) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6038) for (unsigned I = 0, N = ViableConversions.size(); I != N; ++I) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6039) DeclAccessPair FoundDecl = ViableConversions[I]; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6040) NamedDecl *D = FoundDecl.getDecl(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6041) CXXRecordDecl *ActingContext = cast(D->getDeclContext()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6042) if (isa(D)) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6043) D = cast(D)->getTargetDecl(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6044) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6045) CXXConversionDecl *Conv; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6046) FunctionTemplateDecl *ConvTemplate; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6047) if ((ConvTemplate = dyn_cast(D))) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6048) Conv = cast(ConvTemplate->getTemplatedDecl()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6049) else +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6050) Conv = cast(D); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6051) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6052) if (ConvTemplate) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6053) SemaRef.AddTemplateConversionCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6054) ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6055) /*AllowObjCConversionOnExplicit=*/false, /*AllowExplicit*/ true); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6056) else +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6057) SemaRef.AddConversionCandidate(Conv, FoundDecl, ActingContext, From, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 6058) ToType, CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6059) /*AllowObjCConversionOnExplicit=*/false, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6060) /*AllowExplicit*/ true); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6061) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6062) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6063) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 6064) /// Attempt to convert the given expression to a type which is accepted +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6065) /// by the given converter. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6066) /// +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6067) /// This routine will attempt to convert an expression of class type to a +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6068) /// type accepted by the specified converter. In C++11 and before, the class +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6069) /// must have a single non-explicit conversion function converting to a matching +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6070) /// type. In C++1y, there can be multiple such conversion functions, but only +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6071) /// one target type. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6072) /// +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6073) /// \param Loc The source location of the construct that requires the +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6074) /// conversion. +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6075) /// +18348b6218e4c (James Dennett 2012-06-22 08:52:37 +0000 6076) /// \param From The expression we're converting from. +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6077) /// +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6078) /// \param Converter Used to control and diagnose the conversion process. +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 6079) /// +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6080) /// \returns The expression, converted to an integral or enumeration type if +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6081) /// successful. +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6082) ExprResult Sema::PerformContextualImplicitConversion( +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6083) SourceLocation Loc, Expr *From, ContextualImplicitConverter &Converter) { +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6084) // We can't perform any more checking for type-dependent expressions. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6085) if (From->isTypeDependent()) +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 6086) return From; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6087) +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6088) // Process placeholders immediately. +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6089) if (From->hasPlaceholderType()) { +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6090) ExprResult result = CheckPlaceholderExpr(From); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6091) if (result.isInvalid()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6092) return result; +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 6093) From = result.get(); +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6094) } +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6095) +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6096) // If the expression already has a matching type, we're golden. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6097) QualType T = From->getType(); +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6098) if (Converter.match(T)) +1da70394f68a5 (Eli Friedman 2012-01-26 00:26:18 +0000 6099) return DefaultLvalueConversion(From); +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6100) +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6101) // FIXME: Check for missing '()' if T is a function type? +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6102) +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6103) // We can only perform contextual implicit conversions on objects of class +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6104) // type. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6105) const RecordType *RecordTy = T->getAs(); +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 6106) if (!RecordTy || !getLangOpts().CPlusPlus) { +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6107) if (!Converter.Suppress) +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6108) Converter.diagnoseNoMatch(*this, Loc, T) << From->getSourceRange(); +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 6109) return From; +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6110) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6111) +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6112) // We must have a complete class type. +a6c5abb754044 (Douglas Gregor 2012-05-04 16:48:41 +0000 6113) struct TypeDiagnoserPartialDiag : TypeDiagnoser { +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6114) ContextualImplicitConverter &Converter; +e2b3744890f63 (Douglas Gregor 2012-05-04 22:38:52 +0000 6115) Expr *From; +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6116) +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6117) TypeDiagnoserPartialDiag(ContextualImplicitConverter &Converter, Expr *From) +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 6118) : Converter(Converter), From(From) {} +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6119) +e14c0f8e733e0 (Craig Topper 2014-03-12 04:55:44 +0000 6120) void diagnose(Sema &S, SourceLocation Loc, QualType T) override { +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6121) Converter.diagnoseIncomplete(S, Loc, T) << From->getSourceRange(); +7bfb2d026ec99 (Douglas Gregor 2012-05-04 16:32:21 +0000 6122) } +ccc11811052db (Richard Smith 2013-05-21 19:05:48 +0000 6123) } IncompleteDiagnoser(Converter, From); +7bfb2d026ec99 (Douglas Gregor 2012-05-04 16:32:21 +0000 6124) +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 6125) if (Converter.Suppress ? !isCompleteType(Loc, T) +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 6126) : RequireCompleteType(Loc, T, IncompleteDiagnoser)) +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 6127) return From; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6128) +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6129) // Look for a conversion to an integral or enumeration type. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6130) UnresolvedSet<4> +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6131) ViableConversions; // These are *potentially* viable in C++1y. +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6132) UnresolvedSet<4> ExplicitConversions; +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 6133) const auto &Conversions = +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6134) cast(RecordTy->getDecl())->getVisibleConversionFunctions(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6135) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6136) bool HadMultipleCandidates = +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 6137) (std::distance(Conversions.begin(), Conversions.end()) > 1); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6138) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6139) // To check that there is only one target type, in C++1y: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6140) QualType ToType; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6141) bool HasUniqueTargetType = true; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6142) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6143) // Collect explicit or viable (potentially in C++1y) conversions. +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 6144) for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6145) NamedDecl *D = (*I)->getUnderlyingDecl(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6146) CXXConversionDecl *Conversion; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6147) FunctionTemplateDecl *ConvTemplate = dyn_cast(D); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6148) if (ConvTemplate) { +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 6149) if (getLangOpts().CPlusPlus14) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6150) Conversion = cast(ConvTemplate->getTemplatedDecl()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6151) else +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6152) continue; // C++11 does not consider conversion operator templates(?). +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6153) } else +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6154) Conversion = cast(D); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6155) +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 6156) assert((!ConvTemplate || getLangOpts().CPlusPlus14) && +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6157) "Conversion operator templates are considered potentially " +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6158) "viable in C++1y"); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 6159) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6160) QualType CurToType = Conversion->getConversionType().getNonReferenceType(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6161) if (Converter.match(CurToType) || ConvTemplate) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6162) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6163) if (Conversion->isExplicit()) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6164) // FIXME: For C++1y, do we need this restriction? +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6165) // cf. diagnoseNoViableConversion() +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6166) if (!ConvTemplate) +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6167) ExplicitConversions.addDecl(I.getDecl(), I.getAccess()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6168) } else { +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 6169) if (!ConvTemplate && getLangOpts().CPlusPlus14) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6170) if (ToType.isNull()) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6171) ToType = CurToType.getUnqualifiedType(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6172) else if (HasUniqueTargetType && +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6173) (CurToType.getUnqualifiedType() != ToType)) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6174) HasUniqueTargetType = false; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6175) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6176) ViableConversions.addDecl(I.getDecl(), I.getAccess()); +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6177) } +8dd3425077ba7 (Richard Smith 2012-02-04 07:07:42 +0000 6178) } +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6179) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6180) +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 6181) if (getLangOpts().CPlusPlus14) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6182) // C++1y [conv]p6: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6183) // ... An expression e of class type E appearing in such a context +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6184) // is said to be contextually implicitly converted to a specified +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6185) // type T and is well-formed if and only if e can be implicitly +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6186) // converted to a type T that is determined as follows: E is searched +67170bd71ace5 (Larisse Voufo 2013-06-10 08:25:58 +0000 6187) // for conversion functions whose return type is cv T or reference to +67170bd71ace5 (Larisse Voufo 2013-06-10 08:25:58 +0000 6188) // cv T such that T is allowed by the context. There shall be +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6189) // exactly one such T. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6190) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6191) // If no unique T is found: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6192) if (ToType.isNull()) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6193) if (diagnoseNoViableConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6194) HadMultipleCandidates, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6195) ExplicitConversions)) +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6196) return ExprError(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6197) return finishContextualImplicitConversion(*this, Loc, From, Converter); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6198) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6199) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6200) // If more than one unique Ts are found: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6201) if (!HasUniqueTargetType) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6202) return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6203) ViableConversions); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6204) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6205) // If one unique T is found: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6206) // First, build a candidate set from the previously recorded +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6207) // potentially viable conversions. +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6208) OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6209) collectViableConversionCandidates(*this, From, ToType, ViableConversions, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6210) CandidateSet); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6211) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6212) // Then, perform overload resolution over the candidate set. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6213) OverloadCandidateSet::iterator Best; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6214) switch (CandidateSet.BestViableFunction(*this, Loc, Best)) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6215) case OR_Success: { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6216) // Apply this conversion. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6217) DeclAccessPair Found = +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6218) DeclAccessPair::make(Best->Function, Best->FoundDecl.getAccess()); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6219) if (recordConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6220) HadMultipleCandidates, Found)) +668443efb1db5 (Douglas Gregor 2011-01-20 00:18:04 +0000 6221) return ExprError(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6222) break; +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6223) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6224) case OR_Ambiguous: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6225) return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6226) ViableConversions); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6227) case OR_No_Viable_Function: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6228) if (diagnoseNoViableConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6229) HadMultipleCandidates, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6230) ExplicitConversions)) +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6231) return ExprError(); +f3b3ccda590c1 (Adrian Prantl 2017-12-19 22:06:11 +0000 6232) LLVM_FALLTHROUGH; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6233) case OR_Deleted: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6234) // We'll complain below about a non-integral condition type. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6235) break; +4799d03ce8411 (Douglas Gregor 2010-06-30 00:20:43 +0000 6236) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6237) } else { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6238) switch (ViableConversions.size()) { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6239) case 0: { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6240) if (diagnoseNoViableConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6241) HadMultipleCandidates, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6242) ExplicitConversions)) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6243) return ExprError(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6244) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6245) // We'll complain below about a non-integral condition type. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6246) break; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6247) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6248) case 1: { +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6249) // Apply this conversion. +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6250) DeclAccessPair Found = ViableConversions[0]; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6251) if (recordConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6252) HadMultipleCandidates, Found)) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6253) return ExprError(); +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6254) break; +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6255) } +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6256) default: +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6257) return diagnoseAmbiguousConversion(*this, Loc, From, Converter, T, +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6258) ViableConversions); +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6259) } +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6260) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6261) +236bec24ec195 (Larisse Voufo 2013-06-10 06:50:24 +0000 6262) return finishContextualImplicitConversion(*this, Loc, From, Converter); +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6263) } +f4ea725d38cc5 (Douglas Gregor 2010-06-29 23:17:37 +0000 6264) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6265) /// IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6266) /// an acceptable non-member overloaded operator for a call whose +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6267) /// arguments have types T1 (and, if non-empty, T2). This routine +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6268) /// implements the check in C++ [over.match.oper]p3b2 concerning +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6269) /// enumeration types. +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6270) static bool IsAcceptableNonMemberOperatorCandidate(ASTContext &Context, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6271) FunctionDecl *Fn, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6272) ArrayRef Args) { +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6273) QualType T1 = Args[0]->getType(); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6274) QualType T2 = Args.size() > 1 ? Args[1]->getType() : QualType(); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6275) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6276) if (T1->isDependentType() || (!T2.isNull() && T2->isDependentType())) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6277) return true; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6278) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6279) if (T1->isRecordType() || (!T2.isNull() && T2->isRecordType())) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6280) return true; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6281) +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 6282) const auto *Proto = Fn->getType()->castAs(); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6283) if (Proto->getNumParams() < 1) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6284) return false; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6285) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6286) if (T1->isEnumeralType()) { +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6287) QualType ArgType = Proto->getParamType(0).getNonReferenceType(); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6288) if (Context.hasSameUnqualifiedType(T1, ArgType)) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6289) return true; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6290) } +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6291) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6292) if (Proto->getNumParams() < 2) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6293) return false; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6294) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6295) if (!T2.isNull() && T2->isEnumeralType()) { +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6296) QualType ArgType = Proto->getParamType(1).getNonReferenceType(); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6297) if (Context.hasSameUnqualifiedType(T2, ArgType)) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6298) return true; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6299) } +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6300) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6301) return false; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6302) } +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6303) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6304) /// AddOverloadCandidate - Adds the given function to the set of +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 6305) /// candidate functions, using the given function call arguments. If +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 6306) /// @p SuppressUserConversions, then don't allow user-defined +2fe9883a961df (Douglas Gregor 2008-11-03 19:09:14 +0000 6307) /// conversions via constructors or conversion operators. +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 6308) /// +2a4d13c5cf5e9 (James Dennett 2012-06-15 07:13:21 +0000 6309) /// \param PartialOverloading true if we are performing "partial" overloading +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 6310) /// based on an incomplete set of function arguments. This feature is used by +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 6311) /// code completion. +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6312) void Sema::AddOverloadCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6313) FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef Args, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6314) OverloadCandidateSet &CandidateSet, bool SuppressUserConversions, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6315) bool PartialOverloading, bool AllowExplicit, bool AllowExplicitConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6316) ADLCallKind IsADLCandidate, ConversionSequenceList EarlyConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6317) OverloadCandidateParamOrder PO) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6318) const FunctionProtoType *Proto +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 6319) = dyn_cast(Function->getType()->getAs()); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6320) assert(Proto && "Functions without a prototype cannot be overloaded"); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 6321) assert(!Function->getDescribedFunctionTemplate() && +7c2888689dfdd (NAKAMURA Takumi 2011-01-27 07:09:49 +0000 6322) "Use AddTemplateOverloadCandidate for function templates"); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 6323) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6324) if (CXXMethodDecl *Method = dyn_cast(Function)) { +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6325) if (!isa(Method)) { +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6326) // If we get here, it's because we're calling a member function +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6327) // that is named without a member access expression (e.g., +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6328) // "this->f") that was either written explicitly or created +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6329) // implicitly. This can happen with a qualified call to a member +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 6330) // function, e.g., X::f(). We use an empty type for the implied +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 6331) // object argument (C++ [over.call.func]p3), and the acting context +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 6332) // is irrelevant. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6333) AddMethodCandidate(Method, FoundDecl, Method->getParent(), QualType(), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6334) Expr::Classification::makeSimpleLValue(), Args, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6335) CandidateSet, SuppressUserConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6336) PartialOverloading, EarlyConversions, PO); +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6337) return; +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6338) } +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6339) // We treat a constructor like a non-member function, since its object +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6340) // argument doesn't participate in overload resolution. +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6341) } +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6342) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6343) if (!CandidateSet.isNewCandidate(Function, PO)) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6344) return; +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 6345) +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6346) // C++11 [class.copy]p11: [DR1402] +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6347) // A defaulted move constructor that is defined as deleted is ignored by +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6348) // overload resolution. +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6349) CXXConstructorDecl *Constructor = dyn_cast(Function); +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6350) if (Constructor && Constructor->isDefaulted() && Constructor->isDeleted() && +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6351) Constructor->isMoveConstructor()) +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6352) return; +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6353) +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 6354) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 6355) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 6356) *this, Sema::ExpressionEvaluationContext::Unevaluated); +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 6357) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6358) // C++ [over.match.oper]p3: +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6359) // if no operand has a class type, only those non-member functions in the +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6360) // lookup set that have a first parameter of type T1 or "reference to +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6361) // (possibly cv-qualified) T1", when T1 is an enumeration type, or (if there +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6362) // is a right operand) a second parameter of type T2 or "reference to +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6363) // (possibly cv-qualified) T2", when T2 is an enumeration type, are +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6364) // candidate functions. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6365) if (CandidateSet.getKind() == OverloadCandidateSet::CSK_Operator && +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6366) !IsAcceptableNonMemberOperatorCandidate(Context, Function, Args)) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6367) return; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6368) +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6369) // Add this candidate +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6370) OverloadCandidate &Candidate = +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6371) CandidateSet.addCandidate(Args.size(), EarlyConversions); +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6372) Candidate.FoundDecl = FoundDecl; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6373) Candidate.Function = Function; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6374) Candidate.Viable = true; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6375) Candidate.RewriteKind = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6376) CandidateSet.getRewriteInfo().getRewriteKind(Function, PO); +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6377) Candidate.IsSurrogate = false; +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 6378) Candidate.IsADLCandidate = IsADLCandidate; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6379) Candidate.IgnoreObjectArgument = false; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6380) Candidate.ExplicitCallArguments = Args.size(); +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6381) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6382) // Explicit functions are not actually candidates at all if we're not +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6383) // allowing them in this context, but keep them around so we can point +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6384) // to them in diagnostics. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6385) if (!AllowExplicit && ExplicitSpecifier::getFromDecl(Function).isExplicit()) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6386) Candidate.Viable = false; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6387) Candidate.FailureKind = ovl_fail_explicit; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6388) return; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6389) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 6390) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 6391) if (Function->isMultiVersion() && Function->hasAttr() && +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6392) !Function->getAttr()->isDefaultVersion()) { +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6393) Candidate.Viable = false; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6394) Candidate.FailureKind = ovl_non_default_multiversion_function; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6395) return; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6396) } +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 6397) +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6398) if (Constructor) { +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6399) // C++ [class.copy]p3: +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6400) // A member function template is never instantiated to perform the copy +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6401) // of a class object to an object of its class type. +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6402) QualType ClassType = Context.getTypeDeclType(Constructor->getParent()); +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 6403) if (Args.size() == 1 && Constructor->isSpecializationCopyingObject() && +901e717f9295e (Douglas Gregor 2010-02-21 18:30:38 +0000 6404) (Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) || +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 6405) IsDerivedFrom(Args[0]->getBeginLoc(), Args[0]->getType(), +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 6406) ClassType))) { +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6407) Candidate.Viable = false; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6408) Candidate.FailureKind = ovl_fail_illegal_constructor; +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6409) return; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 6410) } +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6411) +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6412) // C++ [over.match.funcs]p8: (proposed DR resolution) +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6413) // A constructor inherited from class type C that has a first parameter +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6414) // of type "reference to P" (including such a constructor instantiated +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6415) // from a template) is excluded from the set of candidate functions when +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6416) // constructing an object of type cv D if the argument list has exactly +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6417) // one argument and D is reference-related to P and P is reference-related +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6418) // to C. +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6419) auto *Shadow = dyn_cast(FoundDecl.getDecl()); +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6420) if (Shadow && Args.size() == 1 && Constructor->getNumParams() >= 1 && +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6421) Constructor->getParamDecl(0)->getType()->isReferenceType()) { +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6422) QualType P = Constructor->getParamDecl(0)->getType()->getPointeeType(); +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6423) QualType C = Context.getRecordType(Constructor->getParent()); +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6424) QualType D = Context.getRecordType(Shadow->getParent()); +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6425) SourceLocation Loc = Args.front()->getExprLoc(); +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6426) if ((Context.hasSameUnqualifiedType(P, C) || IsDerivedFrom(Loc, P, C)) && +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6427) (Context.hasSameUnqualifiedType(D, P) || IsDerivedFrom(Loc, D, P))) { +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6428) Candidate.Viable = false; +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6429) Candidate.FailureKind = ovl_fail_inhctor_slice; +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6430) return; +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6431) } +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 6432) } +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6433) +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6434) // Check that the constructor is capable of constructing an object in the +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6435) // destination address space. +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6436) if (!Qualifiers::isAddressSpaceSupersetOf( +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6437) Constructor->getMethodQualifiers().getAddressSpace(), +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6438) CandidateSet.getDestAS())) { +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6439) Candidate.Viable = false; +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6440) Candidate.FailureKind = ovl_fail_object_addrspace_mismatch; +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 6441) } +ffe14e37121c5 (Douglas Gregor 2009-11-14 01:20:54 +0000 6442) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6443) +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 6444) unsigned NumParams = Proto->getNumParams(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6445) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6446) // (C++ 13.3.2p2): A candidate function having fewer than m +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6447) // parameters is viable only if it has an ellipsis in its parameter +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6448) // list (8.3.5). +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6449) if (TooManyArguments(NumParams, Args.size(), PartialOverloading) && +2a920014d3b33 (Douglas Gregor 2009-09-23 14:56:09 +0000 6450) !Proto->isVariadic()) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6451) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6452) Candidate.FailureKind = ovl_fail_too_many_arguments; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6453) return; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6454) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6455) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6456) // (C++ 13.3.2p2): A candidate function having more than m parameters +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6457) // is viable only if the (m+1)st parameter has a default argument +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6458) // (8.3.6). For the purposes of overload resolution, the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6459) // parameter list is truncated on the right, so that there are +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6460) // exactly m parameters. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6461) unsigned MinRequiredArgs = Function->getMinRequiredArguments(); +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 6462) if (Args.size() < MinRequiredArgs && !PartialOverloading) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6463) // Not enough arguments. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6464) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6465) Candidate.FailureKind = ovl_fail_too_few_arguments; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6466) return; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6467) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6468) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6469) // (CUDA B.1): Check for invalid calls between targets. +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 6470) if (getLangOpts().CUDA) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6471) if (const FunctionDecl *Caller = dyn_cast(CurContext)) +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 6472) // Skip the check for callers that are implicit members, because in this +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 6473) // case we may not yet know what the member's target is; the target is +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 6474) // inferred for the member automatically, based on the bases and fields of +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 6475) // the class. +b008003aa3f0d (Justin Lebar 2016-08-10 01:09:11 +0000 6476) if (!Caller->isImplicit() && !IsAllowedCUDACall(Caller, Function)) { +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6477) Candidate.Viable = false; +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6478) Candidate.FailureKind = ovl_fail_bad_target; +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6479) return; +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6480) } +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 6481) +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 6482) if (Function->getTrailingRequiresClause()) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6483) ConstraintSatisfaction Satisfaction; +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 6484) if (CheckFunctionConstraints(Function, Satisfaction) || +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6485) !Satisfaction.IsSatisfied) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6486) Candidate.Viable = false; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6487) Candidate.FailureKind = ovl_fail_constraints_not_satisfied; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6488) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6489) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6490) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6491) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6492) // Determine the implicit conversion sequences for each of the +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6493) // arguments. +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 6494) for (unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6495) unsigned ConvIdx = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6496) PO == OverloadCandidateParamOrder::Reversed ? 1 - ArgIdx : ArgIdx; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6497) if (Candidate.Conversions[ConvIdx].isInitialized()) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6498) // We already formed a conversion sequence for this parameter during +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6499) // template argument deduction. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6500) } else if (ArgIdx < NumParams) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6501) // (C++ 13.3.2p3): for F to be a viable function, there shall +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6502) // exist for each argument an implicit conversion sequence +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6503) // (13.3.3.1) that converts that argument to the corresponding +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6504) // parameter of F. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 6505) QualType ParamType = Proto->getParamType(ArgIdx); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6506) Candidate.Conversions[ConvIdx] = TryCopyInitialization( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6507) *this, Args[ArgIdx], ParamType, SuppressUserConversions, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6508) /*InOverloadResolution=*/true, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6509) /*AllowObjCWritebackConversion=*/ +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 6510) getLangOpts().ObjCAutoRefCount, AllowExplicitConversions); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6511) if (Candidate.Conversions[ConvIdx].isBad()) { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 6512) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6513) Candidate.FailureKind = ovl_fail_bad_conversion; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6514) return; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6515) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6516) } else { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6517) // (C++ 13.3.2p2): For the purposes of overload resolution, any +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6518) // argument for which there is no corresponding parameter is +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6519) // considered to ""match the ellipsis" (C+ 13.3.3.1.3). +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6520) Candidate.Conversions[ConvIdx].setEllipsis(); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6521) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6522) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6523) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6524) if (EnableIfAttr *FailedAttr = +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6525) CheckEnableIf(Function, CandidateSet.getLocation(), Args)) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6526) Candidate.Viable = false; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6527) Candidate.FailureKind = ovl_fail_enable_if; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6528) Candidate.DeductionFailure.Data = FailedAttr; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6529) return; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6530) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6531) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6532) +d2a3cd7261503 (Manman Ren 2016-04-07 19:30:20 +0000 6533) ObjCMethodDecl * +d2a3cd7261503 (Manman Ren 2016-04-07 19:30:20 +0000 6534) Sema::SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, +d2a3cd7261503 (Manman Ren 2016-04-07 19:30:20 +0000 6535) SmallVectorImpl &Methods) { +d2a3cd7261503 (Manman Ren 2016-04-07 19:30:20 +0000 6536) if (Methods.size() <= 1) +0ded42451d8d4 (Fariborz Jahanian 2014-08-13 21:24:14 +0000 6537) return nullptr; +d2a3cd7261503 (Manman Ren 2016-04-07 19:30:20 +0000 6538) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6539) for (unsigned b = 0, e = Methods.size(); b < e; b++) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6540) bool Match = true; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6541) ObjCMethodDecl *Method = Methods[b]; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6542) unsigned NumNamedArgs = Sel.getNumArgs(); +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6543) // Method might have more arguments than selector indicates. This is due +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6544) // to addition of c-style arguments in method. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6545) if (Method->param_size() > NumNamedArgs) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6546) NumNamedArgs = Method->param_size(); +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6547) if (Args.size() < NumNamedArgs) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6548) continue; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 6549) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6550) for (unsigned i = 0; i < NumNamedArgs; i++) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6551) // We can't do any type-checking on a type-dependent argument. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6552) if (Args[i]->isTypeDependent()) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6553) Match = false; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6554) break; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6555) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 6556) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6557) ParmVarDecl *param = Method->parameters()[i]; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6558) Expr *argExpr = Args[i]; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6559) assert(argExpr && "SelectBestMethod(): missing expression"); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 6560) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6561) // Strip the unbridged-cast placeholder expression off unless it's +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6562) // a consumed argument. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6563) if (argExpr->hasPlaceholderType(BuiltinType::ARCUnbridgedCast) && +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6564) !param->hasAttr()) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6565) argExpr = stripARCUnbridgedCast(argExpr); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 6566) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6567) // If the parameter is __unknown_anytype, move on to the next method. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6568) if (param->getType() == Context.UnknownAnyTy) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6569) Match = false; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6570) break; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6571) } +4546181e12c89 (George Burgess IV 2015-10-11 20:13:20 +0000 6572) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6573) ImplicitConversionSequence ConversionState +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6574) = TryCopyInitialization(*this, argExpr, param->getType(), +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6575) /*SuppressUserConversions*/false, +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6576) /*InOverloadResolution=*/true, +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6577) /*AllowObjCWritebackConversion=*/ +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6578) getLangOpts().ObjCAutoRefCount, +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6579) /*AllowExplicit*/false); +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6580) // This function looks for a reasonably-exact match, so we consider +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6581) // incompatible pointer conversions to be a failure here. +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6582) if (ConversionState.isBad() || +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6583) (ConversionState.isStandard() && +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6584) ConversionState.Standard.Second == +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6585) ICK_Incompatible_Pointer_Conversion)) { +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6586) Match = false; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6587) break; +2099b54102e7d (George Burgess IV 2016-09-02 22:59:57 +0000 6588) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6589) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6590) // Promote additional arguments to variadic methods. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6591) if (Match && Method->isVariadic()) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6592) for (unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6593) if (Args[i]->isTypeDependent()) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6594) Match = false; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6595) break; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6596) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6597) ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6598) nullptr); +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6599) if (Arg.isInvalid()) { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6600) Match = false; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6601) break; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6602) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6603) } +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6604) } else { +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6605) // Check for extra arguments to non-variadic methods. +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6606) if (Args.size() != NumNamedArgs) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6607) Match = false; +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6608) else if (Match && NumNamedArgs == 0 && Methods.size() > 1) { +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6609) // Special case when selectors have no argument. In this case, select +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6610) // one with the most general result type of 'id'. +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6611) for (unsigned b = 0, e = Methods.size(); b < e; b++) { +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6612) QualType ReturnT = Methods[b]->getReturnType(); +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6613) if (ReturnT->isObjCIdType()) +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6614) return Methods[b]; +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6615) } +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6616) } +180d76b4089e7 (Fariborz Jahanian 2014-08-27 16:38:47 +0000 6617) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6618) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6619) if (Match) +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6620) return Method; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6621) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6622) return nullptr; +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6623) } +30ae8d44139ba (Fariborz Jahanian 2014-08-13 21:07:35 +0000 6624) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6625) static bool convertArgsForAvailabilityChecks( +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6626) Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6627) ArrayRef Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6628) Expr *&ConvertedThis, SmallVectorImpl &ConvertedArgs) { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6629) if (ThisArg) { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6630) CXXMethodDecl *Method = cast(Function); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6631) assert(!isa(Method) && +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6632) "Shouldn't have `this` for ctors!"); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6633) assert(!Method->isStatic() && "Shouldn't have `this` for static methods!"); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6634) ExprResult R = S.PerformObjectArgumentInitialization( +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6635) ThisArg, /*Qualifier=*/nullptr, Method, Method); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6636) if (R.isInvalid()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6637) return false; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6638) ConvertedThis = R.get(); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6639) } else { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6640) if (auto *MD = dyn_cast(Function)) { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6641) (void)MD; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6642) assert((MissingImplicitThis || MD->isStatic() || +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6643) isa(MD)) && +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6644) "Expected `this` for non-ctor instance methods"); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6645) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6646) ConvertedThis = nullptr; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6647) } +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6648) +458b3f3a114d5 (George Burgess IV 2016-08-12 04:19:35 +0000 6649) // Ignore any variadic arguments. Converting them is pointless, since the +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6650) // user can't refer to them in the function condition. +53b938da5a39c (George Burgess IV 2016-08-12 04:12:31 +0000 6651) unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size()); +53b938da5a39c (George Burgess IV 2016-08-12 04:12:31 +0000 6652) +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6653) // Convert the arguments. +53b938da5a39c (George Burgess IV 2016-08-12 04:12:31 +0000 6654) for (unsigned I = 0; I != ArgSizeNoVarargs; ++I) { +e96abf79599d5 (George Burgess IV 2016-02-24 22:31:14 +0000 6655) ExprResult R; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6656) R = S.PerformCopyInitialization(InitializedEntity::InitializeParameter( +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6657) S.Context, Function->getParamDecl(I)), +e96abf79599d5 (George Burgess IV 2016-02-24 22:31:14 +0000 6658) SourceLocation(), Args[I]); +e96abf79599d5 (George Burgess IV 2016-02-24 22:31:14 +0000 6659) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6660) if (R.isInvalid()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6661) return false; +e96abf79599d5 (George Burgess IV 2016-02-24 22:31:14 +0000 6662) +e96abf79599d5 (George Burgess IV 2016-02-24 22:31:14 +0000 6663) ConvertedArgs.push_back(R.get()); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6664) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6665) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6666) if (Trap.hasErrorOccurred()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6667) return false; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6668) +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6669) // Push default arguments if needed. +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6670) if (!Function->isVariadic() && Args.size() < Function->getNumParams()) { +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6671) for (unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) { +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6672) ParmVarDecl *P = Function->getParamDecl(i); +b5f2c4e45b8d5 (Richard Smith 2020-06-02 10:42:36 -0700 6673) if (!P->hasDefaultArg()) +b5f2c4e45b8d5 (Richard Smith 2020-06-02 10:42:36 -0700 6674) return false; +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6675) ExprResult R = S.BuildCXXDefaultArgExpr(CallLoc, Function, P); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6676) if (R.isInvalid()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6677) return false; +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6678) ConvertedArgs.push_back(R.get()); +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6679) } +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6680) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6681) if (Trap.hasErrorOccurred()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6682) return false; +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6683) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6684) return true; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6685) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6686) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6687) EnableIfAttr *Sema::CheckEnableIf(FunctionDecl *Function, +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6688) SourceLocation CallLoc, +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6689) ArrayRef Args, +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6690) bool MissingImplicitThis) { +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 6691) auto EnableIfAttrs = Function->specific_attrs(); +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 6692) if (EnableIfAttrs.begin() == EnableIfAttrs.end()) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6693) return nullptr; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6694) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6695) SFINAETrap Trap(*this); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6696) SmallVector ConvertedArgs; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6697) // FIXME: We should look into making enable_if late-parsed. +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6698) Expr *DiscardedThis; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6699) if (!convertArgsForAvailabilityChecks( +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 6700) *this, Function, /*ThisArg=*/nullptr, CallLoc, Args, Trap, +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6701) /*MissingImplicitThis=*/true, DiscardedThis, ConvertedArgs)) +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 6702) return *EnableIfAttrs.begin(); +e283c5529e3c0 (Nick Lewycky 2015-08-25 22:33:16 +0000 6703) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 6704) for (auto *EIA : EnableIfAttrs) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6705) APValue Result; +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6706) // FIXME: This doesn't consider value-dependent cases, because doing so is +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6707) // very difficult. Ideally, we should handle them more gracefully. +04323c24a1ac9 (Dmitri Gribenko 2019-05-17 17:16:53 +0000 6708) if (EIA->getCond()->isValueDependent() || +04323c24a1ac9 (Dmitri Gribenko 2019-05-17 17:16:53 +0000 6709) !EIA->getCond()->EvaluateWithSubstitution( +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6710) Result, Context, Function, llvm::makeArrayRef(ConvertedArgs))) +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6711) return EIA; +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6712) +e8f10cc0b9a9f (George Burgess IV 2016-05-11 01:38:27 +0000 6713) if (!Result.isInt() || !Result.getInt().getBoolValue()) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6714) return EIA; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6715) } +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 6716) return nullptr; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6717) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 6718) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6719) template +a7233bd801602 (Argyrios Kyrtzidis 2017-05-24 00:46:27 +0000 6720) static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6721) bool ArgDependent, SourceLocation Loc, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6722) CheckFn &&IsSuccessful) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6723) SmallVector Attrs; +a7233bd801602 (Argyrios Kyrtzidis 2017-05-24 00:46:27 +0000 6724) for (const auto *DIA : ND->specific_attrs()) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6725) if (ArgDependent == DIA->getArgDependent()) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6726) Attrs.push_back(DIA); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6727) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6728) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6729) // Common case: No diagnose_if attributes, so we can quit early. +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6730) if (Attrs.empty()) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6731) return false; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6732) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6733) auto WarningBegin = std::stable_partition( +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6734) Attrs.begin(), Attrs.end(), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6735) [](const DiagnoseIfAttr *DIA) { return DIA->isError(); }); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6736) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6737) // Note that diagnose_if attributes are late-parsed, so they appear in the +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6738) // correct order (unlike enable_if attributes). +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6739) auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6740) IsSuccessful); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6741) if (ErrAttr != WarningBegin) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6742) const DiagnoseIfAttr *DIA = *ErrAttr; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6743) S.Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6744) S.Diag(DIA->getLocation(), diag::note_from_diagnose_if) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6745) << DIA->getParent() << DIA->getCond()->getSourceRange(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6746) return true; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6747) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6748) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6749) for (const auto *DIA : llvm::make_range(WarningBegin, Attrs.end())) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6750) if (IsSuccessful(DIA)) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6751) S.Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6752) S.Diag(DIA->getLocation(), diag::note_from_diagnose_if) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6753) << DIA->getParent() << DIA->getCond()->getSourceRange(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6754) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6755) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6756) return false; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6757) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6758) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6759) bool Sema::diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6760) const Expr *ThisArg, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6761) ArrayRef Args, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6762) SourceLocation Loc) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6763) return diagnoseDiagnoseIfAttrsWith( +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6764) *this, Function, /*ArgDependent=*/true, Loc, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6765) [&](const DiagnoseIfAttr *DIA) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6766) APValue Result; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6767) // It's sane to use the same Args for any redecl of this function, since +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6768) // EvaluateWithSubstitution only cares about the position of each +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6769) // argument in the arg list, not the ParmVarDecl* it maps to. +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6770) if (!DIA->getCond()->EvaluateWithSubstitution( +a7233bd801602 (Argyrios Kyrtzidis 2017-05-24 00:46:27 +0000 6771) Result, Context, cast(DIA->getParent()), Args, ThisArg)) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6772) return false; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6773) return Result.isInt() && Result.getInt().getBoolValue(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6774) }); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6775) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6776) +a7233bd801602 (Argyrios Kyrtzidis 2017-05-24 00:46:27 +0000 6777) bool Sema::diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6778) SourceLocation Loc) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6779) return diagnoseDiagnoseIfAttrsWith( +a7233bd801602 (Argyrios Kyrtzidis 2017-05-24 00:46:27 +0000 6780) *this, ND, /*ArgDependent=*/false, Loc, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6781) [&](const DiagnoseIfAttr *DIA) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6782) bool Result; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6783) return DIA->getCond()->EvaluateAsBooleanCondition(Result, Context) && +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6784) Result; +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6785) }); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6786) } +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6787) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 6788) /// Add all of the function declarations in the given function set to +ed4265c24e2b6 (Nick Lewycky 2013-09-22 10:06:01 +0000 6789) /// the overload candidate set. +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 6790) void Sema::AddFunctionCandidates(const UnresolvedSetImpl &Fns, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 6791) ArrayRef Args, +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6792) OverloadCandidateSet &CandidateSet, +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6793) TemplateArgumentListInfo *ExplicitTemplateArgs, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 6794) bool SuppressUserConversions, +e3962aebca1e2 (Benjamin Kramer 2017-10-26 08:41:28 +0000 6795) bool PartialOverloading, +e3962aebca1e2 (Benjamin Kramer 2017-10-26 08:41:28 +0000 6796) bool FirstArgumentIsBase) { +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 6797) for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6798) NamedDecl *D = F.getDecl()->getUnderlyingDecl(); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6799) ArrayRef FunctionArgs = Args; +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6800) +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6801) FunctionTemplateDecl *FunTmpl = dyn_cast(D); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6802) FunctionDecl *FD = +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6803) FunTmpl ? FunTmpl->getTemplatedDecl() : cast(D); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6804) +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6805) if (isa(FD) && !cast(FD)->isStatic()) { +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6806) QualType ObjectType; +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6807) Expr::Classification ObjectClassification; +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6808) if (Args.size() > 0) { +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6809) if (Expr *E = Args[0]) { +2a8c18d991188 (Alexander Kornienko 2018-04-06 15:14:32 +0000 6810) // Use the explicit base to restrict the lookup: +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6811) ObjectType = E->getType(); +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6812) // Pointers in the object arguments are implicitly dereferenced, so we +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6813) // always classify them as l-values. +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6814) if (!ObjectType.isNull() && ObjectType->isPointerType()) +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6815) ObjectClassification = Expr::Classification::makeSimpleLValue(); +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6816) else +143a9e0b1236d (Ilya Biryukov 2018-12-07 13:17:52 +0000 6817) ObjectClassification = E->Classify(Context); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6818) } // .. else there is an implicit base. +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6819) FunctionArgs = Args.slice(1); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6820) } +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6821) if (FunTmpl) { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6822) AddMethodTemplateCandidate( +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6823) FunTmpl, F.getPair(), +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 6824) cast(FunTmpl->getDeclContext()), +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6825) ExplicitTemplateArgs, ObjectType, ObjectClassification, +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6826) FunctionArgs, CandidateSet, SuppressUserConversions, +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6827) PartialOverloading); +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6828) } else { +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6829) AddMethodCandidate(cast(FD), F.getPair(), +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6830) cast(FD)->getParent(), ObjectType, +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6831) ObjectClassification, FunctionArgs, CandidateSet, +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6832) SuppressUserConversions, PartialOverloading); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6833) } +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6834) } else { +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6835) // This branch handles both standalone functions and static methods. +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6836) +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6837) // Slice the first argument (which is the base) when we access +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6838) // static method as non-static. +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6839) if (Args.size() > 0 && +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6840) (!Args[0] || (FirstArgumentIsBase && isa(FD) && +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6841) !isa(FD)))) { +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6842) assert(cast(FD)->isStatic()); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6843) FunctionArgs = Args.slice(1); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6844) } +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6845) if (FunTmpl) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6846) AddTemplateOverloadCandidate(FunTmpl, F.getPair(), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6847) ExplicitTemplateArgs, FunctionArgs, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6848) CandidateSet, SuppressUserConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6849) PartialOverloading); +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6850) } else { +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6851) AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet, +f83cfda02bd06 (Ivan Donchevskii 2018-06-21 08:34:50 +0000 6852) SuppressUserConversions, PartialOverloading); +f1898cfa42a05 (Erik Verbruggen 2017-03-28 07:22:21 +0000 6853) } +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 6854) } +15448f8d238c5 (Douglas Gregor 2009-06-27 21:05:07 +0000 6855) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 6856) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 6857) +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6858) /// AddMethodCandidate - Adds a named decl (which is some kind of +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6859) /// method) as a method candidate to the given overload set. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6860) void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 6861) Expr::Classification ObjectClassification, +51629dfce2e0c (Rafael Espindola 2013-04-29 19:29:25 +0000 6862) ArrayRef Args, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6863) OverloadCandidateSet &CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6864) bool SuppressUserConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6865) OverloadCandidateParamOrder PO) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6866) NamedDecl *Decl = FoundDecl.getDecl(); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 6867) CXXRecordDecl *ActingContext = cast(Decl->getDeclContext()); +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6868) +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6869) if (isa(Decl)) +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6870) Decl = cast(Decl)->getTargetDecl(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 6871) +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6872) if (FunctionTemplateDecl *TD = dyn_cast(Decl)) { +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6873) assert(isa(TD->getTemplatedDecl()) && +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6874) "Expected a member function template"); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6875) AddMethodTemplateCandidate(TD, FoundDecl, ActingContext, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6876) /*ExplicitArgs*/ nullptr, ObjectType, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6877) ObjectClassification, Args, CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6878) SuppressUserConversions, false, PO); +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6879) } else { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6880) AddMethodCandidate(cast(Decl), FoundDecl, ActingContext, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6881) ObjectType, ObjectClassification, Args, CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6882) SuppressUserConversions, false, None, PO); +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6883) } +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6884) } +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 6885) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6886) /// AddMethodCandidate - Adds the given C++ member function to the set +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6887) /// of candidate functions, using the given function call arguments +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6888) /// and the object argument (@c Object). For example, in a call +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6889) /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6890) /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6891) /// allow user-defined conversions via constructors or conversion +f1e4669232de4 (Douglas Gregor 2010-04-16 17:33:27 +0000 6892) /// operators. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 6893) void +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6894) Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl, +b89836b6db6fa (John McCall 2010-01-26 01:37:31 +0000 6895) CXXRecordDecl *ActingContext, QualType ObjectType, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 6896) Expr::Classification ObjectClassification, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 6897) ArrayRef Args, +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6898) OverloadCandidateSet &CandidateSet, +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6899) bool SuppressUserConversions, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6900) bool PartialOverloading, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6901) ConversionSequenceList EarlyConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6902) OverloadCandidateParamOrder PO) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 6903) const FunctionProtoType *Proto +9dd450bb78148 (John McCall 2009-09-21 23:43:11 +0000 6904) = dyn_cast(Method->getType()->getAs()); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6905) assert(Proto && "Methods without a prototype cannot be overloaded"); +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6906) assert(!isa(Method) && +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 6907) "Use AddOverloadCandidate for constructors"); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6908) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6909) if (!CandidateSet.isNewCandidate(Method, PO)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 6910) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 6911) +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6912) // C++11 [class.copy]p23: [DR1402] +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6913) // A defaulted move assignment operator that is defined as deleted is +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6914) // ignored by overload resolution. +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6915) if (Method->isDefaulted() && Method->isDeleted() && +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6916) Method->isMoveAssignmentOperator()) +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6917) return; +8b86f2d4010e1 (Richard Smith 2013-11-04 01:48:18 +0000 6918) +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 6919) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 6920) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 6921) *this, Sema::ExpressionEvaluationContext::Unevaluated); +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 6922) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6923) // Add this candidate +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6924) OverloadCandidate &Candidate = +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 6925) CandidateSet.addCandidate(Args.size() + 1, EarlyConversions); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 6926) Candidate.FoundDecl = FoundDecl; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6927) Candidate.Function = Method; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6928) Candidate.RewriteKind = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6929) CandidateSet.getRewriteInfo().getRewriteKind(Method, PO); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 6930) Candidate.IsSurrogate = false; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6931) Candidate.IgnoreObjectArgument = false; +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 6932) Candidate.ExplicitCallArguments = Args.size(); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6933) +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 6934) unsigned NumParams = Proto->getNumParams(); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6935) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6936) // (C++ 13.3.2p2): A candidate function having fewer than m +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6937) // parameters is viable only if it has an ellipsis in its parameter +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6938) // list (8.3.5). +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6939) if (TooManyArguments(NumParams, Args.size(), PartialOverloading) && +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6940) !Proto->isVariadic()) { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6941) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6942) Candidate.FailureKind = ovl_fail_too_many_arguments; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6943) return; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6944) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6945) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6946) // (C++ 13.3.2p2): A candidate function having more than m parameters +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6947) // is viable only if the (m+1)st parameter has a default argument +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6948) // (8.3.6). For the purposes of overload resolution, the +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6949) // parameter list is truncated on the right, so that there are +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6950) // exactly m parameters. +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6951) unsigned MinRequiredArgs = Method->getMinRequiredArguments(); +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 6952) if (Args.size() < MinRequiredArgs && !PartialOverloading) { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6953) // Not enough arguments. +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6954) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6955) Candidate.FailureKind = ovl_fail_too_few_arguments; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6956) return; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6957) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6958) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6959) Candidate.Viable = true; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6960) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 6961) if (Method->isStatic() || ObjectType.isNull()) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6962) // The implicit object argument is ignored. +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6963) Candidate.IgnoreObjectArgument = true; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6964) else { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6965) unsigned ConvIdx = PO == OverloadCandidateParamOrder::Reversed ? 1 : 0; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6966) // Determine the implicit conversion sequence for the object +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6967) // parameter. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6968) Candidate.Conversions[ConvIdx] = TryObjectArgumentInitialization( +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 6969) *this, CandidateSet.getLocation(), ObjectType, ObjectClassification, +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 6970) Method, ActingContext); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 6971) if (Candidate.Conversions[ConvIdx].isBad()) { +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6972) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 6973) Candidate.FailureKind = ovl_fail_bad_conversion; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6974) return; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 6975) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6976) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6977) +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6978) // (CUDA B.1): Check for invalid calls between targets. +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6979) if (getLangOpts().CUDA) +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6980) if (const FunctionDecl *Caller = dyn_cast(CurContext)) +b008003aa3f0d (Justin Lebar 2016-08-10 01:09:11 +0000 6981) if (!IsAllowedCUDACall(Caller, Method)) { +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6982) Candidate.Viable = false; +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6983) Candidate.FailureKind = ovl_fail_bad_target; +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6984) return; +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6985) } +291a57e2c22b6 (Eli Bendersky 2014-09-25 23:59:08 +0000 6986) +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 6987) if (Method->getTrailingRequiresClause()) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6988) ConstraintSatisfaction Satisfaction; +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 6989) if (CheckFunctionConstraints(Method, Satisfaction) || +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6990) !Satisfaction.IsSatisfied) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6991) Candidate.Viable = false; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6992) Candidate.FailureKind = ovl_fail_constraints_not_satisfied; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6993) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6994) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6995) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 6996) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6997) // Determine the implicit conversion sequences for each of the +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 6998) // arguments. +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 6999) for (unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7000) unsigned ConvIdx = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7001) PO == OverloadCandidateParamOrder::Reversed ? 0 : (ArgIdx + 1); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7002) if (Candidate.Conversions[ConvIdx].isInitialized()) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7003) // We already formed a conversion sequence for this parameter during +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7004) // template argument deduction. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7005) } else if (ArgIdx < NumParams) { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7006) // (C++ 13.3.2p3): for F to be a viable function, there shall +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7007) // exist for each argument an implicit conversion sequence +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7008) // (13.3.3.1) that converts that argument to the corresponding +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7009) // parameter of F. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 7010) QualType ParamType = Proto->getParamType(ArgIdx); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7011) Candidate.Conversions[ConvIdx] +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 7012) = TryCopyInitialization(*this, Args[ArgIdx], ParamType, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7013) SuppressUserConversions, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7014) /*InOverloadResolution=*/true, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7015) /*AllowObjCWritebackConversion=*/ +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 7016) getLangOpts().ObjCAutoRefCount); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7017) if (Candidate.Conversions[ConvIdx].isBad()) { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7018) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7019) Candidate.FailureKind = ovl_fail_bad_conversion; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7020) return; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7021) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7022) } else { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7023) // (C++ 13.3.2p2): For the purposes of overload resolution, any +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7024) // argument for which there is no corresponding parameter is +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7025) // considered to "match the ellipsis" (C+ 13.3.3.1.3). +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7026) Candidate.Conversions[ConvIdx].setEllipsis(); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7027) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7028) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7029) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7030) if (EnableIfAttr *FailedAttr = +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7031) CheckEnableIf(Method, CandidateSet.getLocation(), Args, true)) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7032) Candidate.Viable = false; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7033) Candidate.FailureKind = ovl_fail_enable_if; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7034) Candidate.DeductionFailure.Data = FailedAttr; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7035) return; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7036) } +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7037) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 7038) if (Method->isMultiVersion() && Method->hasAttr() && +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7039) !Method->getAttr()->isDefaultVersion()) { +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7040) Candidate.Viable = false; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7041) Candidate.FailureKind = ovl_non_default_multiversion_function; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7042) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7043) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7044) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7045) /// Add a C++ member function template as a candidate to the candidate +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7046) /// set, using template argument deduction to produce an appropriate member +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7047) /// function template specialization. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7048) void Sema::AddMethodTemplateCandidate( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7049) FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7050) CXXRecordDecl *ActingContext, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7051) TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7052) Expr::Classification ObjectClassification, ArrayRef Args, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7053) OverloadCandidateSet &CandidateSet, bool SuppressUserConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7054) bool PartialOverloading, OverloadCandidateParamOrder PO) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7055) if (!CandidateSet.isNewCandidate(MethodTmpl, PO)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7056) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7057) +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7058) // C++ [over.match.funcs]p7: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7059) // In each case where a candidate is a function template, candidate +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7060) // function template specializations are generated using template argument +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7061) // deduction (14.8.3, 14.8.2). Those candidates are then handled as +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7062) // candidate functions in the usual way.113) A given name can refer to one +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7063) // or more function templates and also to a set of overloaded non-template +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7064) // functions. In such a case, the candidate functions generated from each +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7065) // function template are combined with the set of non-template candidate +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7066) // functions. +e6706e40bb692 (Craig Topper 2012-09-19 02:26:47 +0000 7067) TemplateDeductionInfo Info(CandidateSet.getLocation()); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7068) FunctionDecl *Specialization = nullptr; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7069) ConversionSequenceList Conversions; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7070) if (TemplateDeductionResult Result = DeduceTemplateArguments( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7071) MethodTmpl, ExplicitTemplateArgs, Args, Specialization, Info, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7072) PartialOverloading, [&](ArrayRef ParamTypes) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7073) return CheckNonDependentConversions( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7074) MethodTmpl, ParamTypes, Args, CandidateSet, Conversions, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7075) SuppressUserConversions, ActingContext, ObjectType, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7076) ObjectClassification, PO); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7077) })) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7078) OverloadCandidate &Candidate = +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7079) CandidateSet.addCandidate(Conversions.size(), Conversions); +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7080) Candidate.FoundDecl = FoundDecl; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7081) Candidate.Function = MethodTmpl->getTemplatedDecl(); +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7082) Candidate.Viable = false; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7083) Candidate.RewriteKind = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7084) CandidateSet.getRewriteInfo().getRewriteKind(Candidate.Function, PO); +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7085) Candidate.IsSurrogate = false; +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7086) Candidate.IgnoreObjectArgument = +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7087) cast(Candidate.Function)->isStatic() || +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7088) ObjectType.isNull(); +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 7089) Candidate.ExplicitCallArguments = Args.size(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7090) if (Result == TDK_NonDependentConversionFailure) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7091) Candidate.FailureKind = ovl_fail_bad_conversion; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7092) else { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7093) Candidate.FailureKind = ovl_fail_bad_deduction; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7094) Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7095) Info); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7096) } +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7097) return; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7098) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7099) +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7100) // Add the function template specialization produced by template argument +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7101) // deduction as a candidate. +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7102) assert(Specialization && "Missing member function template specialization?"); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7103) assert(isa(Specialization) && +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7104) "Specialization is not a member function?"); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7105) AddMethodCandidate(cast(Specialization), FoundDecl, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 7106) ActingContext, ObjectType, ObjectClassification, Args, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 7107) CandidateSet, SuppressUserConversions, PartialOverloading, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7108) Conversions, PO); +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7109) } +97628d6a4ce22 (Douglas Gregor 2009-08-21 00:16:32 +0000 7110) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7111) /// Determine whether a given function template has a simple explicit specifier +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7112) /// or a non-value-dependent explicit-specification that evaluates to true. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7113) static bool isNonDependentlyExplicit(FunctionTemplateDecl *FTD) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7114) return ExplicitSpecifier::getFromDecl(FTD->getTemplatedDecl()).isExplicit(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7115) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7116) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7117) /// Add a C++ function template specialization as a candidate +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7118) /// in the candidate set, using template argument deduction to produce +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7119) /// an appropriate function template specialization. +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 7120) void Sema::AddTemplateOverloadCandidate( +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 7121) FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 7122) TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef Args, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 7123) OverloadCandidateSet &CandidateSet, bool SuppressUserConversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7124) bool PartialOverloading, bool AllowExplicit, ADLCallKind IsADLCandidate, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7125) OverloadCandidateParamOrder PO) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7126) if (!CandidateSet.isNewCandidate(FunctionTemplate, PO)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7127) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7128) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7129) // If the function template has a non-dependent explicit specification, +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7130) // exclude it now if appropriate; we are not permitted to perform deduction +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7131) // and substitution in this case. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7132) if (!AllowExplicit && isNonDependentlyExplicit(FunctionTemplate)) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7133) OverloadCandidate &Candidate = CandidateSet.addCandidate(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7134) Candidate.FoundDecl = FoundDecl; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7135) Candidate.Function = FunctionTemplate->getTemplatedDecl(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7136) Candidate.Viable = false; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7137) Candidate.FailureKind = ovl_fail_explicit; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7138) return; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7139) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7140) +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7141) // C++ [over.match.funcs]p7: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7142) // In each case where a candidate is a function template, candidate +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7143) // function template specializations are generated using template argument +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7144) // deduction (14.8.3, 14.8.2). Those candidates are then handled as +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7145) // candidate functions in the usual way.113) A given name can refer to one +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7146) // or more function templates and also to a set of overloaded non-template +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7147) // functions. In such a case, the candidate functions generated from each +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7148) // function template are combined with the set of non-template candidate +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7149) // functions. +e6706e40bb692 (Craig Topper 2012-09-19 02:26:47 +0000 7150) TemplateDeductionInfo Info(CandidateSet.getLocation()); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7151) FunctionDecl *Specialization = nullptr; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7152) ConversionSequenceList Conversions; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7153) if (TemplateDeductionResult Result = DeduceTemplateArguments( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7154) FunctionTemplate, ExplicitTemplateArgs, Args, Specialization, Info, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7155) PartialOverloading, [&](ArrayRef ParamTypes) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7156) return CheckNonDependentConversions( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7157) FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7158) SuppressUserConversions, nullptr, QualType(), {}, PO); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7159) })) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7160) OverloadCandidate &Candidate = +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7161) CandidateSet.addCandidate(Conversions.size(), Conversions); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7162) Candidate.FoundDecl = FoundDecl; +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 7163) Candidate.Function = FunctionTemplate->getTemplatedDecl(); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 7164) Candidate.Viable = false; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7165) Candidate.RewriteKind = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7166) CandidateSet.getRewriteInfo().getRewriteKind(Candidate.Function, PO); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 7167) Candidate.IsSurrogate = false; +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 7168) Candidate.IsADLCandidate = IsADLCandidate; +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7169) // Ignore the object argument if there is one, since we don't have an object +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7170) // type. +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7171) Candidate.IgnoreObjectArgument = +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7172) isa(Candidate.Function) && +9d05e15c3a26c (Richard Smith 2017-01-10 20:52:50 +0000 7173) !isa(Candidate.Function); +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 7174) Candidate.ExplicitCallArguments = Args.size(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7175) if (Result == TDK_NonDependentConversionFailure) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7176) Candidate.FailureKind = ovl_fail_bad_conversion; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7177) else { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7178) Candidate.FailureKind = ovl_fail_bad_deduction; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7179) Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7180) Info); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7181) } +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7182) return; +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7183) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7184) +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7185) // Add the function template specialization produced by template argument +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7186) // deduction as a candidate. +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7187) assert(Specialization && "Missing function template specialization?"); +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7188) AddOverloadCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7189) Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7190) PartialOverloading, AllowExplicit, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7191) /*AllowExplicitConversions*/ false, IsADLCandidate, Conversions, PO); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7192) } +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7193) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7194) /// Check that implicit conversion sequences can be formed for each argument +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7195) /// whose corresponding parameter has a non-dependent type, per DR1391's +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7196) /// [temp.deduct.call]p10. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7197) bool Sema::CheckNonDependentConversions( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7198) FunctionTemplateDecl *FunctionTemplate, ArrayRef ParamTypes, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7199) ArrayRef Args, OverloadCandidateSet &CandidateSet, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7200) ConversionSequenceList &Conversions, bool SuppressUserConversions, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7201) CXXRecordDecl *ActingContext, QualType ObjectType, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7202) Expr::Classification ObjectClassification, OverloadCandidateParamOrder PO) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7203) // FIXME: The cases in which we allow explicit conversions for constructor +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7204) // arguments never consider calling a constructor template. It's not clear +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7205) // that is correct. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7206) const bool AllowExplicit = false; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7207) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7208) auto *FD = FunctionTemplate->getTemplatedDecl(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7209) auto *Method = dyn_cast(FD); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7210) bool HasThisConversion = Method && !isa(Method); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7211) unsigned ThisConversions = HasThisConversion ? 1 : 0; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7212) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7213) Conversions = +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7214) CandidateSet.allocateConversionSequences(ThisConversions + Args.size()); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7215) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7216) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7217) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7218) *this, Sema::ExpressionEvaluationContext::Unevaluated); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7219) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7220) // For a method call, check the 'this' conversion here too. DR1391 doesn't +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7221) // require that, but this check should never result in a hard error, and +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7222) // overload resolution is permitted to sidestep instantiations. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7223) if (HasThisConversion && !cast(FD)->isStatic() && +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7224) !ObjectType.isNull()) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7225) unsigned ConvIdx = PO == OverloadCandidateParamOrder::Reversed ? 1 : 0; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7226) Conversions[ConvIdx] = TryObjectArgumentInitialization( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7227) *this, CandidateSet.getLocation(), ObjectType, ObjectClassification, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7228) Method, ActingContext); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7229) if (Conversions[ConvIdx].isBad()) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7230) return true; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7231) } +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7232) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7233) for (unsigned I = 0, N = std::min(ParamTypes.size(), Args.size()); I != N; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7234) ++I) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7235) QualType ParamType = ParamTypes[I]; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7236) if (!ParamType->isDependentType()) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7237) unsigned ConvIdx = PO == OverloadCandidateParamOrder::Reversed +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7238) ? 0 +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7239) : (ThisConversions + I); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7240) Conversions[ConvIdx] +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7241) = TryCopyInitialization(*this, Args[I], ParamType, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7242) SuppressUserConversions, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7243) /*InOverloadResolution=*/true, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7244) /*AllowObjCWritebackConversion=*/ +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7245) getLangOpts().ObjCAutoRefCount, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7246) AllowExplicit); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7247) if (Conversions[ConvIdx].isBad()) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7248) return true; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7249) } +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7250) } +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7251) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 7252) return false; +ad3f2fcf43eb7 (Douglas Gregor 2009-06-25 22:08:12 +0000 7253) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7254) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7255) /// Determine whether this is an allowable conversion from the result +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7256) /// of an explicit conversion operator to the expected type, per C++ +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7257) /// [over.match.conv]p1 and [over.match.ref]p1. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7258) /// +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7259) /// \param ConvType The return type of the conversion function. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7260) /// +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7261) /// \param ToType The type we are converting to. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7262) /// +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7263) /// \param AllowObjCPointerConversion Allow a conversion from one +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7264) /// Objective-C pointer to another. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7265) /// +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7266) /// \returns true if the conversion is allowable, false otherwise. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7267) static bool isAllowableExplicitConversion(Sema &S, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7268) QualType ConvType, QualType ToType, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7269) bool AllowObjCPointerConversion) { +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7270) QualType ToNonRefType = ToType.getNonReferenceType(); +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7271) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7272) // Easy case: the types are the same. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7273) if (S.Context.hasSameUnqualifiedType(ConvType, ToNonRefType)) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7274) return true; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7275) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7276) // Allow qualification conversions. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7277) bool ObjCLifetimeConversion; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7278) if (S.IsQualificationConversion(ConvType, ToNonRefType, /*CStyle*/false, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7279) ObjCLifetimeConversion)) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7280) return true; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7281) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7282) // If we're not allowed to consider Objective-C pointer conversions, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7283) // we're done. +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7284) if (!AllowObjCPointerConversion) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7285) return false; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7286) +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7287) // Is this an Objective-C pointer conversion? +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7288) bool IncompatibleObjC = false; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7289) QualType ConvertedType; +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7290) return S.isObjCPointerConversion(ConvType, ToNonRefType, ConvertedType, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7291) IncompatibleObjC); +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7292) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7293) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7294) /// AddConversionCandidate - Add a C++ conversion function as a +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7295) /// candidate in the candidate set (C++ [over.match.conv], +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7296) /// C++ [over.match.copy]). From is the expression we're converting from, +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7297) /// and ToType is the type that we're eventually trying to convert to +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7298) /// (which may or may not be the same type as the type that the +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7299) /// conversion function produces). +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7300) void Sema::AddConversionCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7301) CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7302) CXXRecordDecl *ActingContext, Expr *From, QualType ToType, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7303) OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7304) bool AllowExplicit, bool AllowResultConversion) { +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7305) assert(!Conversion->getDescribedFunctionTemplate() && +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7306) "Conversion function templates use AddTemplateConversionCandidate"); +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 7307) QualType ConvType = Conversion->getConversionType().getNonReferenceType(); +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7308) if (!CandidateSet.isNewCandidate(Conversion)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7309) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7310) +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7311) // If the conversion function has an undeduced return type, trigger its +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7312) // deduction now. +dd69ef38dba72 (Aaron Ballman 2014-08-19 15:55:55 +0000 7313) if (getLangOpts().CPlusPlus14 && ConvType->isUndeducedType()) { +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7314) if (DeduceReturnType(Conversion, From->getExprLoc())) +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7315) return; +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7316) ConvType = Conversion->getConversionType().getNonReferenceType(); +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7317) } +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 7318) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7319) // If we don't allow any conversion of the result type, ignore conversion +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7320) // functions that don't convert to exactly (possibly cv-qualified) T. +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7321) if (!AllowResultConversion && +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7322) !Context.hasSameUnqualifiedType(Conversion->getConversionType(), ToType)) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7323) return; +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7324) +089c31637f86a (Richard Smith 2013-09-21 21:55:46 +0000 7325) // Per C++ [over.match.conv]p1, [over.match.ref]p1, an explicit conversion +089c31637f86a (Richard Smith 2013-09-21 21:55:46 +0000 7326) // operator is only a candidate if its return type is the target type or +089c31637f86a (Richard Smith 2013-09-21 21:55:46 +0000 7327) // can be converted to the target type with a qualification conversion. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7328) // +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7329) // FIXME: Include such functions in the candidate list and explain why we +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7330) // can't select them. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7331) if (Conversion->isExplicit() && +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7332) !isAllowableExplicitConversion(*this, ConvType, ToType, +4b60a1594d2c6 (Douglas Gregor 2013-11-07 22:34:54 +0000 7333) AllowObjCConversionOnExplicit)) +089c31637f86a (Richard Smith 2013-09-21 21:55:46 +0000 7334) return; +089c31637f86a (Richard Smith 2013-09-21 21:55:46 +0000 7335) +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7336) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7337) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7338) *this, Sema::ExpressionEvaluationContext::Unevaluated); +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7339) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7340) // Add this candidate +fb761ff54452f (Benjamin Kramer 2012-01-14 16:31:55 +0000 7341) OverloadCandidate &Candidate = CandidateSet.addCandidate(1); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7342) Candidate.FoundDecl = FoundDecl; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7343) Candidate.Function = Conversion; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7344) Candidate.IsSurrogate = false; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 7345) Candidate.IgnoreObjectArgument = false; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7346) Candidate.FinalConversion.setAsIdentityConversion(); +5ab116553171e (Douglas Gregor 2010-04-17 22:01:05 +0000 7347) Candidate.FinalConversion.setFromType(ConvType); +3edc4d5ec3fdc (Douglas Gregor 2010-01-27 03:51:04 +0000 7348) Candidate.FinalConversion.setAllToTypes(ToType); +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7349) Candidate.Viable = true; +6edd977c6f368 (Douglas Gregor 2011-01-19 23:54:39 +0000 7350) Candidate.ExplicitCallArguments = 1; +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7351) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7352) // Explicit functions are not actually candidates at all if we're not +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7353) // allowing them in this context, but keep them around so we can point +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7354) // to them in diagnostics. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7355) if (!AllowExplicit && Conversion->isExplicit()) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7356) Candidate.Viable = false; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7357) Candidate.FailureKind = ovl_fail_explicit; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7358) return; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7359) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7360) +6affc78f1b43b (Douglas Gregor 2010-08-19 15:37:02 +0000 7361) // C++ [over.match.funcs]p4: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7362) // For conversion functions, the function is considered to be a member of +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7363) // the class of the implicit implied object argument for the purpose of +6affc78f1b43b (Douglas Gregor 2010-08-19 15:37:02 +0000 7364) // defining the type of the implicit object parameter. +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7365) // +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7366) // Determine the implicit conversion sequence for the implicit +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7367) // object parameter. +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7368) QualType ImplicitParamType = From->getType(); +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7369) if (const PointerType *FromPtrType = ImplicitParamType->getAs()) +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7370) ImplicitParamType = FromPtrType->getPointeeType(); +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7371) CXXRecordDecl *ConversionContext +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 7372) = cast(ImplicitParamType->castAs()->getDecl()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7373) +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7374) Candidate.Conversions[0] = TryObjectArgumentInitialization( +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7375) *this, CandidateSet.getLocation(), From->getType(), +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7376) From->Classify(Context), Conversion, ConversionContext); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7377) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7378) if (Candidate.Conversions[0].isBad()) { +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7379) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7380) Candidate.FailureKind = ovl_fail_bad_conversion; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7381) return; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7382) } +c9ed4681a8511 (Douglas Gregor 2010-08-19 15:57:50 +0000 7383) +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 7384) if (Conversion->getTrailingRequiresClause()) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7385) ConstraintSatisfaction Satisfaction; +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 7386) if (CheckFunctionConstraints(Conversion, Satisfaction) || +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7387) !Satisfaction.IsSatisfied) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7388) Candidate.Viable = false; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7389) Candidate.FailureKind = ovl_fail_constraints_not_satisfied; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7390) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7391) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7392) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 7393) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7394) // We won't go through a user-defined type conversion function to convert a +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7395) // derived to base as such conversions are given Conversion Rank. They only +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7396) // go through a copy constructor. 13.3.3.1.2-p4 [over.ics.user] +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7397) QualType FromCanon +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7398) = Context.getCanonicalType(From->getType().getUnqualifiedType()); +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7399) QualType ToCanon = Context.getCanonicalType(ToType).getUnqualifiedType(); +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7400) if (FromCanon == ToCanon || +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7401) IsDerivedFrom(CandidateSet.getLocation(), FromCanon, ToCanon)) { +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7402) Candidate.Viable = false; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 7403) Candidate.FailureKind = ovl_fail_trivial_conversion; +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7404) return; +996a6aa3f18c3 (Fariborz Jahanian 2009-10-19 19:18:20 +0000 7405) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7406) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7407) // To determine what the conversion from the result of calling the +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7408) // conversion function to the type we're eventually trying to +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7409) // convert to (ToType), we need to synthesize a call to the +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7410) // conversion function and attempt copy initialization from it. This +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7411) // makes sure that we get the right semantics with respect to +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7412) // lvalues/rvalues and the type. Fortunately, we can allocate this +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7413) // call on the stack and we don't need its arguments to be +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7414) // well-formed. +5fc4db75798c8 (Bruno Ricci 2018-12-21 14:10:18 +0000 7415) DeclRefExpr ConversionRef(Context, Conversion, false, Conversion->getType(), +5fc4db75798c8 (Bruno Ricci 2018-12-21 14:10:18 +0000 7416) VK_LValue, From->getBeginLoc()); +cf1421650953d (John McCall 2010-08-07 06:22:56 +0000 7417) ImplicitCastExpr ConversionFn(ImplicitCastExpr::OnStack, +cf1421650953d (John McCall 2010-08-07 06:22:56 +0000 7418) Context.getPointerType(Conversion->getType()), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 7419) CK_FunctionToPointerDecay, &ConversionRef, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 7420) VK_PRValue, FPOptionsOverride()); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7421) +48d2464c3fd8b (Richard Smith 2011-07-13 22:53:21 +0000 7422) QualType ConversionType = Conversion->getConversionType(); +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 7423) if (!isCompleteType(From->getBeginLoc(), ConversionType)) { +72ebdabc5d60e (Douglas Gregor 2010-11-13 19:36:57 +0000 7424) Candidate.Viable = false; +72ebdabc5d60e (Douglas Gregor 2010-11-13 19:36:57 +0000 7425) Candidate.FailureKind = ovl_fail_bad_final_conversion; +72ebdabc5d60e (Douglas Gregor 2010-11-13 19:36:57 +0000 7426) return; +72ebdabc5d60e (Douglas Gregor 2010-11-13 19:36:57 +0000 7427) } +72ebdabc5d60e (Douglas Gregor 2010-11-13 19:36:57 +0000 7428) +48d2464c3fd8b (Richard Smith 2011-07-13 22:53:21 +0000 7429) ExprValueKind VK = Expr::getValueKindForType(ConversionType); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 7430) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7431) // Note that it is safe to allocate CallExpr on the stack here because +d7b4f40b18476 (Ted Kremenek 2009-02-09 20:51:47 +0000 7432) // there are 0 arguments (i.e., nothing is allocated using ASTContext's +d7b4f40b18476 (Ted Kremenek 2009-02-09 20:51:47 +0000 7433) // allocator). +48d2464c3fd8b (Richard Smith 2011-07-13 22:53:21 +0000 7434) QualType CallResultType = ConversionType.getNonLValueExprType(Context); +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7435) +ac8686205b0b0 (JF Bastien 2019-07-29 23:12:48 +0000 7436) alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)]; +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7437) CallExpr *TheTemporaryCall = CallExpr::CreateTemporary( +ac8686205b0b0 (JF Bastien 2019-07-29 23:12:48 +0000 7438) Buffer, &ConversionFn, CallResultType, VK, From->getBeginLoc()); +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7439) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7440) ImplicitConversionSequence ICS = +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7441) TryCopyInitialization(*this, TheTemporaryCall, ToType, +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7442) /*SuppressUserConversions=*/true, +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7443) /*InOverloadResolution=*/false, +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 7444) /*AllowObjCWritebackConversion=*/false); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7445) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7446) switch (ICS.getKind()) { +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7447) case ImplicitConversionSequence::StandardConversion: +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7448) Candidate.FinalConversion = ICS.Standard; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7449) +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7450) // C++ [over.ics.user]p3: +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7451) // If the user-defined conversion is specified by a specialization of a +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7452) // conversion function template, the second standard conversion sequence +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7453) // shall have exact match rank. +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7454) if (Conversion->getPrimaryTemplate() && +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7455) GetConversionRank(ICS.Standard.Second) != ICR_Exact_Match) { +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7456) Candidate.Viable = false; +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7457) Candidate.FailureKind = ovl_fail_final_conversion_not_exact; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7458) return; +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 7459) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7460) +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7461) // C++0x [dcl.init.ref]p5: +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7462) // In the second case, if the reference is an rvalue reference and +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7463) // the second standard conversion sequence of the user-defined +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7464) // conversion sequence includes an lvalue-to-rvalue conversion, the +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7465) // program is ill-formed. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7466) if (ToType->isRValueReferenceType() && +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7467) ICS.Standard.First == ICK_Lvalue_To_Rvalue) { +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7468) Candidate.Viable = false; +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7469) Candidate.FailureKind = ovl_fail_bad_final_conversion; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7470) return; +cba72b1f620fd (Douglas Gregor 2011-01-21 05:18:22 +0000 7471) } +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7472) break; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7473) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7474) case ImplicitConversionSequence::BadConversion: +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7475) Candidate.Viable = false; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 7476) Candidate.FailureKind = ovl_fail_bad_final_conversion; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7477) return; +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7478) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7479) default: +83d382b1cad13 (David Blaikie 2011-09-23 05:06:16 +0000 7480) llvm_unreachable( +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7481) "Can only end up with a standard conversion sequence or failure"); +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7482) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7483) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7484) if (EnableIfAttr *FailedAttr = +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7485) CheckEnableIf(Conversion, CandidateSet.getLocation(), None)) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7486) Candidate.Viable = false; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7487) Candidate.FailureKind = ovl_fail_enable_if; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7488) Candidate.DeductionFailure.Data = FailedAttr; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7489) return; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7490) } +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7491) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 7492) if (Conversion->isMultiVersion() && Conversion->hasAttr() && +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7493) !Conversion->getAttr()->isDefaultVersion()) { +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7494) Candidate.Viable = false; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7495) Candidate.FailureKind = ovl_non_default_multiversion_function; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 7496) } +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7497) } +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 7498) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7499) /// Adds a conversion function template specialization +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7500) /// candidate to the overload set, using template argument deduction +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7501) /// to deduce the template arguments of the conversion function +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7502) /// template from the type that we are converting to (C++ +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7503) /// [temp.deduct.conv]). +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7504) void Sema::AddTemplateConversionCandidate( +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7505) FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7506) CXXRecordDecl *ActingDC, Expr *From, QualType ToType, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7507) OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7508) bool AllowExplicit, bool AllowResultConversion) { +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7509) assert(isa(FunctionTemplate->getTemplatedDecl()) && +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7510) "Only conversion function templates permitted here"); +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7511) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7512) if (!CandidateSet.isNewCandidate(FunctionTemplate)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7513) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7514) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7515) // If the function template has a non-dependent explicit specification, +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7516) // exclude it now if appropriate; we are not permitted to perform deduction +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7517) // and substitution in this case. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7518) if (!AllowExplicit && isNonDependentlyExplicit(FunctionTemplate)) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7519) OverloadCandidate &Candidate = CandidateSet.addCandidate(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7520) Candidate.FoundDecl = FoundDecl; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7521) Candidate.Function = FunctionTemplate->getTemplatedDecl(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7522) Candidate.Viable = false; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7523) Candidate.FailureKind = ovl_fail_explicit; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7524) return; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7525) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 7526) +e6706e40bb692 (Craig Topper 2012-09-19 02:26:47 +0000 7527) TemplateDeductionInfo Info(CandidateSet.getLocation()); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7528) CXXConversionDecl *Specialization = nullptr; +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7529) if (TemplateDeductionResult Result +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7530) = DeduceTemplateArguments(FunctionTemplate, ToType, +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7531) Specialization, Info)) { +fb761ff54452f (Benjamin Kramer 2012-01-14 16:31:55 +0000 7532) OverloadCandidate &Candidate = CandidateSet.addCandidate(); +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7533) Candidate.FoundDecl = FoundDecl; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7534) Candidate.Function = FunctionTemplate->getTemplatedDecl(); +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7535) Candidate.Viable = false; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7536) Candidate.FailureKind = ovl_fail_bad_deduction; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7537) Candidate.IsSurrogate = false; +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7538) Candidate.IgnoreObjectArgument = false; +6edd977c6f368 (Douglas Gregor 2011-01-19 23:54:39 +0000 7539) Candidate.ExplicitCallArguments = 1; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7540) Candidate.DeductionFailure = MakeDeductionFailureInfo(Context, Result, +90cf2c98bbca9 (Douglas Gregor 2010-05-08 20:18:54 +0000 7541) Info); +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7542) return; +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7543) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7544) +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7545) // Add the conversion function template specialization produced by +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7546) // template argument deduction as a candidate. +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7547) assert(Specialization && "Missing function template specialization?"); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7548) AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType, +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 7549) CandidateSet, AllowObjCConversionOnExplicit, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 7550) AllowExplicit, AllowResultConversion); +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7551) } +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 7552) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7553) /// AddSurrogateCandidate - Adds a "surrogate" candidate function that +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7554) /// converts the given @c Object to a function pointer via the +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7555) /// conversion function @c Conversion, and then attempts to call it +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7556) /// with the given arguments (C++ [over.call.object]p2-4). Proto is +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7557) /// the type of function that we'll eventually be calling. +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7558) void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion, +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7559) DeclAccessPair FoundDecl, +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 7560) CXXRecordDecl *ActingContext, +deaad8cc34239 (Douglas Gregor 2009-02-26 23:50:07 +0000 7561) const FunctionProtoType *Proto, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 7562) Expr *Object, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 7563) ArrayRef Args, +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7564) OverloadCandidateSet& CandidateSet) { +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7565) if (!CandidateSet.isNewCandidate(Conversion)) +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7566) return; +5b0f2a2fbe3ac (Douglas Gregor 2009-09-28 04:47:19 +0000 7567) +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7568) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7569) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7570) *this, Sema::ExpressionEvaluationContext::Unevaluated); +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7571) +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 7572) OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size() + 1); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7573) Candidate.FoundDecl = FoundDecl; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7574) Candidate.Function = nullptr; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7575) Candidate.Surrogate = Conversion; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7576) Candidate.Viable = true; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7577) Candidate.IsSurrogate = true; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 7578) Candidate.IgnoreObjectArgument = false; +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 7579) Candidate.ExplicitCallArguments = Args.size(); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7580) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7581) // Determine the implicit conversion sequence for the implicit +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7582) // object parameter. +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7583) ImplicitConversionSequence ObjectInit = TryObjectArgumentInitialization( +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7584) *this, CandidateSet.getLocation(), Object->getType(), +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 7585) Object->Classify(Context), Conversion, ActingContext); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7586) if (ObjectInit.isBad()) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7587) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7588) Candidate.FailureKind = ovl_fail_bad_conversion; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 7589) Candidate.Conversions[0] = ObjectInit; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7590) return; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7591) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7592) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7593) // The first conversion is actually a user-defined conversion whose +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7594) // first conversion is ObjectInit's standard conversion (which is +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7595) // effectively a reference binding). Record it as such. +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7596) Candidate.Conversions[0].setUserDefined(); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7597) Candidate.Conversions[0].UserDefined.Before = ObjectInit.Standard; +5582451e914f4 (Fariborz Jahanian 2009-11-06 00:23:08 +0000 7598) Candidate.Conversions[0].UserDefined.EllipsisConversion = false; +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 7599) Candidate.Conversions[0].UserDefined.HadMultipleCandidates = false; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7600) Candidate.Conversions[0].UserDefined.ConversionFunction = Conversion; +30909031a7f76 (John McCall 2011-09-21 08:36:56 +0000 7601) Candidate.Conversions[0].UserDefined.FoundConversionFunction = FoundDecl; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7602) Candidate.Conversions[0].UserDefined.After +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7603) = Candidate.Conversions[0].UserDefined.Before; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7604) Candidate.Conversions[0].UserDefined.After.setAsIdentityConversion(); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7605) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7606) // Find the +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 7607) unsigned NumParams = Proto->getNumParams(); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7608) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7609) // (C++ 13.3.2p2): A candidate function having fewer than m +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7610) // parameters is viable only if it has an ellipsis in its parameter +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7611) // list (8.3.5). +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 7612) if (Args.size() > NumParams && !Proto->isVariadic()) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7613) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7614) Candidate.FailureKind = ovl_fail_too_many_arguments; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7615) return; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7616) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7617) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7618) // Function types don't have any default arguments, so just check if +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7619) // we have enough arguments. +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 7620) if (Args.size() < NumParams) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7621) // Not enough arguments. +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7622) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7623) Candidate.FailureKind = ovl_fail_too_few_arguments; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7624) return; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7625) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7626) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7627) // Determine the implicit conversion sequences for each of the +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7628) // arguments. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 7629) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 7630) if (ArgIdx < NumParams) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7631) // (C++ 13.3.2p3): for F to be a viable function, there shall +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7632) // exist for each argument an implicit conversion sequence +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7633) // (13.3.3.1) that converts that argument to the corresponding +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7634) // parameter of F. +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 7635) QualType ParamType = Proto->getParamType(ArgIdx); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7636) Candidate.Conversions[ArgIdx + 1] +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 7637) = TryCopyInitialization(*this, Args[ArgIdx], ParamType, +03068aa0777d7 (Anders Carlsson 2009-08-27 17:18:13 +0000 7638) /*SuppressUserConversions=*/false, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7639) /*InOverloadResolution=*/false, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7640) /*AllowObjCWritebackConversion=*/ +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 7641) getLangOpts().ObjCAutoRefCount); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7642) if (Candidate.Conversions[ArgIdx + 1].isBad()) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7643) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7644) Candidate.FailureKind = ovl_fail_bad_conversion; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7645) return; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7646) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7647) } else { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7648) // (C++ 13.3.2p2): For the purposes of overload resolution, any +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7649) // argument for which there is no corresponding parameter is +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7650) // considered to ""match the ellipsis" (C+ 13.3.3.1.3). +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7651) Candidate.Conversions[ArgIdx + 1].setEllipsis(); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7652) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7653) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7654) +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7655) if (EnableIfAttr *FailedAttr = +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 7656) CheckEnableIf(Conversion, CandidateSet.getLocation(), None)) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7657) Candidate.Viable = false; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7658) Candidate.FailureKind = ovl_fail_enable_if; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7659) Candidate.DeductionFailure.Data = FailedAttr; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7660) return; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 7661) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7662) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 7663) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7664) /// Add all of the non-member operator function declarations in the given +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7665) /// function set to the overload candidate set. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7666) void Sema::AddNonMemberOperatorCandidates( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7667) const UnresolvedSetImpl &Fns, ArrayRef Args, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7668) OverloadCandidateSet &CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7669) TemplateArgumentListInfo *ExplicitTemplateArgs) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7670) for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7671) NamedDecl *D = F.getDecl()->getUnderlyingDecl(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7672) ArrayRef FunctionArgs = Args; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7673) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7674) FunctionTemplateDecl *FunTmpl = dyn_cast(D); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7675) FunctionDecl *FD = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7676) FunTmpl ? FunTmpl->getTemplatedDecl() : cast(D); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7677) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7678) // Don't consider rewritten functions if we're not rewriting. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7679) if (!CandidateSet.getRewriteInfo().isAcceptableCandidate(FD)) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7680) continue; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7681) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7682) assert(!isa(FD) && +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7683) "unqualified operator lookup found a member function"); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7684) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7685) if (FunTmpl) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7686) AddTemplateOverloadCandidate(FunTmpl, F.getPair(), ExplicitTemplateArgs, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7687) FunctionArgs, CandidateSet); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7688) if (CandidateSet.getRewriteInfo().shouldAddReversed(Context, FD)) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7689) AddTemplateOverloadCandidate( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7690) FunTmpl, F.getPair(), ExplicitTemplateArgs, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7691) {FunctionArgs[1], FunctionArgs[0]}, CandidateSet, false, false, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7692) true, ADLCallKind::NotADL, OverloadCandidateParamOrder::Reversed); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7693) } else { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7694) if (ExplicitTemplateArgs) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7695) continue; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7696) AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7697) if (CandidateSet.getRewriteInfo().shouldAddReversed(Context, FD)) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7698) AddOverloadCandidate(FD, F.getPair(), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7699) {FunctionArgs[1], FunctionArgs[0]}, CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7700) false, false, true, false, ADLCallKind::NotADL, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7701) None, OverloadCandidateParamOrder::Reversed); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7702) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7703) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7704) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7705) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7706) /// Add overload candidates for overloaded operators that are +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7707) /// member functions. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7708) /// +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7709) /// Add the overloaded operator candidates that are member functions +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7710) /// for the operator Op that was used in an operator expression such +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7711) /// as "x Op y". , Args/NumArgs provides the operator arguments, and +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7712) /// CandidateSet will store the added overload candidates. (C++ +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7713) /// [over.match.oper]). +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7714) void Sema::AddMemberOperatorCandidates(OverloadedOperatorKind Op, +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 7715) SourceLocation OpLoc, +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 7716) ArrayRef Args, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7717) OverloadCandidateSet &CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7718) OverloadCandidateParamOrder PO) { +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7719) DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7720) +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7721) // C++ [over.match.oper]p3: +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7722) // For a unary operator @ with an operand of a type whose +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7723) // cv-unqualified version is T1, and for a binary operator @ with +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7724) // a left operand of a type whose cv-unqualified version is T1 and +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7725) // a right operand of a type whose cv-unqualified version is T2, +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7726) // three sets of candidate functions, designated member +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7727) // candidates, non-member candidates and built-in candidates, are +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7728) // constructed as follows: +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7729) QualType T1 = Args[0]->getType(); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7730) +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7731) // -- If T1 is a complete class type or a class currently being +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7732) // defined, the set of member candidates is the result of the +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7733) // qualified lookup of T1::operator@ (13.3.1.1.1); otherwise, +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7734) // the set of member candidates is empty. +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 7735) if (const RecordType *T1Rec = T1->getAs()) { +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7736) // Complete the type if it can be completed. +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 7737) if (!isCompleteType(OpLoc, T1) && !T1Rec->isBeingDefined()) +82b8d4e6fd79e (Richard Smith 2015-12-18 22:19:11 +0000 7738) return; +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7739) // If the type is neither complete nor being defined, bail out now. +0feaf0c7e3e13 (Richard Smith 2013-04-20 12:41:22 +0000 7740) if (!T1Rec->getDecl()->getDefinition()) +6a1f965853df1 (Douglas Gregor 2009-08-27 23:35:55 +0000 7741) return; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7742) +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 7743) LookupResult Operators(*this, OpName, OpLoc, LookupOrdinaryName); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 7744) LookupQualifiedName(Operators, T1Rec->getDecl()); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 7745) Operators.suppressDiagnostics(); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 7746) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7747) for (LookupResult::iterator Oper = Operators.begin(), +6a1f965853df1 (Douglas Gregor 2009-08-27 23:35:55 +0000 7748) OperEnd = Operators.end(); +6a1f965853df1 (Douglas Gregor 2009-08-27 23:35:55 +0000 7749) Oper != OperEnd; +f0f1cf087e704 (John McCall 2009-11-17 07:50:12 +0000 7750) ++Oper) +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 7751) AddMethodCandidate(Oper.getPair(), Args[0]->getType(), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 7752) Args[0]->Classify(Context), Args.slice(1), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 7753) CandidateSet, /*SuppressUserConversion=*/false, PO); +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7754) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7755) } +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7756) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7757) /// AddBuiltinCandidate - Add a candidate for a built-in +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7758) /// operator. ResultTy and ParamTys are the result and parameter types +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7759) /// of the built-in candidate, respectively. Args and NumArgs are the +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7760) /// arguments being passed to the candidate. IsAssignmentOperator +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7761) /// should be true when this built-in candidate is an assignment +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7762) /// operator. NumContextualBoolArguments is the number of arguments +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7763) /// (at the beginning of the argument list) that will be contextually +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7764) /// converted to bool. +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 7765) void Sema::AddBuiltinCandidate(QualType *ParamTys, ArrayRef Args, +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7766) OverloadCandidateSet& CandidateSet, +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7767) bool IsAssignmentOperator, +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7768) unsigned NumContextualBoolArguments) { +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7769) // Overload resolution is always an unevaluated context. +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7770) EnterExpressionEvaluationContext Unevaluated( +d143a0c2de131 (Faisal Vali 2017-04-01 21:30:49 +0000 7771) *this, Sema::ExpressionEvaluationContext::Unevaluated); +27381f3d93454 (Douglas Gregor 2009-11-23 12:27:39 +0000 7772) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7773) // Add this candidate +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 7774) OverloadCandidate &Candidate = CandidateSet.addCandidate(Args.size()); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7775) Candidate.FoundDecl = DeclAccessPair::make(nullptr, AS_none); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 7776) Candidate.Function = nullptr; +1d248c53ab1c5 (Douglas Gregor 2008-12-12 02:00:36 +0000 7777) Candidate.IsSurrogate = false; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 7778) Candidate.IgnoreObjectArgument = false; +5f6ab9a8bf307 (George Burgess IV 2017-06-08 20:55:21 +0000 7779) std::copy(ParamTys, ParamTys + Args.size(), Candidate.BuiltinParamTypes); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7780) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7781) // Determine the implicit conversion sequences for each of the +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7782) // arguments. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7783) Candidate.Viable = true; +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 7784) Candidate.ExplicitCallArguments = Args.size(); +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 7785) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7786) // C++ [over.match.oper]p4: +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7787) // For the built-in assignment operators, conversions of the +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7788) // left operand are restricted as follows: +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7789) // -- no temporaries are introduced to hold the left operand, and +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7790) // -- no user-defined conversions are applied to the left +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7791) // operand to achieve a type match with the left-most +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7792) // parameter of a built-in candidate. +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7793) // +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7794) // We block these conversions by turning off user-defined +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7795) // conversions, since that is the only way that initialization of +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7796) // a reference to a non-class type can occur from something that +c5e61070f6d1b (Douglas Gregor 2009-01-13 00:52:54 +0000 7797) // is not of the same type. +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7798) if (ArgIdx < NumContextualBoolArguments) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7799) assert(ParamTys[ArgIdx] == Context.BoolTy && +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7800) "Contextual conversion to bool requires bool type"); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 7801) Candidate.Conversions[ArgIdx] +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 7802) = TryContextuallyConvertToBool(*this, Args[ArgIdx]); +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7803) } else { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7804) Candidate.Conversions[ArgIdx] +cb13cfc878200 (Douglas Gregor 2010-04-16 17:51:22 +0000 7805) = TryCopyInitialization(*this, Args[ArgIdx], ParamTys[ArgIdx], +03068aa0777d7 (Anders Carlsson 2009-08-27 17:18:13 +0000 7806) ArgIdx == 0 && IsAssignmentOperator, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7807) /*InOverloadResolution=*/false, +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 7808) /*AllowObjCWritebackConversion=*/ +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 7809) getLangOpts().ObjCAutoRefCount); +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 7810) } +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 7811) if (Candidate.Conversions[ArgIdx].isBad()) { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7812) Candidate.Viable = false; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 7813) Candidate.FailureKind = ovl_fail_bad_conversion; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7814) break; +436424cfa5855 (Douglas Gregor 2008-11-18 23:14:02 +0000 7815) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7816) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7817) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7818) +cd7b03342d936 (Craig Topper 2013-07-01 06:29:40 +0000 7819) namespace { +cd7b03342d936 (Craig Topper 2013-07-01 06:29:40 +0000 7820) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7821) /// BuiltinCandidateTypeSet - A set of types that will be used for the +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7822) /// candidate operator functions for built-in operators (C++ +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7823) /// [over.built]). The types are separated into pointer types and +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7824) /// enumeration types. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7825) class BuiltinCandidateTypeSet { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7826) /// TypeSet - A set of types. +95853077c3f3f (Richard Smith 2016-03-25 00:08:53 +0000 7827) typedef llvm::SetVector, +95853077c3f3f (Richard Smith 2016-03-25 00:08:53 +0000 7828) llvm::SmallPtrSet> TypeSet; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7829) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7830) /// PointerTypes - The set of pointer types that will be used in the +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7831) /// built-in candidates. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7832) TypeSet PointerTypes; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7833) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7834) /// MemberPointerTypes - The set of member pointer types that will be +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7835) /// used in the built-in candidates. +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7836) TypeSet MemberPointerTypes; +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7837) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7838) /// EnumerationTypes - The set of enumeration types that will be +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7839) /// used in the built-in candidates. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7840) TypeSet EnumerationTypes; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7841) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7842) /// The set of vector types that will be used in the built-in +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 7843) /// candidates. +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 7844) TypeSet VectorTypes; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7845) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7846) /// The set of matrix types that will be used in the built-in +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7847) /// candidates. +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7848) TypeSet MatrixTypes; +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7849) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7850) /// A flag indicating non-record types are viable candidates +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7851) bool HasNonRecordTypes; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7852) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7853) /// A flag indicating whether either arithmetic or enumeration types +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7854) /// were present in the candidate set. +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7855) bool HasArithmeticOrEnumeralTypes; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7856) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 7857) /// A flag indicating whether the nullptr type was present in the +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 7858) /// candidate set. +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 7859) bool HasNullPtrType; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7860) +8a2e601917708 (Douglas Gregor 2009-08-24 15:23:48 +0000 7861) /// Sema - The semantic analysis instance where we are building the +8a2e601917708 (Douglas Gregor 2009-08-24 15:23:48 +0000 7862) /// candidate type set. +8a2e601917708 (Douglas Gregor 2009-08-24 15:23:48 +0000 7863) Sema &SemaRef; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7864) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7865) /// Context - The AST context in which we will build the type sets. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7866) ASTContext &Context; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7867) +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 7868) bool AddPointerWithMoreQualifiedTypeVariants(QualType Ty, +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 7869) const Qualifiers &VisibleQuals); +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7870) bool AddMemberPointerWithMoreQualifiedTypeVariants(QualType Ty); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7871) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7872) public: +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7873) /// iterator - Iterates through the types that are part of the set. +a59a3e2d10626 (Chris Lattner 2009-03-29 00:04:01 +0000 7874) typedef TypeSet::iterator iterator; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7875) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 7876) BuiltinCandidateTypeSet(Sema &SemaRef) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7877) : HasNonRecordTypes(false), +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7878) HasArithmeticOrEnumeralTypes(false), +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 7879) HasNullPtrType(false), +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7880) SemaRef(SemaRef), +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7881) Context(SemaRef.Context) { } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7882) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7883) void AddTypesConvertedFrom(QualType Ty, +c02cfe2a55e13 (Douglas Gregor 2009-10-21 23:19:44 +0000 7884) SourceLocation Loc, +c02cfe2a55e13 (Douglas Gregor 2009-10-21 23:19:44 +0000 7885) bool AllowUserConversions, +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 7886) bool AllowExplicitConversions, +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 7887) const Qualifiers &VisibleTypeConversionsQuals); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7888) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7889) llvm::iterator_range pointer_types() { return PointerTypes; } +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7890) llvm::iterator_range member_pointer_types() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7891) return MemberPointerTypes; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7892) } +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7893) llvm::iterator_range enumeration_types() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7894) return EnumerationTypes; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 7895) } +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 7896) llvm::iterator_range vector_types() { return VectorTypes; } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7897) llvm::iterator_range matrix_types() { return MatrixTypes; } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7898) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 7899) bool containsMatrixType(QualType Ty) const { return MatrixTypes.count(Ty); } +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7900) bool hasNonRecordTypes() { return HasNonRecordTypes; } +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 7901) bool hasArithmeticOrEnumeralTypes() { return HasArithmeticOrEnumeralTypes; } +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 7902) bool hasNullPtrType() const { return HasNullPtrType; } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7903) }; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7904) +cd7b03342d936 (Craig Topper 2013-07-01 06:29:40 +0000 7905) } // end anonymous namespace +cd7b03342d936 (Craig Topper 2013-07-01 06:29:40 +0000 7906) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7907) /// AddPointerWithMoreQualifiedTypeVariants - Add the pointer type @p Ty to +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7908) /// the set of pointer types along with any more-qualified variants of +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7909) /// that type. For example, if @p Ty is "int const *", this routine +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7910) /// will add "int const *", "int const volatile *", "int const +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7911) /// restrict *", and "int const volatile restrict *" to the set of +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7912) /// pointer types. Returns true if the add of @p Ty itself succeeded, +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7913) /// false otherwise. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7914) /// +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7915) /// FIXME: what to do about extended qualifiers? +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7916) bool +c02cfe2a55e13 (Douglas Gregor 2009-10-21 23:19:44 +0000 7917) BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty, +c02cfe2a55e13 (Douglas Gregor 2009-10-21 23:19:44 +0000 7918) const Qualifiers &VisibleQuals) { +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7919) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7920) // Insert this type. +95853077c3f3f (Richard Smith 2016-03-25 00:08:53 +0000 7921) if (!PointerTypes.insert(Ty)) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7922) return false; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7923) +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 7924) QualType PointeeTy; +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7925) const PointerType *PointerTy = Ty->getAs(); +f2afc804c32bc (Fariborz Jahanian 2010-08-21 17:11:09 +0000 7926) bool buildObjCPtr = false; +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 7927) if (!PointerTy) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7928) const ObjCObjectPointerType *PTy = Ty->castAs(); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7929) PointeeTy = PTy->getPointeeType(); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7930) buildObjCPtr = true; +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7931) } else { +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 7932) PointeeTy = PointerTy->getPointeeType(); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7933) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7934) +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7935) // Don't add qualified variants of arrays. For one, they're not allowed +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7936) // (the qualifier would sink to the element type), and for another, the +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7937) // only overload situation where it matters is subscript or pointer +- int, +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7938) // and those shouldn't have qualifier variants anyway. +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7939) if (PointeeTy->isArrayType()) +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7940) return true; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7941) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7942) unsigned BaseCVR = PointeeTy.getCVRQualifiers(); +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 7943) bool hasVolatile = VisibleQuals.hasVolatile(); +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 7944) bool hasRestrict = VisibleQuals.hasRestrict(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 7945) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7946) // Iterate through all strict supersets of BaseCVR. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7947) for (unsigned CVR = BaseCVR+1; CVR <= Qualifiers::CVRMask; ++CVR) { +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7948) if ((CVR | BaseCVR) != CVR) continue; +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7949) // Skip over volatile if no volatile found anywhere in the types. +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 7950) if ((CVR & Qualifiers::Volatile) && !hasVolatile) continue; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7951) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7952) // Skip over restrict if no restrict found anywhere in the types, or if +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7953) // the type cannot be restrict-qualified. +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7954) if ((CVR & Qualifiers::Restrict) && +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7955) (!hasRestrict || +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7956) (!(PointeeTy->isAnyPointerType() || PointeeTy->isReferenceType())))) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7957) continue; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7958) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7959) // Build qualified pointee type. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7960) QualType QPointeeTy = Context.getCVRQualifiedType(PointeeTy, CVR); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7961) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7962) // Build qualified pointer type. +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7963) QualType QPointerTy; +f2afc804c32bc (Fariborz Jahanian 2010-08-21 17:11:09 +0000 7964) if (!buildObjCPtr) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7965) QPointerTy = Context.getPointerType(QPointeeTy); +f2afc804c32bc (Fariborz Jahanian 2010-08-21 17:11:09 +0000 7966) else +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7967) QPointerTy = Context.getObjCObjectPointerType(QPointeeTy); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 7968) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7969) // Insert qualified pointer type. +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 7970) PointerTypes.insert(QPointerTy); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7971) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7972) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7973) return true; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7974) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 7975) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7976) /// AddMemberPointerWithMoreQualifiedTypeVariants - Add the pointer type @p Ty +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7977) /// to the set of pointer types along with any more-qualified variants of +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7978) /// that type. For example, if @p Ty is "int const *", this routine +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7979) /// will add "int const *", "int const volatile *", "int const +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7980) /// restrict *", and "int const volatile restrict *" to the set of +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7981) /// pointer types. Returns true if the add of @p Ty itself succeeded, +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7982) /// false otherwise. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7983) /// +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7984) /// FIXME: what to do about extended qualifiers? +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7985) bool +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7986) BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants( +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7987) QualType Ty) { +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7988) // Insert this type. +95853077c3f3f (Richard Smith 2016-03-25 00:08:53 +0000 7989) if (!MemberPointerTypes.insert(Ty)) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7990) return false; +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 7991) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7992) const MemberPointerType *PointerTy = Ty->getAs(); +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7993) assert(PointerTy && "type was not a member pointer type!"); +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7994) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 7995) QualType PointeeTy = PointerTy->getPointeeType(); +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7996) // Don't add qualified variants of arrays. For one, they're not allowed +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7997) // (the qualifier would sink to the element type), and for another, the +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7998) // only overload situation where it matters is subscript or pointer +- int, +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 7999) // and those shouldn't have qualifier variants anyway. +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 8000) if (PointeeTy->isArrayType()) +4990a6347a3a8 (Sebastian Redl 2009-11-18 20:39:26 +0000 8001) return true; +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8002) const Type *ClassTy = PointerTy->getClass(); +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8003) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8004) // Iterate through all strict supersets of the pointee type's CVR +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8005) // qualifiers. +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8006) unsigned BaseCVR = PointeeTy.getCVRQualifiers(); +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8007) for (unsigned CVR = BaseCVR+1; CVR <= Qualifiers::CVRMask; ++CVR) { +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8008) if ((CVR | BaseCVR) != CVR) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8009) +8ccfcb51ee020 (John McCall 2009-09-24 19:53:00 +0000 8010) QualType QPointeeTy = Context.getCVRQualifiedType(PointeeTy, CVR); +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 8011) MemberPointerTypes.insert( +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 8012) Context.getMemberPointerType(QPointeeTy, ClassTy)); +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8013) } +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8014) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8015) return true; +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8016) } +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8017) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8018) /// AddTypesConvertedFrom - Add each of the types to which the type @p +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8019) /// Ty can be implicit converted to the given set of @p Types. We're +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8020) /// primarily interested in pointer types and enumeration types. We also +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8021) /// take member pointer types, for the conditional operator. +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8022) /// AllowUserConversions is true if we should look at the conversion +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8023) /// functions of a class type, and AllowExplicitConversions if we +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8024) /// should also include the explicit conversion functions of a class +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8025) /// type. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8026) void +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8027) BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty, +c02cfe2a55e13 (Douglas Gregor 2009-10-21 23:19:44 +0000 8028) SourceLocation Loc, +5fb53972380f5 (Douglas Gregor 2009-01-14 15:45:31 +0000 8029) bool AllowUserConversions, +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8030) bool AllowExplicitConversions, +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8031) const Qualifiers &VisibleQuals) { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8032) // Only deal with canonical types. +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8033) Ty = Context.getCanonicalType(Ty); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8034) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8035) // Look through reference types; they aren't part of the type of an +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8036) // expression for the purposes of conversions. +c23c7e6a51927 (Ted Kremenek 2009-07-29 21:53:49 +0000 8037) if (const ReferenceType *RefTy = Ty->getAs()) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8038) Ty = RefTy->getPointeeType(); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8039) +33ddac05bba47 (John McCall 2011-01-19 10:06:00 +0000 8040) // If we're dealing with an array type, decay to the pointer. +33ddac05bba47 (John McCall 2011-01-19 10:06:00 +0000 8041) if (Ty->isArrayType()) +33ddac05bba47 (John McCall 2011-01-19 10:06:00 +0000 8042) Ty = SemaRef.Context.getArrayDecayedType(Ty); +33ddac05bba47 (John McCall 2011-01-19 10:06:00 +0000 8043) +33ddac05bba47 (John McCall 2011-01-19 10:06:00 +0000 8044) // Otherwise, we don't care about qualifiers on the type. +1b8fe5b716b8b (Douglas Gregor 2009-11-16 21:35:15 +0000 8045) Ty = Ty.getLocalUnqualifiedType(); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8046) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8047) // Flag if we ever add a non-record type. +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8048) const RecordType *TyRec = Ty->getAs(); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8049) HasNonRecordTypes = HasNonRecordTypes || !TyRec; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8050) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8051) // Flag if we encounter an arithmetic type. +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8052) HasArithmeticOrEnumeralTypes = +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8053) HasArithmeticOrEnumeralTypes || Ty->isArithmeticType(); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8054) +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 8055) if (Ty->isObjCIdType() || Ty->isObjCClassType()) +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 8056) PointerTypes.insert(Ty); +e4151b590ef4b (Fariborz Jahanian 2010-08-21 00:10:36 +0000 8057) else if (Ty->getAs() || Ty->getAs()) { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8058) // Insert our type, and its more-qualified variants, into the set +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8059) // of types. +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 8060) if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals)) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8061) return; +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8062) } else if (Ty->isMemberPointerType()) { +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8063) // Member pointers are far easier, since the pointee can't be converted. +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8064) if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty)) +8ce189f9cefc4 (Sebastian Redl 2009-04-19 21:53:20 +0000 8065) return; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8066) } else if (Ty->isEnumeralType()) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8067) HasArithmeticOrEnumeralTypes = true; +a59a3e2d10626 (Chris Lattner 2009-03-29 00:04:01 +0000 8068) EnumerationTypes.insert(Ty); +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8069) } else if (Ty->isVectorType()) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8070) // We treat vector types as arithmetic types in many contexts as an +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8071) // extension. +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8072) HasArithmeticOrEnumeralTypes = true; +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8073) VectorTypes.insert(Ty); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8074) } else if (Ty->isMatrixType()) { +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8075) // Similar to vector types, we treat vector types as arithmetic types in +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8076) // many contexts as an extension. +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8077) HasArithmeticOrEnumeralTypes = true; +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8078) MatrixTypes.insert(Ty); +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 8079) } else if (Ty->isNullPtrType()) { +80af31397acee (Douglas Gregor 2011-05-21 23:15:46 +0000 8080) HasNullPtrType = true; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8081) } else if (AllowUserConversions && TyRec) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8082) // No conversion functions in incomplete types. +db0ac5572fcf7 (Richard Smith 2015-12-18 22:40:25 +0000 8083) if (!SemaRef.isCompleteType(Loc, Ty)) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8084) return; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8085) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8086) CXXRecordDecl *ClassDecl = cast(TyRec->getDecl()); +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 8087) for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8088) if (isa(D)) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8089) D = cast(D)->getTargetDecl(); +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 8090) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8091) // Skip conversion function templates; they don't tell us anything +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8092) // about which builtin types we can convert to. +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8093) if (isa(D)) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8094) continue; +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 8095) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8096) CXXConversionDecl *Conv = cast(D); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8097) if (AllowExplicitConversions || !Conv->isExplicit()) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8098) AddTypesConvertedFrom(Conv->getConversionType(), Loc, false, false, +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8099) VisibleQuals); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8100) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8101) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8102) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8103) } +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8104) /// Helper function for adjusting address spaces for the pointer or reference +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8105) /// operands of builtin operators depending on the argument. +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8106) static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8107) Expr *Arg) { +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8108) return S.Context.getAddrSpaceQualType(T, Arg->getType().getAddressSpace()); +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8109) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8110) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 8111) /// Helper function for AddBuiltinOperatorCandidates() that adds +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8112) /// the volatile- and non-volatile-qualified assignment operators for the +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8113) /// given type to the candidate set. +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8114) static void AddBuiltinAssignmentOperatorCandidates(Sema &S, +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8115) QualType T, +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8116) ArrayRef Args, +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8117) OverloadCandidateSet &CandidateSet) { +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8118) QualType ParamTypes[2]; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8119) +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8120) // T& operator=(T&, T) +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8121) ParamTypes[0] = S.Context.getLValueReferenceType( +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8122) AdjustAddressSpaceForBuiltinOperandType(S, T, Args[0])); +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8123) ParamTypes[1] = T; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8124) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8125) /*IsAssignmentOperator=*/true); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8126) +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8127) if (!S.Context.getCanonicalType(T).isVolatileQualified()) { +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8128) // volatile T& operator=(volatile T&, T) +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8129) ParamTypes[0] = S.Context.getLValueReferenceType( +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8130) AdjustAddressSpaceForBuiltinOperandType(S, S.Context.getVolatileType(T), +27e5c212ee42b (Anastasia Stulova 2019-03-07 16:43:41 +0000 8131) Args[0])); +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8132) ParamTypes[1] = T; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8133) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8134) /*IsAssignmentOperator=*/true); +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8135) } +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8136) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8137) +1054faed320dd (Sebastian Redl 2009-10-25 17:03:50 +0000 8138) /// CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, +1054faed320dd (Sebastian Redl 2009-10-25 17:03:50 +0000 8139) /// if any, found in visible type conversion functions found in ArgExpr's type. +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8140) static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr* ArgExpr) { +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8141) Qualifiers VRQuals; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8142) const RecordType *TyRec; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8143) if (const MemberPointerType *RHSMPType = +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8144) ArgExpr->getType()->getAs()) +d0ace024965bb (Douglas Gregor 2010-04-25 00:55:24 +0000 8145) TyRec = RHSMPType->getClass()->getAs(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8146) else +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8147) TyRec = ArgExpr->getType()->getAs(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8148) if (!TyRec) { +b06ec054fc550 (Fariborz Jahanian 2009-10-16 22:08:05 +0000 8149) // Just to be safe, assume the worst case. +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8150) VRQuals.addVolatile(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8151) VRQuals.addRestrict(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8152) return VRQuals; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8153) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8154) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8155) CXXRecordDecl *ClassDecl = cast(TyRec->getDecl()); +67da35c832e66 (John McCall 2010-02-04 22:26:26 +0000 8156) if (!ClassDecl->hasDefinition()) +67da35c832e66 (John McCall 2010-02-04 22:26:26 +0000 8157) return VRQuals; +67da35c832e66 (John McCall 2010-02-04 22:26:26 +0000 8158) +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 8159) for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) { +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 8160) if (isa(D)) +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 8161) D = cast(D)->getTargetDecl(); +da4458e98f54c (John McCall 2010-03-31 01:36:47 +0000 8162) if (CXXConversionDecl *Conv = dyn_cast(D)) { +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8163) QualType CanTy = Context.getCanonicalType(Conv->getConversionType()); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8164) if (const ReferenceType *ResTypeRef = CanTy->getAs()) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8165) CanTy = ResTypeRef->getPointeeType(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8166) // Need to go down the pointer/mempointer chain and add qualifiers +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8167) // as see them. +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8168) bool done = false; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8169) while (!done) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8170) if (CanTy.isRestrictQualified()) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8171) VRQuals.addRestrict(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8172) if (const PointerType *ResTypePtr = CanTy->getAs()) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8173) CanTy = ResTypePtr->getPointeeType(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8174) else if (const MemberPointerType *ResTypeMPtr = +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8175) CanTy->getAs()) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8176) CanTy = ResTypeMPtr->getPointeeType(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8177) else +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8178) done = true; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8179) if (CanTy.isVolatileQualified()) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8180) VRQuals.addVolatile(); +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8181) if (VRQuals.hasRestrict() && VRQuals.hasVolatile()) +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8182) return VRQuals; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8183) } +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8184) } +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8185) } +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8186) return VRQuals; +3b937fa298ce6 (Fariborz Jahanian 2009-10-15 17:14:05 +0000 8187) } +528729872ed9c (John McCall 2010-11-13 05:51:15 +0000 8188) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8189) namespace { +528729872ed9c (John McCall 2010-11-13 05:51:15 +0000 8190) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 8191) /// Helper class to manage the addition of builtin operator overload +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8192) /// candidates. It provides shared state and utility methods used throughout +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8193) /// the process, as well as a helper method to add each group of builtin +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8194) /// operator overloads from the standard to a candidate set. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8195) class BuiltinOperatorOverloadBuilder { +c6586e52a9640 (Chandler Carruth 2010-12-12 10:35:00 +0000 8196) // Common instance state available to all overload candidate addition methods. +c6586e52a9640 (Chandler Carruth 2010-12-12 10:35:00 +0000 8197) Sema &S; +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8198) ArrayRef Args; +c6586e52a9640 (Chandler Carruth 2010-12-12 10:35:00 +0000 8199) Qualifiers VisibleTypeConversionsQuals; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8200) bool HasArithmeticOrEnumeralCandidateType; +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 8201) SmallVectorImpl &CandidateTypes; +c6586e52a9640 (Chandler Carruth 2010-12-12 10:35:00 +0000 8202) OverloadCandidateSet &CandidateSet; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8203) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8204) static constexpr int ArithmeticTypesCap = 24; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8205) SmallVector ArithmeticTypes; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8206) +f64918d092c07 (Nico Weber 2019-08-21 15:49:21 +0000 8207) // Define some indices used to iterate over the arithmetic types in +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8208) // ArithmeticTypes. The "promoted arithmetic types" are the arithmetic +528729872ed9c (John McCall 2010-11-13 05:51:15 +0000 8209) // types are that preserved by promotion (C++ [over.built]p2). +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8210) unsigned FirstIntegralType, +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8211) LastIntegralType; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8212) unsigned FirstPromotedIntegralType, +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8213) LastPromotedIntegralType; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8214) unsigned FirstPromotedArithmeticType, +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8215) LastPromotedArithmeticType; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8216) unsigned NumArithmeticTypes; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8217) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8218) void InitArithmeticTypes() { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8219) // Start of promoted types. +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8220) FirstPromotedArithmeticType = 0; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8221) ArithmeticTypes.push_back(S.Context.FloatTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8222) ArithmeticTypes.push_back(S.Context.DoubleTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8223) ArithmeticTypes.push_back(S.Context.LongDoubleTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8224) if (S.Context.getTargetInfo().hasFloat128Type()) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8225) ArithmeticTypes.push_back(S.Context.Float128Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8226) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8227) // Start of integral types. +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8228) FirstIntegralType = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8229) FirstPromotedIntegralType = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8230) ArithmeticTypes.push_back(S.Context.IntTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8231) ArithmeticTypes.push_back(S.Context.LongTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8232) ArithmeticTypes.push_back(S.Context.LongLongTy); +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8233) if (S.Context.getTargetInfo().hasInt128Type() || +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8234) (S.Context.getAuxTargetInfo() && +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8235) S.Context.getAuxTargetInfo()->hasInt128Type())) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8236) ArithmeticTypes.push_back(S.Context.Int128Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8237) ArithmeticTypes.push_back(S.Context.UnsignedIntTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8238) ArithmeticTypes.push_back(S.Context.UnsignedLongTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8239) ArithmeticTypes.push_back(S.Context.UnsignedLongLongTy); +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8240) if (S.Context.getTargetInfo().hasInt128Type() || +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8241) (S.Context.getAuxTargetInfo() && +f8d5b49c786f5 (Jennifer Yu 2020-12-04 14:54:12 -0800 8242) S.Context.getAuxTargetInfo()->hasInt128Type())) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8243) ArithmeticTypes.push_back(S.Context.UnsignedInt128Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8244) LastPromotedIntegralType = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8245) LastPromotedArithmeticType = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8246) // End of promoted types. +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8247) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8248) ArithmeticTypes.push_back(S.Context.BoolTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8249) ArithmeticTypes.push_back(S.Context.CharTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8250) ArithmeticTypes.push_back(S.Context.WCharTy); +3a8244df6fb88 (Richard Smith 2018-05-01 05:02:45 +0000 8251) if (S.Context.getLangOpts().Char8) +3a8244df6fb88 (Richard Smith 2018-05-01 05:02:45 +0000 8252) ArithmeticTypes.push_back(S.Context.Char8Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8253) ArithmeticTypes.push_back(S.Context.Char16Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8254) ArithmeticTypes.push_back(S.Context.Char32Ty); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8255) ArithmeticTypes.push_back(S.Context.SignedCharTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8256) ArithmeticTypes.push_back(S.Context.ShortTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8257) ArithmeticTypes.push_back(S.Context.UnsignedCharTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8258) ArithmeticTypes.push_back(S.Context.UnsignedShortTy); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8259) LastIntegralType = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8260) NumArithmeticTypes = ArithmeticTypes.size(); +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8261) // End of integral types. +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8262) // FIXME: What about complex? What about half? +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8263) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8264) assert(ArithmeticTypes.size() <= ArithmeticTypesCap && +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8265) "Enough inline storage for all arithmetic types."); +c6586e52a9640 (Chandler Carruth 2010-12-12 10:35:00 +0000 8266) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8267) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 8268) /// Helper method to factor out the common pattern of adding overloads +5659c0c480d4b (Chandler Carruth 2010-12-12 09:22:45 +0000 8269) /// for '++' and '--' builtin operators. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8270) void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy, +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8271) bool HasVolatile, +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8272) bool HasRestrict) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8273) QualType ParamTypes[2] = { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8274) S.Context.getLValueReferenceType(CandidateTy), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8275) S.Context.IntTy +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8276) }; +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8277) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8278) // Non-volatile version. +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8279) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8280) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8281) // Use a heuristic to reduce number of builtin candidates in the set: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8282) // add volatile version only if there are conversions to a volatile type. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8283) if (HasVolatile) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8284) ParamTypes[0] = +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8285) S.Context.getLValueReferenceType( +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8286) S.Context.getVolatileType(CandidateTy)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8287) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8288) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8289) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8290) // Add restrict version only if there are conversions to a restrict type +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8291) // and our candidate type is a non-restrict-qualified pointer. +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8292) if (HasRestrict && CandidateTy->isAnyPointerType() && +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8293) !CandidateTy.isRestrictQualified()) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8294) ParamTypes[0] +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8295) = S.Context.getLValueReferenceType( +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8296) S.Context.getCVRQualifiedType(CandidateTy, Qualifiers::Restrict)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8297) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8298) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8299) if (HasVolatile) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8300) ParamTypes[0] +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8301) = S.Context.getLValueReferenceType( +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8302) S.Context.getCVRQualifiedType(CandidateTy, +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8303) (Qualifiers::Volatile | +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8304) Qualifiers::Restrict))); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8305) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8306) } +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8307) } +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8308) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8309) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8310) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8311) /// Helper to add an overload candidate for a binary builtin with types \p L +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8312) /// and \p R. +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8313) void AddCandidate(QualType L, QualType R) { +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8314) QualType LandR[2] = {L, R}; +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8315) S.AddBuiltinCandidate(LandR, Args, CandidateSet); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8316) } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8317) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8318) public: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8319) BuiltinOperatorOverloadBuilder( +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8320) Sema &S, ArrayRef Args, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8321) Qualifiers VisibleTypeConversionsQuals, +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8322) bool HasArithmeticOrEnumeralCandidateType, +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 8323) SmallVectorImpl &CandidateTypes, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8324) OverloadCandidateSet &CandidateSet) +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8325) : S(S), Args(Args), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8326) VisibleTypeConversionsQuals(VisibleTypeConversionsQuals), +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8327) HasArithmeticOrEnumeralCandidateType( +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8328) HasArithmeticOrEnumeralCandidateType), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8329) CandidateTypes(CandidateTypes), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8330) CandidateSet(CandidateSet) { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8331) +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8332) InitArithmeticTypes(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8333) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8334) +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8335) // Increment is deprecated for bool since C++17. +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8336) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8337) // C++ [over.built]p3: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8338) // +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8339) // For every pair (T, VQ), where T is an arithmetic type other +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8340) // than bool, and VQ is either volatile or empty, there exist +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8341) // candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8342) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8343) // VQ T& operator++(VQ T&); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8344) // T operator++(VQ T&, int); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8345) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8346) // C++ [over.built]p4: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8347) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8348) // For every pair (T, VQ), where T is an arithmetic type other +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8349) // than bool, and VQ is either volatile or empty, there exist +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8350) // candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8351) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8352) // VQ T& operator--(VQ T&); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8353) // T operator--(VQ T&, int); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8354) void addPlusPlusMinusMinusArithmeticOverloads(OverloadedOperatorKind Op) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8355) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8356) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8357) +d74ebe22db891 (Jan Korous 2018-04-11 13:36:29 +0000 8358) for (unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) { +d74ebe22db891 (Jan Korous 2018-04-11 13:36:29 +0000 8359) const auto TypeOfT = ArithmeticTypes[Arith]; +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8360) if (TypeOfT == S.Context.BoolTy) { +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8361) if (Op == OO_MinusMinus) +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8362) continue; +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8363) if (Op == OO_PlusPlus && S.getLangOpts().CPlusPlus17) +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8364) continue; +536d2e30721e2 (Jan Korous 2018-04-18 13:38:39 +0000 8365) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8366) addPlusPlusMinusMinusStyleOverloads( +d74ebe22db891 (Jan Korous 2018-04-11 13:36:29 +0000 8367) TypeOfT, +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8368) VisibleTypeConversionsQuals.hasVolatile(), +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8369) VisibleTypeConversionsQuals.hasRestrict()); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8370) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8371) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8372) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8373) // C++ [over.built]p5: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8374) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8375) // For every pair (T, VQ), where T is a cv-qualified or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8376) // cv-unqualified object type, and VQ is either volatile or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8377) // empty, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8378) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8379) // T*VQ& operator++(T*VQ&); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8380) // T*VQ& operator--(T*VQ&); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8381) // T* operator++(T*VQ&, int); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8382) // T* operator--(T*VQ&, int); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8383) void addPlusPlusMinusMinusPointerOverloads() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8384) for (QualType PtrTy : CandidateTypes[0].pointer_types()) { +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8385) // Skip pointer types that aren't pointers to object types. +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8386) if (!PtrTy->getPointeeType()->isObjectType()) +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8387) continue; +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8388) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8389) addPlusPlusMinusMinusStyleOverloads( +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8390) PtrTy, +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8391) (!PtrTy.isVolatileQualified() && +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8392) VisibleTypeConversionsQuals.hasVolatile()), +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8393) (!PtrTy.isRestrictQualified() && +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8394) VisibleTypeConversionsQuals.hasRestrict())); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8395) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8396) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8397) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8398) // C++ [over.built]p6: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8399) // For every cv-qualified or cv-unqualified object type T, there +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8400) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8401) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8402) // T& operator*(T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8403) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8404) // C++ [over.built]p7: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8405) // For every function type T that does not have cv-qualifiers or a +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 8406) // ref-qualifier, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8407) // T& operator*(T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8408) void addUnaryStarPointerOverloads() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8409) for (QualType ParamTy : CandidateTypes[0].pointer_types()) { +421ad5e1e67bb (Argyrios Kyrtzidis 2010-08-23 07:12:16 +0000 8410) QualType PointeeTy = ParamTy->getPointeeType(); +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8411) if (!PointeeTy->isObjectType() && !PointeeTy->isFunctionType()) +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8412) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8413) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 8414) if (const FunctionProtoType *Proto =PointeeTy->getAs()) +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 8415) if (Proto->getMethodQuals() || Proto->getRefQualifier()) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 8416) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 8417) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8418) S.AddBuiltinCandidate(&ParamTy, Args, CandidateSet); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8419) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8420) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8421) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8422) // C++ [over.built]p9: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8423) // For every promoted arithmetic type T, there exist candidate +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8424) // operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8425) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8426) // T operator+(T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8427) // T operator-(T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8428) void addUnaryPlusOrMinusArithmeticOverloads() { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8429) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8430) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8431) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8432) for (unsigned Arith = FirstPromotedArithmeticType; +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8433) Arith < LastPromotedArithmeticType; ++Arith) { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8434) QualType ArithTy = ArithmeticTypes[Arith]; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8435) S.AddBuiltinCandidate(&ArithTy, Args, CandidateSet); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8436) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8437) +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8438) // Extension: We also add these operators for vector types. +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8439) for (QualType VecTy : CandidateTypes[0].vector_types()) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8440) S.AddBuiltinCandidate(&VecTy, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8441) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8442) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8443) // C++ [over.built]p8: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8444) // For every type T, there exist candidate operator functions of +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8445) // the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8446) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8447) // T* operator+(T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8448) void addUnaryPlusPointerOverloads() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8449) for (QualType ParamTy : CandidateTypes[0].pointer_types()) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8450) S.AddBuiltinCandidate(&ParamTy, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8451) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8452) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8453) // C++ [over.built]p10: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8454) // For every promoted integral type T, there exist candidate +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8455) // operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8456) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8457) // T operator~(T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8458) void addUnaryTildePromotedIntegralOverloads() { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8459) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8460) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8461) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8462) for (unsigned Int = FirstPromotedIntegralType; +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8463) Int < LastPromotedIntegralType; ++Int) { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8464) QualType IntTy = ArithmeticTypes[Int]; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8465) S.AddBuiltinCandidate(&IntTy, Args, CandidateSet); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8466) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8467) +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8468) // Extension: We also add this operator for vector types. +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8469) for (QualType VecTy : CandidateTypes[0].vector_types()) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8470) S.AddBuiltinCandidate(&VecTy, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8471) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8472) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8473) // C++ [over.match.oper]p16: +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8474) // For every pointer to member type T or type std::nullptr_t, there +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8475) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8476) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8477) // bool operator==(T,T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8478) // bool operator!=(T,T); +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8479) void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8480) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8481) llvm::SmallPtrSet AddedTypes; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8482) +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8483) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8484) for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8485) // Don't add the same builtin candidate twice. +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8486) if (!AddedTypes.insert(S.Context.getCanonicalType(MemPtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8487) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8488) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8489) QualType ParamTypes[2] = {MemPtrTy, MemPtrTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8490) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8491) } +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8492) +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8493) if (CandidateTypes[ArgIdx].hasNullPtrType()) { +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8494) CanQualType NullPtrTy = S.Context.getCanonicalType(S.Context.NullPtrTy); +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8495) if (AddedTypes.insert(NullPtrTy).second) { +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8496) QualType ParamTypes[2] = { NullPtrTy, NullPtrTy }; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8497) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8498) } +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8499) } +84605aeac90e0 (Douglas Gregor 2009-08-24 13:43:27 +0000 8500) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8501) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8502) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8503) // C++ [over.built]p15: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8504) // +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8505) // For every T, where T is an enumeration type or a pointer type, +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 8506) // there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8507) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8508) // bool operator<(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8509) // bool operator>(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8510) // bool operator<=(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8511) // bool operator>=(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8512) // bool operator==(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8513) // bool operator!=(T, T); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8514) // R operator<=>(T, T) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8515) void addGenericBinaryPointerOrEnumeralOverloads() { +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8516) // C++ [over.match.oper]p3: +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8517) // [...]the built-in candidates include all of the candidate operator +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8518) // functions defined in 13.6 that, compared to the given operator, [...] +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8519) // do not have the same parameter-type-list as any non-template non-member +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8520) // candidate. +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8521) // +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8522) // Note that in practice, this only affects enumeration types because there +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8523) // aren't any built-in candidates of record type, and a user-defined operator +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8524) // must have an operand of record or enumeration type. Also, the only other +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8525) // overloaded operator with enumeration arguments, operator=, +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8526) // cannot be overloaded for enumeration types, so this is the only place +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8527) // where we must suppress candidates like this. +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8528) llvm::DenseSet > +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8529) UserDefinedBinaryOperators; +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8530) +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8531) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8532) if (!CandidateTypes[ArgIdx].enumeration_types().empty()) { +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8533) for (OverloadCandidateSet::iterator C = CandidateSet.begin(), +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8534) CEnd = CandidateSet.end(); +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8535) C != CEnd; ++C) { +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8536) if (!C->Viable || !C->Function || C->Function->getNumParams() != 2) +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8537) continue; +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8538) +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8539) if (C->Function->isFunctionTemplateSpecialization()) +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8540) continue; +14f082b69d730 (Eli Friedman 2012-09-18 21:52:24 +0000 8541) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8542) // We interpret "same parameter-type-list" as applying to the +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8543) // "synthesized candidate, with the order of the two parameters +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8544) // reversed", not to the original function. +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 8545) bool Reversed = C->isReversed(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8546) QualType FirstParamType = C->Function->getParamDecl(Reversed ? 1 : 0) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8547) ->getType() +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8548) .getUnqualifiedType(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8549) QualType SecondParamType = C->Function->getParamDecl(Reversed ? 0 : 1) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8550) ->getType() +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 8551) .getUnqualifiedType(); +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8552) +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8553) // Skip if either parameter isn't of enumeral type. +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8554) if (!FirstParamType->isEnumeralType() || +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8555) !SecondParamType->isEnumeralType()) +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8556) continue; +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8557) +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8558) // Add this operator to the set of known user-defined operators. +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8559) UserDefinedBinaryOperators.insert( +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8560) std::make_pair(S.Context.getCanonicalType(FirstParamType), +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8561) S.Context.getCanonicalType(SecondParamType))); +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8562) } +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8563) } +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8564) } +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8565) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8566) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8567) llvm::SmallPtrSet AddedTypes; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8568) +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 8569) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8570) for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8571) // Don't add the same builtin candidate twice. +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8572) if (!AddedTypes.insert(S.Context.getCanonicalType(PtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8573) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8574) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8575) QualType ParamTypes[2] = {PtrTy, PtrTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8576) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8577) } +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8578) for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8579) CanQualType CanonType = S.Context.getCanonicalType(EnumTy); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8580) +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8581) // Don't add the same builtin candidate twice, or if a user defined +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8582) // candidate exists. +82e95a3c79d67 (David Blaikie 2014-11-19 07:49:47 +0000 8583) if (!AddedTypes.insert(CanonType).second || +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8584) UserDefinedBinaryOperators.count(std::make_pair(CanonType, +c02db8cfb3dad (Chandler Carruth 2010-12-12 09:14:11 +0000 8585) CanonType))) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8586) continue; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8587) QualType ParamTypes[2] = {EnumTy, EnumTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8588) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8589) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8590) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8591) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8592) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8593) // C++ [over.built]p13: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8594) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8595) // For every cv-qualified or cv-unqualified object type T +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8596) // there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8597) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8598) // T* operator+(T*, ptrdiff_t); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8599) // T& operator[](T*, ptrdiff_t); [BELOW] +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8600) // T* operator-(T*, ptrdiff_t); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8601) // T* operator+(ptrdiff_t, T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8602) // T& operator[](ptrdiff_t, T*); [BELOW] +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8603) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8604) // C++ [over.built]p14: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8605) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8606) // For every T, where T is a pointer to object type, there +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8607) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8608) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8609) // ptrdiff_t operator-(T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8610) void addBinaryPlusOrMinusPointerOverloads(OverloadedOperatorKind Op) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8611) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8612) llvm::SmallPtrSet AddedTypes; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8613) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8614) for (int Arg = 0; Arg < 2; ++Arg) { +9207a52bc525f (Eric Christopher 2015-08-21 16:24:01 +0000 8615) QualType AsymmetricParamTypes[2] = { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8616) S.Context.getPointerDiffType(), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8617) S.Context.getPointerDiffType(), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8618) }; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8619) for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8620) QualType PointeeTy = PtrTy->getPointeeType(); +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8621) if (!PointeeTy->isObjectType()) +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8622) continue; +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8623) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8624) AsymmetricParamTypes[Arg] = PtrTy; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8625) if (Arg == 0 || Op == OO_Plus) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8626) // operator+(T*, ptrdiff_t) or operator-(T*, ptrdiff_t) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8627) // T* operator+(ptrdiff_t, T*); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8628) S.AddBuiltinCandidate(AsymmetricParamTypes, Args, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8629) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8630) if (Op == OO_Minus) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8631) // ptrdiff_t operator-(T, T); +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8632) if (!AddedTypes.insert(S.Context.getCanonicalType(PtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8633) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8634) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8635) QualType ParamTypes[2] = {PtrTy, PtrTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8636) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8637) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8638) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8639) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8640) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8641) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8642) // C++ [over.built]p12: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8643) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8644) // For every pair of promoted arithmetic types L and R, there +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8645) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8646) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8647) // LR operator*(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8648) // LR operator/(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8649) // LR operator+(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8650) // LR operator-(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8651) // bool operator<(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8652) // bool operator>(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8653) // bool operator<=(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8654) // bool operator>=(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8655) // bool operator==(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8656) // bool operator!=(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8657) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8658) // where LR is the result of the usual arithmetic conversions +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8659) // between types L and R. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8660) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8661) // C++ [over.built]p24: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8662) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8663) // For every pair of promoted arithmetic types L and R, there exist +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8664) // candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8665) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8666) // LR operator?(bool, L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8667) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8668) // where LR is the result of the usual arithmetic conversions +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8669) // between types L and R. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8670) // Our candidates ignore the first parameter. +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8671) void addGenericBinaryArithmeticOverloads() { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8672) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8673) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8674) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8675) for (unsigned Left = FirstPromotedArithmeticType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8676) Left < LastPromotedArithmeticType; ++Left) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8677) for (unsigned Right = FirstPromotedArithmeticType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8678) Right < LastPromotedArithmeticType; ++Right) { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8679) QualType LandR[2] = { ArithmeticTypes[Left], +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8680) ArithmeticTypes[Right] }; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8681) S.AddBuiltinCandidate(LandR, Args, CandidateSet); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8682) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8683) } +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8684) +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8685) // Extension: Add the binary operators ==, !=, <, <=, >=, >, *, /, and the +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8686) // conditional operator for vector types. +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8687) for (QualType Vec1Ty : CandidateTypes[0].vector_types()) +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8688) for (QualType Vec2Ty : CandidateTypes[1].vector_types()) { +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8689) QualType LandR[2] = {Vec1Ty, Vec2Ty}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8690) S.AddBuiltinCandidate(LandR, Args, CandidateSet); +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8691) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8692) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8693) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8694) /// Add binary operator overloads for each candidate matrix type M1, M2: +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8695) /// * (M1, M1) -> M1 +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8696) /// * (M1, M1.getElementType()) -> M1 +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8697) /// * (M2.getElementType(), M2) -> M2 +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8698) /// * (M2, M2) -> M2 // Only if M2 is not part of CandidateTypes[0]. +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8699) void addMatrixBinaryArithmeticOverloads() { +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8700) if (!HasArithmeticOrEnumeralCandidateType) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8701) return; +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8702) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8703) for (QualType M1 : CandidateTypes[0].matrix_types()) { +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8704) AddCandidate(M1, cast(M1)->getElementType()); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8705) AddCandidate(M1, M1); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8706) } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8707) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8708) for (QualType M2 : CandidateTypes[1].matrix_types()) { +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8709) AddCandidate(cast(M2)->getElementType(), M2); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8710) if (!CandidateTypes[0].containsMatrixType(M2)) +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8711) AddCandidate(M2, M2); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8712) } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8713) } +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 8714) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8715) // C++2a [over.built]p14: +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8716) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8717) // For every integral type T there exists a candidate operator function +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8718) // of the form +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8719) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8720) // std::strong_ordering operator<=>(T, T) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8721) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8722) // C++2a [over.built]p15: +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8723) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8724) // For every pair of floating-point types L and R, there exists a candidate +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8725) // operator function of the form +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8726) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8727) // std::partial_ordering operator<=>(L, R); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8728) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8729) // FIXME: The current specification for integral types doesn't play nice with +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8730) // the direction of p0946r0, which allows mixed integral and unscoped-enum +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8731) // comparisons. Under the current spec this can lead to ambiguity during +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8732) // overload resolution. For example: +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8733) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8734) // enum A : int {a}; +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8735) // auto x = (a <=> (long)42); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8736) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8737) // error: call is ambiguous for arguments 'A' and 'long'. +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8738) // note: candidate operator<=>(int, int) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8739) // note: candidate operator<=>(long, long) +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8740) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8741) // To avoid this error, this function deviates from the specification and adds +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8742) // the mixed overloads `operator<=>(L, R)` where L and R are promoted +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8743) // arithmetic types (the same as the generic relational overloads). +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8744) // +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8745) // For now this function acts as a placeholder. +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8746) void addThreeWayArithmeticOverloads() { +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8747) addGenericBinaryArithmeticOverloads(); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8748) } +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 8749) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8750) // C++ [over.built]p17: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8751) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8752) // For every pair of promoted integral types L and R, there +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8753) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8754) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8755) // LR operator%(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8756) // LR operator&(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8757) // LR operator^(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8758) // LR operator|(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8759) // L operator<<(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8760) // L operator>>(L, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8761) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8762) // where LR is the result of the usual arithmetic conversions +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8763) // between types L and R. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8764) void addBinaryBitwiseArithmeticOverloads(OverloadedOperatorKind Op) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8765) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8766) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8767) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8768) for (unsigned Left = FirstPromotedIntegralType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8769) Left < LastPromotedIntegralType; ++Left) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8770) for (unsigned Right = FirstPromotedIntegralType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8771) Right < LastPromotedIntegralType; ++Right) { +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8772) QualType LandR[2] = { ArithmeticTypes[Left], +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8773) ArithmeticTypes[Right] }; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8774) S.AddBuiltinCandidate(LandR, Args, CandidateSet); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8775) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8776) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8777) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8778) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8779) // C++ [over.built]p20: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8780) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8781) // For every pair (T, VQ), where T is an enumeration or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8782) // pointer to member type and VQ is either volatile or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8783) // empty, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8784) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8785) // VQ T& operator=(VQ T&, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8786) void addAssignmentMemberPointerOrEnumeralOverloads() { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8787) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8788) llvm::SmallPtrSet AddedTypes; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8789) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8790) for (unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8791) for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8792) if (!AddedTypes.insert(S.Context.getCanonicalType(EnumTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8793) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8794) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8795) AddBuiltinAssignmentOperatorCandidates(S, EnumTy, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8796) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8797) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8798) for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8799) if (!AddedTypes.insert(S.Context.getCanonicalType(MemPtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8800) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8801) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8802) AddBuiltinAssignmentOperatorCandidates(S, MemPtrTy, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8803) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8804) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8805) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8806) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8807) // C++ [over.built]p19: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8808) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8809) // For every pair (T, VQ), where T is any type and VQ is either +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8810) // volatile or empty, there exist candidate operator functions +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8811) // of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8812) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8813) // T*VQ& operator=(T*VQ&, T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8814) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8815) // C++ [over.built]p21: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8816) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8817) // For every pair (T, VQ), where T is a cv-qualified or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8818) // cv-unqualified object type and VQ is either volatile or +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8819) // empty, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8820) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8821) // T*VQ& operator+=(T*VQ&, ptrdiff_t); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8822) // T*VQ& operator-=(T*VQ&, ptrdiff_t); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8823) void addAssignmentPointerOverloads(bool isEqualOp) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8824) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8825) llvm::SmallPtrSet AddedTypes; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8826) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8827) for (QualType PtrTy : CandidateTypes[0].pointer_types()) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8828) // If this is operator=, keep track of the builtin candidates we added. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8829) if (isEqualOp) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8830) AddedTypes.insert(S.Context.getCanonicalType(PtrTy)); +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8831) else if (!PtrTy->getPointeeType()->isObjectType()) +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 8832) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8833) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8834) // non-volatile version +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8835) QualType ParamTypes[2] = { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8836) S.Context.getLValueReferenceType(PtrTy), +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8837) isEqualOp ? PtrTy : S.Context.getPointerDiffType(), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8838) }; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8839) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8840) /*IsAssignmentOperator=*/ isEqualOp); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8841) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8842) bool NeedVolatile = !PtrTy.isVolatileQualified() && +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8843) VisibleTypeConversionsQuals.hasVolatile(); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8844) if (NeedVolatile) { +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8845) // volatile version +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8846) ParamTypes[0] = +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8847) S.Context.getLValueReferenceType(S.Context.getVolatileType(PtrTy)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8848) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8849) /*IsAssignmentOperator=*/isEqualOp); +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 8850) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8851) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8852) if (!PtrTy.isRestrictQualified() && +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8853) VisibleTypeConversionsQuals.hasRestrict()) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8854) // restrict version +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8855) ParamTypes[0] = +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8856) S.Context.getLValueReferenceType(S.Context.getRestrictType(PtrTy)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8857) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8858) /*IsAssignmentOperator=*/isEqualOp); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8859) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8860) if (NeedVolatile) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8861) // volatile restrict version +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8862) ParamTypes[0] = +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8863) S.Context.getLValueReferenceType(S.Context.getCVRQualifiedType( +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8864) PtrTy, (Qualifiers::Volatile | Qualifiers::Restrict))); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8865) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8866) /*IsAssignmentOperator=*/isEqualOp); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8867) } +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8868) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8869) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8870) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8871) if (isEqualOp) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8872) for (QualType PtrTy : CandidateTypes[1].pointer_types()) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8873) // Make sure we don't add the same candidate twice. +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8874) if (!AddedTypes.insert(S.Context.getCanonicalType(PtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8875) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8876) +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 8877) QualType ParamTypes[2] = { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8878) S.Context.getLValueReferenceType(PtrTy), +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8879) PtrTy, +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 8880) }; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8881) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8882) // non-volatile version +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8883) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8884) /*IsAssignmentOperator=*/true); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8885) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8886) bool NeedVolatile = !PtrTy.isVolatileQualified() && +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8887) VisibleTypeConversionsQuals.hasVolatile(); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8888) if (NeedVolatile) { +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8889) // volatile version +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8890) ParamTypes[0] = S.Context.getLValueReferenceType( +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8891) S.Context.getVolatileType(PtrTy)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8892) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8893) /*IsAssignmentOperator=*/true); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8894) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8895) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8896) if (!PtrTy.isRestrictQualified() && +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8897) VisibleTypeConversionsQuals.hasRestrict()) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8898) // restrict version +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8899) ParamTypes[0] = S.Context.getLValueReferenceType( +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8900) S.Context.getRestrictType(PtrTy)); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8901) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8902) /*IsAssignmentOperator=*/true); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 8903) +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8904) if (NeedVolatile) { +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8905) // volatile restrict version +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8906) ParamTypes[0] = +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8907) S.Context.getLValueReferenceType(S.Context.getCVRQualifiedType( +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 8908) PtrTy, (Qualifiers::Volatile | Qualifiers::Restrict))); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8909) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8910) /*IsAssignmentOperator=*/true); +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8911) } +5bee25884b9b7 (Douglas Gregor 2012-06-04 00:15:09 +0000 8912) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8913) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 8914) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8915) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8916) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8917) // C++ [over.built]p18: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8918) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8919) // For every triple (L, VQ, R), where L is an arithmetic type, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8920) // VQ is either volatile or empty, and R is a promoted +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8921) // arithmetic type, there exist candidate operator functions of +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8922) // the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8923) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8924) // VQ L& operator=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8925) // VQ L& operator*=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8926) // VQ L& operator/=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8927) // VQ L& operator+=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8928) // VQ L& operator-=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8929) void addAssignmentArithmeticOverloads(bool isEqualOp) { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8930) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8931) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8932) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8933) for (unsigned Left = 0; Left < NumArithmeticTypes; ++Left) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8934) for (unsigned Right = FirstPromotedArithmeticType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8935) Right < LastPromotedArithmeticType; ++Right) { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8936) QualType ParamTypes[2]; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8937) ParamTypes[1] = ArithmeticTypes[Right]; +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8938) auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8939) S, ArithmeticTypes[Left], Args[0]); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8940) // Add this built-in operator as a candidate (VQ is empty). +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8941) ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8942) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8943) /*IsAssignmentOperator=*/isEqualOp); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8944) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8945) // Add this built-in operator as a candidate (VQ is 'volatile'). +b9e8c42ee6aea (Fariborz Jahanian 2009-10-19 21:30:45 +0000 8946) if (VisibleTypeConversionsQuals.hasVolatile()) { +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8947) ParamTypes[0] = S.Context.getVolatileType(LeftBaseTy); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8948) ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8949) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8950) /*IsAssignmentOperator=*/isEqualOp); +b9e8c42ee6aea (Fariborz Jahanian 2009-10-19 21:30:45 +0000 8951) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8952) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8953) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8954) +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8955) // Extension: Add the binary operators =, +=, -=, *=, /= for vector types. +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8956) for (QualType Vec1Ty : CandidateTypes[0].vector_types()) +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8957) for (QualType Vec2Ty : CandidateTypes[0].vector_types()) { +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8958) QualType ParamTypes[2]; +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8959) ParamTypes[1] = Vec2Ty; +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8960) // Add this built-in operator as a candidate (VQ is empty). +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8961) ParamTypes[0] = S.Context.getLValueReferenceType(Vec1Ty); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8962) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8963) /*IsAssignmentOperator=*/isEqualOp); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8964) +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8965) // Add this built-in operator as a candidate (VQ is 'volatile'). +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8966) if (VisibleTypeConversionsQuals.hasVolatile()) { +714e84be4615d (Florian Hahn 2020-06-04 20:15:21 +0100 8967) ParamTypes[0] = S.Context.getVolatileType(Vec1Ty); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8968) ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 8969) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 8970) /*IsAssignmentOperator=*/isEqualOp); +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8971) } +cbfbca14d0a2b (Douglas Gregor 2010-05-19 03:21:00 +0000 8972) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8973) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8974) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8975) // C++ [over.built]p22: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8976) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8977) // For every triple (L, VQ, R), where L is an integral type, VQ +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8978) // is either volatile or empty, and R is a promoted integral +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8979) // type, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8980) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8981) // VQ L& operator%=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8982) // VQ L& operator<<=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8983) // VQ L& operator>>=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8984) // VQ L& operator&=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8985) // VQ L& operator^=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8986) // VQ L& operator|=(VQ L&, R); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 8987) void addAssignmentIntegralOverloads() { +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8988) if (!HasArithmeticOrEnumeralCandidateType) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8989) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 8990) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8991) for (unsigned Left = FirstIntegralType; Left < LastIntegralType; ++Left) { +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 8992) for (unsigned Right = FirstPromotedIntegralType; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8993) Right < LastPromotedIntegralType; ++Right) { +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8994) QualType ParamTypes[2]; +8237141be1d45 (Hans Wennborg 2017-11-15 17:11:53 +0000 8995) ParamTypes[1] = ArithmeticTypes[Right]; +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8996) auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8997) S, ArithmeticTypes[Left], Args[0]); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 8998) // Add this built-in operator as a candidate (VQ is empty). +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 8999) ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9000) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +a4a9334a5013a (Fariborz Jahanian 2009-10-20 00:04:40 +0000 9001) if (VisibleTypeConversionsQuals.hasVolatile()) { +a4a9334a5013a (Fariborz Jahanian 2009-10-20 00:04:40 +0000 9002) // Add this built-in operator as a candidate (VQ is 'volatile'). +4ce581e5a9f90 (Anastasia Stulova 2019-03-19 16:50:21 +0000 9003) ParamTypes[0] = LeftBaseTy; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9004) ParamTypes[0] = S.Context.getVolatileType(ParamTypes[0]); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9005) ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9006) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +a4a9334a5013a (Fariborz Jahanian 2009-10-20 00:04:40 +0000 9007) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9008) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9009) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 9010) } +d08452f60a273 (Douglas Gregor 2008-11-19 15:42:04 +0000 9011) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9012) // C++ [over.operator]p23: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9013) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9014) // There also exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9015) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9016) // bool operator!(bool); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9017) // bool operator&&(bool, bool); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9018) // bool operator||(bool, bool); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9019) void addExclaimOverload() { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9020) QualType ParamTy = S.Context.BoolTy; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9021) S.AddBuiltinCandidate(&ParamTy, Args, CandidateSet, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9022) /*IsAssignmentOperator=*/false, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9023) /*NumContextualBoolArguments=*/1); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9024) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9025) void addAmpAmpOrPipePipeOverload() { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9026) QualType ParamTypes[2] = { S.Context.BoolTy, S.Context.BoolTy }; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9027) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9028) /*IsAssignmentOperator=*/false, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9029) /*NumContextualBoolArguments=*/2); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9030) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9031) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9032) // C++ [over.built]p13: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9033) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9034) // For every cv-qualified or cv-unqualified object type T there +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9035) // exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9036) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9037) // T* operator+(T*, ptrdiff_t); [ABOVE] +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9038) // T& operator[](T*, ptrdiff_t); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9039) // T* operator-(T*, ptrdiff_t); [ABOVE] +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9040) // T* operator+(ptrdiff_t, T*); [ABOVE] +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9041) // T& operator[](ptrdiff_t, T*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9042) void addSubscriptOverloads() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9043) for (QualType PtrTy : CandidateTypes[0].pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9044) QualType ParamTypes[2] = {PtrTy, S.Context.getPointerDiffType()}; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9045) QualType PointeeType = PtrTy->getPointeeType(); +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 9046) if (!PointeeType->isObjectType()) +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 9047) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 9048) +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9049) // T& operator[](T*, ptrdiff_t) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9050) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9051) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9052) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9053) for (QualType PtrTy : CandidateTypes[1].pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9054) QualType ParamTypes[2] = {S.Context.getPointerDiffType(), PtrTy}; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9055) QualType PointeeType = PtrTy->getPointeeType(); +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 9056) if (!PointeeType->isObjectType()) +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 9057) continue; +66990031e2951 (Douglas Gregor 2011-01-05 00:13:17 +0000 9058) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9059) // T& operator[](ptrdiff_t, T*) +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9060) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9061) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9062) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9063) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9064) // C++ [over.built]p11: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9065) // For every quintuple (C1, C2, T, CV1, CV2), where C2 is a class type, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9066) // C1 is the same type as C2 or is a derived class of C2, T is an object +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9067) // type or a function type, and CV1 and CV2 are cv-qualifier-seqs, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9068) // there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9069) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9070) // CV12 T& operator->*(CV1 C1*, CV2 T C2::*); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9071) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9072) // where CV12 is the union of CV1 and CV2. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9073) void addArrowStarOverloads() { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9074) for (QualType PtrTy : CandidateTypes[0].pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9075) QualType C1Ty = PtrTy; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9076) QualType C1; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9077) QualifierCollector Q1; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9078) C1 = QualType(Q1.strip(C1Ty->getPointeeType()), 0); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9079) if (!isa(C1)) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9080) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9081) // heuristic to reduce number of builtin candidates in the set. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9082) // Add volatile/restrict version only if there are conversions to a +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9083) // volatile/restrict type. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9084) if (!VisibleTypeConversionsQuals.hasVolatile() && Q1.hasVolatile()) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9085) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9086) if (!VisibleTypeConversionsQuals.hasRestrict() && Q1.hasRestrict()) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9087) continue; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9088) for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9089) const MemberPointerType *mptr = cast(MemPtrTy); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9090) QualType C2 = QualType(mptr->getClass(), 0); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9091) C2 = C2.getUnqualifiedType(); +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 9092) if (C1 != C2 && !S.IsDerivedFrom(CandidateSet.getLocation(), C1, C2)) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9093) break; +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9094) QualType ParamTypes[2] = {PtrTy, MemPtrTy}; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9095) // build CV12 T& +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9096) QualType T = mptr->getPointeeType(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9097) if (!VisibleTypeConversionsQuals.hasVolatile() && +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9098) T.isVolatileQualified()) +421ad5e1e67bb (Argyrios Kyrtzidis 2010-08-23 07:12:16 +0000 9099) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9100) if (!VisibleTypeConversionsQuals.hasRestrict() && +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9101) T.isRestrictQualified()) +421ad5e1e67bb (Argyrios Kyrtzidis 2010-08-23 07:12:16 +0000 9102) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9103) T = Q1.apply(S.Context, T); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9104) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +34d93dcddde71 (Fariborz Jahanian 2009-10-06 23:08:05 +0000 9105) } +34d93dcddde71 (Fariborz Jahanian 2009-10-06 23:08:05 +0000 9106) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9107) } +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 9108) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9109) // Note that we don't consider the first argument, since it has been +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9110) // contextually converted to bool long ago. The candidates below are +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9111) // therefore added as binary. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9112) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9113) // C++ [over.built]p25: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9114) // For every type T, where T is a pointer, pointer-to-member, or scoped +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9115) // enumeration type, there exist candidate operator functions of the form +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9116) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9117) // T operator?(bool, T, T); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9118) // +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9119) void addConditionalOperatorOverloads() { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9120) /// Set of (canonical) types that we've already handled. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9121) llvm::SmallPtrSet AddedTypes; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9122) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9123) for (unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9124) for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9125) if (!AddedTypes.insert(S.Context.getCanonicalType(PtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9126) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9127) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9128) QualType ParamTypes[2] = {PtrTy, PtrTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9129) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9130) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9131) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9132) for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9133) if (!AddedTypes.insert(S.Context.getCanonicalType(MemPtrTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9134) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9135) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9136) QualType ParamTypes[2] = {MemPtrTy, MemPtrTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9137) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9138) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9139) +2bf7fdb723fc5 (Richard Smith 2013-01-02 11:42:31 +0000 9140) if (S.getLangOpts().CPlusPlus11) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9141) for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) { +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9142) if (!EnumTy->castAs()->getDecl()->isScoped()) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9143) continue; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9144) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9145) if (!AddedTypes.insert(S.Context.getCanonicalType(EnumTy)).second) +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9146) continue; +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9147) +fd14a2753368b (Richard Sandiford 2020-12-07 18:34:53 +0000 9148) QualType ParamTypes[2] = {EnumTy, EnumTy}; +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9149) S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9150) } +b37c9af75dae4 (Douglas Gregor 2010-11-03 17:00:07 +0000 9151) } +8a8e0313bfb01 (Douglas Gregor 2010-10-15 00:50:56 +0000 9152) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9153) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9154) }; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9155) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9156) } // end anonymous namespace +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9157) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9158) /// AddBuiltinOperatorCandidates - Add the appropriate built-in +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9159) /// operator overloads to the candidate set (C++ [over.built]), based +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9160) /// on the operator @p Op and the arguments given. For example, if the +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9161) /// operator is a binary '+', this routine might add "int +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9162) /// operator+(int, int)" to cover integer addition. +16e94b91ef4d5 (Robert Wilhelm 2013-08-09 18:02:13 +0000 9163) void Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, +16e94b91ef4d5 (Robert Wilhelm 2013-08-09 18:02:13 +0000 9164) SourceLocation OpLoc, +16e94b91ef4d5 (Robert Wilhelm 2013-08-09 18:02:13 +0000 9165) ArrayRef Args, +16e94b91ef4d5 (Robert Wilhelm 2013-08-09 18:02:13 +0000 9166) OverloadCandidateSet &CandidateSet) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9167) // Find all of the types that the arguments can convert to, but only +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9168) // if the operator we're looking at has built-in operator candidates +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9169) // that make use of these types. Also record whether we encounter non-record +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9170) // candidate types or either arithmetic or enumeral candidate types. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9171) Qualifiers VisibleTypeConversionsQuals; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9172) VisibleTypeConversionsQuals.addConst(); +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9173) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9174) VisibleTypeConversionsQuals += CollectVRQualifiers(Context, Args[ArgIdx]); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9175) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9176) bool HasNonRecordCandidateType = false; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9177) bool HasArithmeticOrEnumeralCandidateType = false; +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 9178) SmallVector CandidateTypes; +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9179) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +57dddd4840bac (Benjamin Kramer 2015-02-17 21:55:18 +0000 9180) CandidateTypes.emplace_back(*this); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9181) CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->getType(), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9182) OpLoc, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9183) true, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9184) (Op == OO_Exclaim || +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9185) Op == OO_AmpAmp || +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9186) Op == OO_PipePipe), +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9187) VisibleTypeConversionsQuals); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9188) HasNonRecordCandidateType = HasNonRecordCandidateType || +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9189) CandidateTypes[ArgIdx].hasNonRecordTypes(); +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9190) HasArithmeticOrEnumeralCandidateType = +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9191) HasArithmeticOrEnumeralCandidateType || +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9192) CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9193) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9194) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9195) // Exit early when no non-record types have been added to the candidate set +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9196) // for any of the arguments to the operator. +877d4ebba49cc (Douglas Gregor 2011-10-10 14:05:31 +0000 9197) // +877d4ebba49cc (Douglas Gregor 2011-10-10 14:05:31 +0000 9198) // We can't exit early for !, ||, or &&, since there we have always have +877d4ebba49cc (Douglas Gregor 2011-10-10 14:05:31 +0000 9199) // 'bool' overloads. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9200) if (!HasNonRecordCandidateType && +877d4ebba49cc (Douglas Gregor 2011-10-10 14:05:31 +0000 9201) !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe)) +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9202) return; +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9203) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9204) // Setup an object to manage the common state for building overloads. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9205) BuiltinOperatorOverloadBuilder OpBuilder(*this, Args, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9206) VisibleTypeConversionsQuals, +00a383363859a (Chandler Carruth 2010-12-13 01:44:01 +0000 9207) HasArithmeticOrEnumeralCandidateType, +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9208) CandidateTypes, CandidateSet); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9209) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9210) // Dispatch over the operation to add in only those overloads which apply. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9211) switch (Op) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9212) case OO_None: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9213) case NUM_OVERLOADED_OPERATORS: +83d382b1cad13 (David Blaikie 2011-09-23 05:06:16 +0000 9214) llvm_unreachable("Expected an overloaded operator"); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9215) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9216) case OO_New: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9217) case OO_Delete: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9218) case OO_Array_New: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9219) case OO_Array_Delete: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9220) case OO_Call: +83d382b1cad13 (David Blaikie 2011-09-23 05:06:16 +0000 9221) llvm_unreachable( +83d382b1cad13 (David Blaikie 2011-09-23 05:06:16 +0000 9222) "Special operators don't use AddBuiltinOperatorCandidates"); +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9223) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9224) case OO_Comma: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9225) case OO_Arrow: +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 9226) case OO_Coawait: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9227) // C++ [over.match.oper]p3: +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 9228) // -- For the operator ',', the unary operator '&', the +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 9229) // operator '->', or the operator 'co_await', the +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 9230) // built-in candidates set is empty. +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9231) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9232) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9233) case OO_Plus: // '+' is either unary or binary +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9234) if (Args.size() == 1) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9235) OpBuilder.addUnaryPlusPointerOverloads(); +f3b3ccda590c1 (Adrian Prantl 2017-12-19 22:06:11 +0000 9236) LLVM_FALLTHROUGH; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9237) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9238) case OO_Minus: // '-' is either unary or binary +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9239) if (Args.size() == 1) { +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9240) OpBuilder.addUnaryPlusOrMinusArithmeticOverloads(); +f9802446a58e5 (Chandler Carruth 2010-12-12 08:39:38 +0000 9241) } else { +f9802446a58e5 (Chandler Carruth 2010-12-12 08:39:38 +0000 9242) OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9243) OpBuilder.addGenericBinaryArithmeticOverloads(); +6f6e91d193373 (Florian Hahn 2020-05-29 20:42:22 +0100 9244) OpBuilder.addMatrixBinaryArithmeticOverloads(); +f9802446a58e5 (Chandler Carruth 2010-12-12 08:39:38 +0000 9245) } +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9246) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9247) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9248) case OO_Star: // '*' is either unary or binary +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9249) if (Args.size() == 1) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9250) OpBuilder.addUnaryStarPointerOverloads(); +4affc444b499b (Florian Hahn 2020-06-07 11:11:27 +0100 9251) else { +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9252) OpBuilder.addGenericBinaryArithmeticOverloads(); +4affc444b499b (Florian Hahn 2020-06-07 11:11:27 +0100 9253) OpBuilder.addMatrixBinaryArithmeticOverloads(); +4affc444b499b (Florian Hahn 2020-06-07 11:11:27 +0100 9254) } +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9255) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9256) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9257) case OO_Slash: +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9258) OpBuilder.addGenericBinaryArithmeticOverloads(); +9de23cdb45e56 (Chandler Carruth 2010-12-12 08:45:02 +0000 9259) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9260) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9261) case OO_PlusPlus: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9262) case OO_MinusMinus: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9263) OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9264) OpBuilder.addPlusPlusMinusMinusPointerOverloads(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9265) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9266) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9267) case OO_EqualEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9268) case OO_ExclaimEqual: +5e9746f520e6b (Richard Smith 2016-10-21 22:00:42 +0000 9269) OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads(); +f3b3ccda590c1 (Adrian Prantl 2017-12-19 22:06:11 +0000 9270) LLVM_FALLTHROUGH; +9de23cdb45e56 (Chandler Carruth 2010-12-12 08:45:02 +0000 9271) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9272) case OO_Less: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9273) case OO_Greater: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9274) case OO_LessEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9275) case OO_GreaterEqual: +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 9276) OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9277) OpBuilder.addGenericBinaryArithmeticOverloads(); +0375e954468f1 (Chandler Carruth 2010-12-12 08:32:28 +0000 9278) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9279) +d30b23d6a54b3 (Richard Smith 2017-12-01 02:13:10 +0000 9280) case OO_Spaceship: +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 9281) OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 9282) OpBuilder.addThreeWayArithmeticOverloads(); +0683c0e68d31d (Eric Fiselier 2018-05-07 21:07:10 +0000 9283) break; +d30b23d6a54b3 (Richard Smith 2017-12-01 02:13:10 +0000 9284) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9285) case OO_Percent: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9286) case OO_Caret: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9287) case OO_Pipe: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9288) case OO_LessLess: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9289) case OO_GreaterGreater: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9290) OpBuilder.addBinaryBitwiseArithmeticOverloads(Op); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9291) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9292) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9293) case OO_Amp: // '&' is either unary or binary +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 9294) if (Args.size() == 1) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9295) // C++ [over.match.oper]p3: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9296) // -- For the operator ',', the unary operator '&', or the +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9297) // operator '->', the built-in candidates set is empty. +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9298) break; +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9299) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9300) OpBuilder.addBinaryBitwiseArithmeticOverloads(Op); +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9301) break; +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9302) +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9303) case OO_Tilde: +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9304) OpBuilder.addUnaryTildePromotedIntegralOverloads(); +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9305) break; +5184de0aff61b (Chandler Carruth 2010-12-12 08:51:33 +0000 9306) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9307) case OO_Equal: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9308) OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads(); +f3b3ccda590c1 (Adrian Prantl 2017-12-19 22:06:11 +0000 9309) LLVM_FALLTHROUGH; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9310) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9311) case OO_PlusEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9312) case OO_MinusEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9313) OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal); +f3b3ccda590c1 (Adrian Prantl 2017-12-19 22:06:11 +0000 9314) LLVM_FALLTHROUGH; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9315) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9316) case OO_StarEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9317) case OO_SlashEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9318) OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9319) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9320) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9321) case OO_PercentEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9322) case OO_LessLessEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9323) case OO_GreaterGreaterEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9324) case OO_AmpEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9325) case OO_CaretEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9326) case OO_PipeEqual: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9327) OpBuilder.addAssignmentIntegralOverloads(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9328) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9329) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9330) case OO_Exclaim: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9331) OpBuilder.addExclaimOverload(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9332) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9333) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9334) case OO_AmpAmp: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9335) case OO_PipePipe: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9336) OpBuilder.addAmpAmpOrPipePipeOverload(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9337) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9338) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9339) case OO_Subscript: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9340) OpBuilder.addSubscriptOverloads(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9341) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9342) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9343) case OO_ArrowStar: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9344) OpBuilder.addArrowStarOverloads(); +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9345) break; +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9346) +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9347) case OO_Conditional: +85c2d09a5a43a (Chandler Carruth 2010-12-12 08:11:30 +0000 9348) OpBuilder.addConditionalOperatorOverloads(); +c07c389a94bb4 (George Burgess IV 2017-06-08 18:19:25 +0000 9349) OpBuilder.addGenericBinaryArithmeticOverloads(); +f9802446a58e5 (Chandler Carruth 2010-12-12 08:39:38 +0000 9350) break; +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9351) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9352) } +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 9353) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 9354) /// Add function candidates found via argument-dependent lookup +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9355) /// to the set of overloading candidates. +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9356) /// +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9357) /// This routine performs argument-dependent name lookup based on the +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9358) /// given function name (which may also be an operator name) and adds +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9359) /// all of the overload candidates found by ADL to the overload +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9360) /// candidate set (C++ [basic.lookup.argdep]). +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 9361) void +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9362) Sema::AddArgumentDependentLookupCandidates(DeclarationName Name, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 9363) SourceLocation Loc, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 9364) ArrayRef Args, +739b107af8003 (Douglas Gregor 2011-03-03 02:41:12 +0000 9365) TemplateArgumentListInfo *ExplicitTemplateArgs, +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 9366) OverloadCandidateSet& CandidateSet, +b6626748c2e50 (Richard Smith 2012-10-18 17:56:02 +0000 9367) bool PartialOverloading) { +8fe6808de0d1b (John McCall 2010-01-26 07:16:45 +0000 9368) ADLResult Fns; +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9369) +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9370) // FIXME: This approach for uniquing ADL results (and removing +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9371) // redundant candidates from the set) relies on pointer-equality, +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9372) // which means we need to key off the canonical decl. However, +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9373) // always going back to the canonical decl might not get us the +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9374) // right set of default arguments. What default arguments are +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9375) // we supposed to consider on ADL candidates, anyway? +91f61fc921e4a (John McCall 2010-01-26 06:04:06 +0000 9376) +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 9377) // FIXME: Pass in the explicit template arguments? +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 9378) ArgumentDependentLookup(Name, Loc, Args, Fns); +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9379) +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9380) // Erase all of the candidates we already knew about. +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9381) for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9382) CandEnd = CandidateSet.end(); +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9383) Cand != CandEnd; ++Cand) +15448f8d238c5 (Douglas Gregor 2009-06-27 21:05:07 +0000 9384) if (Cand->Function) { +8fe6808de0d1b (John McCall 2010-01-26 07:16:45 +0000 9385) Fns.erase(Cand->Function); +15448f8d238c5 (Douglas Gregor 2009-06-27 21:05:07 +0000 9386) if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate()) +8fe6808de0d1b (John McCall 2010-01-26 07:16:45 +0000 9387) Fns.erase(FunTmpl); +15448f8d238c5 (Douglas Gregor 2009-06-27 21:05:07 +0000 9388) } +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9389) +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9390) // For each of the ADL candidates we found, add it to the overload +d2b7ef6ecea96 (Douglas Gregor 2009-03-13 00:33:25 +0000 9391) // set. +8fe6808de0d1b (John McCall 2010-01-26 07:16:45 +0000 9392) for (ADLResult::iterator I = Fns.begin(), E = Fns.end(); I != E; ++I) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 9393) DeclAccessPair FoundDecl = DeclAccessPair::make(*I, AS_none); +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 9394) +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 9395) if (FunctionDecl *FD = dyn_cast(*I)) { +6b51f28e82646 (John McCall 2009-11-23 01:53:49 +0000 9396) if (ExplicitTemplateArgs) +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 9397) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 9398) +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9399) AddOverloadCandidate( +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9400) FD, FoundDecl, Args, CandidateSet, /*SuppressUserConversions=*/false, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9401) PartialOverloading, /*AllowExplicit=*/true, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9402) /*AllowExplicitConversions=*/false, ADLCallKind::UsesADL); +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9403) if (CandidateSet.getRewriteInfo().shouldAddReversed(Context, FD)) { +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9404) AddOverloadCandidate( +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9405) FD, FoundDecl, {Args[1], Args[0]}, CandidateSet, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9406) /*SuppressUserConversions=*/false, PartialOverloading, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9407) /*AllowExplicit=*/true, /*AllowExplicitConversions=*/false, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9408) ADLCallKind::UsesADL, None, OverloadCandidateParamOrder::Reversed); +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9409) } +743ae6045d413 (Eric Fiselier 2018-12-11 16:53:25 +0000 9410) } else { +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9411) auto *FTD = cast(*I); +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 9412) AddTemplateOverloadCandidate( +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9413) FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 9414) /*SuppressUserConversions=*/false, PartialOverloading, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9415) /*AllowExplicit=*/true, ADLCallKind::UsesADL); +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9416) if (CandidateSet.getRewriteInfo().shouldAddReversed( +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9417) Context, FTD->getTemplatedDecl())) { +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9418) AddTemplateOverloadCandidate( +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9419) FTD, FoundDecl, ExplicitTemplateArgs, {Args[1], Args[0]}, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9420) CandidateSet, /*SuppressUserConversions=*/false, PartialOverloading, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9421) /*AllowExplicit=*/true, ADLCallKind::UsesADL, +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9422) OverloadCandidateParamOrder::Reversed); +1db66e705f4db (Richard Smith 2020-01-30 18:40:53 -0800 9423) } +743ae6045d413 (Eric Fiselier 2018-12-11 16:53:25 +0000 9424) } +15448f8d238c5 (Douglas Gregor 2009-06-27 21:05:07 +0000 9425) } +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9426) } +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 9427) +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9428) namespace { +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9429) enum class Comparison { Equal, Better, Worse }; +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9430) } +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9431) +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9432) /// Compares the enable_if attributes of two FunctionDecls, for the purposes of +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9433) /// overload resolution. +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9434) /// +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9435) /// Cand1's set of enable_if attributes are said to be "better" than Cand2's iff +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9436) /// Cand1's first N enable_if attributes have precisely the same conditions as +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9437) /// Cand2's first N enable_if attributes (where N = the number of enable_if +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9438) /// attributes on Cand2), and Cand1 has more than N enable_if attributes. +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9439) /// +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9440) /// Note that you can have a pair of candidates such that Cand1's enable_if +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9441) /// attributes are worse than Cand2's, and Cand2's enable_if attributes are +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9442) /// worse than Cand1's. +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9443) static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9444) const FunctionDecl *Cand2) { +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9445) // Common case: One (or both) decls don't have enable_if attrs. +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9446) bool Cand1Attr = Cand1->hasAttr(); +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9447) bool Cand2Attr = Cand2->hasAttr(); +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9448) if (!Cand1Attr || !Cand2Attr) { +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9449) if (Cand1Attr == Cand2Attr) +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9450) return Comparison::Equal; +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9451) return Cand1Attr ? Comparison::Better : Comparison::Worse; +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9452) } +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9453) +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 9454) auto Cand1Attrs = Cand1->specific_attrs(); +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 9455) auto Cand2Attrs = Cand2->specific_attrs(); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9456) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9457) llvm::FoldingSetNodeID Cand1ID, Cand2ID; +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9458) for (auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) { +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9459) Optional Cand1A = std::get<0>(Pair); +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9460) Optional Cand2A = std::get<1>(Pair); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9461) +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 9462) // It's impossible for Cand1 to be better than (or equal to) Cand2 if Cand1 +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9463) // has fewer enable_if attributes than Cand2, and vice versa. +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9464) if (!Cand1A) +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 9465) return Comparison::Worse; +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9466) if (!Cand2A) +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9467) return Comparison::Better; +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9468) +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9469) Cand1ID.clear(); +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9470) Cand2ID.clear(); +dc5ce72afada3 (Michael Kruse 2018-08-03 01:21:16 +0000 9471) +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9472) (*Cand1A)->getCond()->Profile(Cand1ID, S.getASTContext(), true); +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9473) (*Cand2A)->getCond()->Profile(Cand2ID, S.getASTContext(), true); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9474) if (Cand1ID != Cand2ID) +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9475) return Comparison::Worse; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9476) } +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9477) +157a355f3b3e7 (Michael Kruse 2018-12-10 15:16:37 +0000 9478) return Comparison::Equal; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9479) } +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 9480) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9481) static Comparison +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9482) isBetterMultiversionCandidate(const OverloadCandidate &Cand1, +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9483) const OverloadCandidate &Cand2) { +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9484) if (!Cand1.Function || !Cand1.Function->isMultiVersion() || !Cand2.Function || +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9485) !Cand2.Function->isMultiVersion()) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9486) return Comparison::Equal; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9487) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9488) // If both are invalid, they are equal. If one of them is invalid, the other +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9489) // is better. +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9490) if (Cand1.Function->isInvalidDecl()) { +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9491) if (Cand2.Function->isInvalidDecl()) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9492) return Comparison::Equal; +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9493) return Comparison::Worse; +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9494) } +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9495) if (Cand2.Function->isInvalidDecl()) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9496) return Comparison::Better; +414ff52d09f7a (Erich Keane 2019-01-04 15:24:06 +0000 9497) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9498) // If this is a cpu_dispatch/cpu_specific multiversion situation, prefer +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9499) // cpu_dispatch, else arbitrarily based on the identifiers. +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9500) bool Cand1CPUDisp = Cand1.Function->hasAttr(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9501) bool Cand2CPUDisp = Cand2.Function->hasAttr(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9502) const auto *Cand1CPUSpec = Cand1.Function->getAttr(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9503) const auto *Cand2CPUSpec = Cand2.Function->getAttr(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9504) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9505) if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9506) return Comparison::Equal; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9507) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9508) if (Cand1CPUDisp && !Cand2CPUDisp) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9509) return Comparison::Better; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9510) if (Cand2CPUDisp && !Cand1CPUDisp) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9511) return Comparison::Worse; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9512) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9513) if (Cand1CPUSpec && Cand2CPUSpec) { +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9514) if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size()) +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9515) return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size() +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9516) ? Comparison::Better +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9517) : Comparison::Worse; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9518) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9519) std::pair +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9520) FirstDiff = std::mismatch( +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9521) Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(), +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9522) Cand2CPUSpec->cpus_begin(), +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9523) [](const IdentifierInfo *LHS, const IdentifierInfo *RHS) { +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9524) return LHS->getName() == RHS->getName(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9525) }); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9526) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9527) assert(FirstDiff.first != Cand1CPUSpec->cpus_end() && +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9528) "Two different cpu-specific versions should not have the same " +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9529) "identifier list, otherwise they'd be the same decl!"); +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9530) return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName() +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9531) ? Comparison::Better +b3d10920e1344 (Fangrui Song 2020-06-10 22:32:43 -0700 9532) : Comparison::Worse; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9533) } +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9534) llvm_unreachable("No way to get here unless both had cpu_dispatch"); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9535) } +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9536) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9537) /// Compute the type of the implicit object parameter for the given function, +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9538) /// if any. Returns None if there is no implicit object parameter, and a null +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9539) /// QualType if there is a 'matches anything' implicit object parameter. +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9540) static Optional getImplicitObjectParamType(ASTContext &Context, +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9541) const FunctionDecl *F) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9542) if (!isa(F) || isa(F)) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9543) return llvm::None; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9544) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9545) auto *M = cast(F); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9546) // Static member functions' object parameters match all types. +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9547) if (M->isStatic()) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9548) return QualType(); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9549) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9550) QualType T = M->getThisObjectType(); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9551) if (M->getRefQualifier() == RQ_RValue) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9552) return Context.getRValueReferenceType(T); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9553) return Context.getLValueReferenceType(T); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9554) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9555) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9556) static bool haveSameParameterTypes(ASTContext &Context, const FunctionDecl *F1, +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9557) const FunctionDecl *F2, unsigned NumParams) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9558) if (declaresSameEntity(F1, F2)) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9559) return true; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9560) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9561) auto NextParam = [&](const FunctionDecl *F, unsigned &I, bool First) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9562) if (First) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9563) if (Optional T = getImplicitObjectParamType(Context, F)) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9564) return *T; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9565) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9566) assert(I < F->getNumParams()); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9567) return F->getParamDecl(I++)->getType(); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9568) }; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9569) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9570) unsigned I1 = 0, I2 = 0; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9571) for (unsigned I = 0; I != NumParams; ++I) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9572) QualType T1 = NextParam(F1, I1, I == 0); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9573) QualType T2 = NextParam(F2, I2, I == 0); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9574) if (!T1.isNull() && !T1.isNull() && !Context.hasSameUnqualifiedType(T1, T2)) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9575) return false; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9576) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9577) return true; +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9578) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9579) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9580) /// isBetterOverloadCandidate - Determines whether the first overload +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9581) /// candidate is a better candidate than the second (C++ 13.3.3p1). +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9582) bool clang::isBetterOverloadCandidate( +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9583) Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9584) SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9585) // Define viable functions to be better candidates than non-viable +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9586) // functions. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9587) if (!Cand2.Viable) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9588) return Cand1.Viable; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9589) else if (!Cand1.Viable) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9590) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9591) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9592) // [CUDA] A function with 'never' preference is marked not viable, therefore +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9593) // is never shown up here. The worst preference shown up here is 'wrong side', +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9594) // e.g. an H function called by a HD function in device compilation. This is +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9595) // valid AST as long as the HD function is not emitted, e.g. it is an inline +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9596) // function which is called only by an H function. A deferred diagnostic will +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9597) // be triggered if it is emitted. However a wrong-sided function is still +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9598) // a viable candidate here. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9599) // +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9600) // If Cand1 can be emitted and Cand2 cannot be emitted in the current +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9601) // context, Cand1 is better than Cand2. If Cand1 can not be emitted and Cand2 +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9602) // can be emitted, Cand1 is not better than Cand2. This rule should have +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9603) // precedence over other rules. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9604) // +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9605) // If both Cand1 and Cand2 can be emitted, or neither can be emitted, then +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9606) // other rules should be used to determine which is better. This is because +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9607) // host/device based overloading resolution is mostly for determining +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9608) // viability of a function. If two functions are both viable, other factors +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9609) // should take precedence in preference, e.g. the standard-defined preferences +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9610) // like argument conversion ranks or enable_if partial-ordering. The +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9611) // preference for pass-object-size parameters is probably most similar to a +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9612) // type-based-overloading decision and so should take priority. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9613) // +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9614) // If other rules cannot determine which is better, CUDA preference will be +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9615) // used again to determine which is better. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9616) // +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9617) // TODO: Currently IdentifyCUDAPreference does not return correct values +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9618) // for functions called in global variable initializers due to missing +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9619) // correct context about device/host. Therefore we can only enforce this +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9620) // rule when there is a caller. We should enforce this rule for functions +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9621) // in global variable initializers once proper context is added. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9622) // +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9623) // TODO: We can only enable the hostness based overloading resolution when +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9624) // -fgpu-exclude-wrong-side-overloads is on since this requires deferring +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9625) // overloading resolution diagnostics. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9626) if (S.getLangOpts().CUDA && Cand1.Function && Cand2.Function && +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9627) S.getLangOpts().GPUExcludeWrongSideOverloads) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9628) if (FunctionDecl *Caller = dyn_cast(S.CurContext)) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9629) bool IsCallerImplicitHD = Sema::isCUDAImplicitHostDeviceFunction(Caller); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9630) bool IsCand1ImplicitHD = +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9631) Sema::isCUDAImplicitHostDeviceFunction(Cand1.Function); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9632) bool IsCand2ImplicitHD = +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9633) Sema::isCUDAImplicitHostDeviceFunction(Cand2.Function); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9634) auto P1 = S.IdentifyCUDAPreference(Caller, Cand1.Function); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9635) auto P2 = S.IdentifyCUDAPreference(Caller, Cand2.Function); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9636) assert(P1 != Sema::CFP_Never && P2 != Sema::CFP_Never); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9637) // The implicit HD function may be a function in a system header which +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9638) // is forced by pragma. In device compilation, if we prefer HD candidates +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9639) // over wrong-sided candidates, overloading resolution may change, which +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9640) // may result in non-deferrable diagnostics. As a workaround, we let +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9641) // implicit HD candidates take equal preference as wrong-sided candidates. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9642) // This will preserve the overloading resolution. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9643) // TODO: We still need special handling of implicit HD functions since +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9644) // they may incur other diagnostics to be deferred. We should make all +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9645) // host/device related diagnostics deferrable and remove special handling +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9646) // of implicit HD functions. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9647) auto EmitThreshold = +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9648) (S.getLangOpts().CUDAIsDevice && IsCallerImplicitHD && +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9649) (IsCand1ImplicitHD || IsCand2ImplicitHD)) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9650) ? Sema::CFP_Never +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9651) : Sema::CFP_WrongSide; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9652) auto Cand1Emittable = P1 > EmitThreshold; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9653) auto Cand2Emittable = P2 > EmitThreshold; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9654) if (Cand1Emittable && !Cand2Emittable) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9655) return true; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9656) if (!Cand1Emittable && Cand2Emittable) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9657) return false; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9658) } +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9659) } +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9660) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9661) // C++ [over.match.best]p1: +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9662) // +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9663) // -- if F is a static member function, ICS1(F) is defined such +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9664) // that ICS1(F) is neither better nor worse than ICS1(G) for +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9665) // any function G, and, symmetrically, ICS1(G) is neither +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9666) // better nor worse than ICS1(F). +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9667) unsigned StartArg = 0; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9668) if (Cand1.IgnoreObjectArgument || Cand2.IgnoreObjectArgument) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9669) StartArg = 1; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9670) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9671) auto IsIllFormedConversion = [&](const ImplicitConversionSequence &ICS) { +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9672) // We don't allow incompatible pointer conversions in C++. +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9673) if (!S.getLangOpts().CPlusPlus) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9674) return ICS.isStandard() && +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9675) ICS.Standard.Second == ICK_Incompatible_Pointer_Conversion; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9676) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9677) // The only ill-formed conversion we allow in C++ is the string literal to +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9678) // char* conversion, which is only considered ill-formed after C++11. +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9679) return S.getLangOpts().CPlusPlus11 && !S.getLangOpts().WritableStrings && +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9680) hasDeprecatedStringLiteralToCharPtrConversion(ICS); +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9681) }; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9682) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9683) // Define functions that don't require ill-formed conversions for a given +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9684) // argument to be better candidates than functions that do. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 9685) unsigned NumArgs = Cand1.Conversions.size(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 9686) assert(Cand2.Conversions.size() == NumArgs && "Overload candidate mismatch"); +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9687) bool HasBetterConversion = false; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9688) for (unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) { +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9689) bool Cand1Bad = IsIllFormedConversion(Cand1.Conversions[ArgIdx]); +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9690) bool Cand2Bad = IsIllFormedConversion(Cand2.Conversions[ArgIdx]); +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9691) if (Cand1Bad != Cand2Bad) { +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9692) if (Cand1Bad) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9693) return false; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9694) HasBetterConversion = true; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9695) } +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9696) } +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9697) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9698) if (HasBetterConversion) +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9699) return true; +fbad5b2f1b7df (George Burgess IV 2016-09-07 20:03:19 +0000 9700) +d3cb356d14680 (Douglas Gregor 2009-07-07 23:38:56 +0000 9701) // C++ [over.match.best]p1: +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 9702) // A viable function F1 is defined to be a better function than another +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 9703) // viable function F2 if for all arguments i, ICSi(F1) is not a worse +d3cb356d14680 (Douglas Gregor 2009-07-07 23:38:56 +0000 9704) // conversion sequence than ICSi(F2), and then... +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9705) bool HasWorseConversion = false; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 9706) for (unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 9707) switch (CompareImplicitConversionSequences(S, Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 9708) Cand1.Conversions[ArgIdx], +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9709) Cand2.Conversions[ArgIdx])) { +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9710) case ImplicitConversionSequence::Better: +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9711) // Cand1 has a better conversion sequence. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9712) HasBetterConversion = true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9713) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9714) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9715) case ImplicitConversionSequence::Worse: +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9716) if (Cand1.Function && Cand2.Function && +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9717) Cand1.isReversed() != Cand2.isReversed() && +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9718) haveSameParameterTypes(S.Context, Cand1.Function, Cand2.Function, +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9719) NumArgs)) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9720) // Work around large-scale breakage caused by considering reversed +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9721) // forms of operator== in C++20: +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9722) // +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9723) // When comparing a function against a reversed function with the same +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9724) // parameter types, if we have a better conversion for one argument and +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9725) // a worse conversion for the other, the implicit conversion sequences +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9726) // are treated as being equally good. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9727) // +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9728) // This prevents a comparison function from being considered ambiguous +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9729) // with a reversed form that is written in the same way. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9730) // +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9731) // We diagnose this as an extension from CreateOverloadedBinOp. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9732) HasWorseConversion = true; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9733) break; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9734) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9735) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9736) // Cand1 can't be better than Cand2. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9737) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9738) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9739) case ImplicitConversionSequence::Indistinguishable: +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9740) // Do nothing. +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9741) break; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9742) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9743) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9744) +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 9745) // -- for some argument j, ICSj(F1) is a better conversion sequence than +d3cb356d14680 (Douglas Gregor 2009-07-07 23:38:56 +0000 9746) // ICSj(F2), or, if not that, +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 9747) if (HasBetterConversion && !HasWorseConversion) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9748) return true; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9749) +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9750) // -- the context is an initialization by user-defined conversion +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9751) // (see 8.5, 13.3.1.5) and the standard conversion sequence +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9752) // from the return type of F1 to the destination type (i.e., +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9753) // the type of the entity being initialized) is a better +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9754) // conversion sequence than the standard conversion sequence +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9755) // from the return type of F2 to the destination type. +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9756) if (Kind == OverloadCandidateSet::CSK_InitByUserDefinedConversion && +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9757) Cand1.Function && Cand2.Function && +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 9758) isa(Cand1.Function) && +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9759) isa(Cand2.Function)) { +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 9760) // First check whether we prefer one of the conversion functions over the +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 9761) // other. This only distinguishes the results in non-standard, extension +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 9762) // cases such as the conversion from a lambda closure type to a function +2837aa2932710 (Douglas Gregor 2012-02-22 17:32:19 +0000 9763) // pointer or block. +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9764) ImplicitConversionSequence::CompareKind Result = +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9765) compareConversionFunctions(S, Cand1.Function, Cand2.Function); +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9766) if (Result == ImplicitConversionSequence::Indistinguishable) +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 9767) Result = CompareStandardConversionSequences(S, Loc, +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9768) Cand1.FinalConversion, +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9769) Cand2.FinalConversion); +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9770) +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9771) if (Result != ImplicitConversionSequence::Indistinguishable) +ec2748a8ad627 (Richard Smith 2014-05-17 04:36:39 +0000 9772) return Result == ImplicitConversionSequence::Better; +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9773) +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9774) // FIXME: Compare kind of reference binding if conversion functions +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9775) // convert to a reference type used in direct reference binding, per +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9776) // C++14 [over.match.best]p1 section 2 bullet 3. +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9777) } +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9778) +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9779) // FIXME: Work around a defect in the C++17 guaranteed copy elision wording, +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9780) // as combined with the resolution to CWG issue 243. +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9781) // +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9782) // When the context is initialization by constructor ([over.match.ctor] or +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9783) // either phase of [over.match.list]), a constructor is preferred over +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9784) // a conversion function. +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9785) if (Kind == OverloadCandidateSet::CSK_InitByConstructor && NumArgs == 1 && +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9786) Cand1.Function && Cand2.Function && +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9787) isa(Cand1.Function) != +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9788) isa(Cand2.Function)) +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9789) return isa(Cand1.Function); +5173136a96854 (Richard Smith 2017-11-01 01:37:11 +0000 9790) +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9791) // -- F1 is a non-template function and F2 is a function template +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9792) // specialization, or, if not that, +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9793) bool Cand1IsSpecialization = Cand1.Function && +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9794) Cand1.Function->getPrimaryTemplate(); +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9795) bool Cand2IsSpecialization = Cand2.Function && +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9796) Cand2.Function->getPrimaryTemplate(); +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9797) if (Cand1IsSpecialization != Cand2IsSpecialization) +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9798) return Cand2IsSpecialization; +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9799) +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9800) // -- F1 and F2 are function template specializations, and the function +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9801) // template for F1 is more specialized than the template for F2 +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9802) // according to the partial ordering rules described in 14.5.5.2, or, +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9803) // if not that, +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9804) if (Cand1IsSpecialization && Cand2IsSpecialization) { +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9805) if (FunctionTemplateDecl *BetterTemplate = S.getMoreSpecializedTemplate( +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9806) Cand1.Function->getPrimaryTemplate(), +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9807) Cand2.Function->getPrimaryTemplate(), Loc, +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9808) isa(Cand1.Function) ? TPOC_Conversion +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9809) : TPOC_Call, +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9810) Cand1.ExplicitCallArguments, Cand2.ExplicitCallArguments, +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 9811) Cand1.isReversed() ^ Cand2.isReversed())) +6fdeaabda9f7d (Richard Smith 2014-05-17 01:58:45 +0000 9812) return BetterTemplate == Cand1.Function->getPrimaryTemplate(); +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9813) } +a1f013e8edb82 (Douglas Gregor 2008-11-07 22:36:19 +0000 9814) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9815) // -— F1 and F2 are non-template functions with the same +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9816) // parameter-type-lists, and F1 is more constrained than F2 [...], +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9817) if (Cand1.Function && Cand2.Function && !Cand1IsSpecialization && +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9818) !Cand2IsSpecialization && Cand1.Function->hasPrototype() && +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9819) Cand2.Function->hasPrototype()) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9820) auto *PT1 = cast(Cand1.Function->getFunctionType()); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9821) auto *PT2 = cast(Cand2.Function->getFunctionType()); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9822) if (PT1->getNumParams() == PT2->getNumParams() && +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9823) PT1->isVariadic() == PT2->isVariadic() && +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9824) S.FunctionParamTypesAreEqual(PT1, PT2)) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9825) Expr *RC1 = Cand1.Function->getTrailingRequiresClause(); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9826) Expr *RC2 = Cand2.Function->getTrailingRequiresClause(); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9827) if (RC1 && RC2) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9828) bool AtLeastAsConstrained1, AtLeastAsConstrained2; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9829) if (S.IsAtLeastAsConstrained(Cand1.Function, {RC1}, Cand2.Function, +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9830) {RC2}, AtLeastAsConstrained1) || +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9831) S.IsAtLeastAsConstrained(Cand2.Function, {RC2}, Cand1.Function, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9832) {RC1}, AtLeastAsConstrained2)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9833) return false; +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9834) if (AtLeastAsConstrained1 != AtLeastAsConstrained2) +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9835) return AtLeastAsConstrained1; +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9836) } else if (RC1 || RC2) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9837) return RC1 != nullptr; +cfacf9ae20b8c (Richard Smith 2020-02-04 12:20:34 -0800 9838) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9839) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9840) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 9841) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9842) // -- F1 is a constructor for a class D, F2 is a constructor for a base +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9843) // class B of D, and for all arguments the corresponding parameters of +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9844) // F1 and F2 have the same type. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9845) // FIXME: Implement the "all parameters have the same type" check. +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9846) bool Cand1IsInherited = +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9847) dyn_cast_or_null(Cand1.FoundDecl.getDecl()); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9848) bool Cand2IsInherited = +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9849) dyn_cast_or_null(Cand2.FoundDecl.getDecl()); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9850) if (Cand1IsInherited != Cand2IsInherited) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9851) return Cand2IsInherited; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9852) else if (Cand1IsInherited) { +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9853) assert(Cand2IsInherited); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9854) auto *Cand1Class = cast(Cand1.Function->getDeclContext()); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9855) auto *Cand2Class = cast(Cand2.Function->getDeclContext()); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9856) if (Cand1Class->isDerivedFrom(Cand2Class)) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9857) return true; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9858) if (Cand2Class->isDerivedFrom(Cand1Class)) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9859) return false; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9860) // Inherited from sibling base classes: still ambiguous. +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9861) } +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 9862) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9863) // -- F2 is a rewritten candidate (12.4.1.2) and F1 is not +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9864) // -- F1 and F2 are rewritten candidates, and F2 is a synthesized candidate +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9865) // with reversed order of parameters and F1 is not +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9866) // +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9867) // We rank reversed + different operator as worse than just reversed, but +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9868) // that comparison can never happen, because we only consider reversing for +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9869) // the maximally-rewritten operator (== or <=>). +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9870) if (Cand1.RewriteKind != Cand2.RewriteKind) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9871) return Cand1.RewriteKind < Cand2.RewriteKind; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 9872) +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9873) // Check C++17 tie-breakers for deduction guides. +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9874) { +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9875) auto *Guide1 = dyn_cast_or_null(Cand1.Function); +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9876) auto *Guide2 = dyn_cast_or_null(Cand2.Function); +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9877) if (Guide1 && Guide2) { +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9878) // -- F1 is generated from a deduction-guide and F2 is not +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9879) if (Guide1->isImplicit() != Guide2->isImplicit()) +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9880) return Guide2->isImplicit(); +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9881) +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9882) // -- F1 is the copy deduction candidate(16.3.1.8) and F2 is not +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9883) if (Guide1->isCopyDeductionCandidate()) +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9884) return true; +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9885) } +81b756e6a3e49 (Faisal Vali 2017-10-22 14:45:08 +0000 9886) } +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 9887) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 9888) // Check for enable_if value-based overload resolution. +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9889) if (Cand1.Function && Cand2.Function) { +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9890) Comparison Cmp = compareEnableIfAttrs(S, Cand1.Function, Cand2.Function); +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9891) if (Cmp != Comparison::Equal) +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9892) return Cmp == Comparison::Better; +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 9893) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 9894) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 9895) bool HasPS1 = Cand1.Function != nullptr && +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 9896) functionHasPassObjectSizeParams(Cand1.Function); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 9897) bool HasPS2 = Cand2.Function != nullptr && +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 9898) functionHasPassObjectSizeParams(Cand2.Function); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9899) if (HasPS1 != HasPS2 && HasPS1) +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9900) return true; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 9901) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9902) auto MV = isBetterMultiversionCandidate(Cand1, Cand2); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9903) if (MV == Comparison::Better) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9904) return true; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9905) if (MV == Comparison::Worse) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9906) return false; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9907) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9908) // If other rules cannot determine which is better, CUDA preference is used +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9909) // to determine which is better. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9910) if (S.getLangOpts().CUDA && Cand1.Function && Cand2.Function) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9911) FunctionDecl *Caller = dyn_cast(S.CurContext); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9912) return S.IdentifyCUDAPreference(Caller, Cand1.Function) > +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9913) S.IdentifyCUDAPreference(Caller, Cand2.Function); +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9914) } +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9915) +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9916) // General member function overloading is handled above, so this only handles +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9917) // constructors with address spaces. +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9918) // This only handles address spaces since C++ has no other +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9919) // qualifier that can be used with constructors. +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9920) const auto *CD1 = dyn_cast_or_null(Cand1.Function); +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9921) const auto *CD2 = dyn_cast_or_null(Cand2.Function); +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9922) if (CD1 && CD2) { +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9923) LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace(); +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9924) LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace(); +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9925) if (AS1 != AS2) { +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9926) if (Qualifiers::isAddressSpaceSupersetOf(AS2, AS1)) +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9927) return true; +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9928) if (Qualifiers::isAddressSpaceSupersetOf(AS2, AS1)) +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9929) return false; +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9930) } +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9931) } +b102e6880ab06 (Ole Strohm 2021-06-11 10:42:41 +0100 9932) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 9933) return false; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9934) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 9935) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9936) /// Determine whether two declarations are "equivalent" for the purposes of +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9937) /// name lookup and overload resolution. This applies when the same internal/no +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9938) /// linkage entity is defined by two modules (probably by textually including +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9939) /// the same header). In such a case, we don't consider the declarations to +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9940) /// declare the same entity, but we also don't want lookups with both +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9941) /// declarations visible to be ambiguous in some cases (this happens when using +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9942) /// a modularized libstdc++). +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9943) bool Sema::isEquivalentInternalLinkageDeclaration(const NamedDecl *A, +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9944) const NamedDecl *B) { +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9945) auto *VA = dyn_cast_or_null(A); +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9946) auto *VB = dyn_cast_or_null(B); +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9947) if (!VA || !VB) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9948) return false; +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9949) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9950) // The declarations must be declaring the same name as an internal linkage +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9951) // entity in different modules. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9952) if (!VA->getDeclContext()->getRedeclContext()->Equals( +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9953) VB->getDeclContext()->getRedeclContext()) || +7af67259cdd66 (Simon Pilgrim 2020-01-13 14:28:49 +0000 9954) getOwningModule(VA) == getOwningModule(VB) || +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9955) VA->isExternallyVisible() || VB->isExternallyVisible()) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9956) return false; +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9957) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9958) // Check that the declarations appear to be equivalent. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9959) // +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9960) // FIXME: Checking the type isn't really enough to resolve the ambiguity. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9961) // For constants and functions, we should check the initializer or body is +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9962) // the same. For non-constant variables, we shouldn't allow it at all. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9963) if (Context.hasSameType(VA->getType(), VB->getType())) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9964) return true; +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9965) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9966) // Enum constants within unnamed enumerations will have different types, but +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9967) // may still be similar enough to be interchangeable for our purposes. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9968) if (auto *EA = dyn_cast(VA)) { +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9969) if (auto *EB = dyn_cast(VB)) { +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9970) // Only handle anonymous enums. If the enumerations were named and +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9971) // equivalent, they would have been merged to the same type. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9972) auto *EnumA = cast(EA->getDeclContext()); +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9973) auto *EnumB = cast(EB->getDeclContext()); +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9974) if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() || +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9975) !Context.hasSameType(EnumA->getIntegerType(), +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9976) EnumB->getIntegerType())) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9977) return false; +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9978) // Allow this only if the value is the same for both enumerators. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9979) return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal()); +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9980) } +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9981) } +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9982) +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9983) // Nothing else is sufficiently similar. +26210db67f218 (Richard Smith 2015-11-13 03:52:13 +0000 9984) return false; +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9985) } +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9986) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9987) void Sema::diagnoseEquivalentInternalLinkageDeclarations( +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9988) SourceLocation Loc, const NamedDecl *D, ArrayRef Equiv) { +feb0b4ec0a448 (Simon Pilgrim 2021-01-26 15:51:49 +0000 9989) assert(D && "Unknown declaration"); +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9990) Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D; +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9991) +7af67259cdd66 (Simon Pilgrim 2020-01-13 14:28:49 +0000 9992) Module *M = getOwningModule(D); +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9993) Diag(D->getLocation(), diag::note_equivalent_internal_linkage_decl) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9994) << !M << (M ? M->getFullModuleName() : ""); +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9995) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9996) for (auto *E : Equiv) { +7af67259cdd66 (Simon Pilgrim 2020-01-13 14:28:49 +0000 9997) Module *M = getOwningModule(E); +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9998) Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 9999) << !M << (M ? M->getFullModuleName() : ""); +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 10000) } +896c66ecc64e9 (Richard Smith 2015-10-21 07:13:52 +0000 10001) } +896c66ecc64e9 (Richard Smith 2015-10-21 07:13:52 +0000 10002) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 10003) /// Computes the best viable function (C++ 13.3.3) +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10004) /// within an overload candidate set. +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10005) /// +ffad8b75e53ff (James Dennett 2012-06-22 08:10:18 +0000 10006) /// \param Loc The location of the function name (or operator symbol) for +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10007) /// which overload resolution occurs. +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10008) /// +ffad8b75e53ff (James Dennett 2012-06-22 08:10:18 +0000 10009) /// \param Best If overload resolution was successful or found a deleted +ffad8b75e53ff (James Dennett 2012-06-22 08:10:18 +0000 10010) /// function, \p Best points to the candidate function found. +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10011) /// +c9c02ed8f499f (Douglas Gregor 2009-06-19 23:52:42 +0000 10012) /// \returns The result of overload resolution. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10013) OverloadingResult +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10014) OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc, +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 10015) iterator &Best) { +186091094ae7c (Artem Belevich 2016-02-12 18:29:18 +0000 10016) llvm::SmallVector Candidates; +186091094ae7c (Artem Belevich 2016-02-12 18:29:18 +0000 10017) std::transform(begin(), end(), std::back_inserter(Candidates), +186091094ae7c (Artem Belevich 2016-02-12 18:29:18 +0000 10018) [](OverloadCandidate &Cand) { return &Cand; }); +186091094ae7c (Artem Belevich 2016-02-12 18:29:18 +0000 10019) +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10020) // [CUDA] HD->H or HD->D calls are technically not allowed by CUDA but +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10021) // are accepted by both clang and NVCC. However, during a particular +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10022) // compilation mode only one call variant is viable. We need to +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10023) // exclude non-viable overload candidates from consideration based +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10024) // only on their host/device attributes. Specifically, if one +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10025) // candidate call is WrongSide and the other is SameSide, we ignore +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10026) // the WrongSide candidate. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 10027) // We only need to remove wrong-sided candidates here if +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 10028) // -fgpu-exclude-wrong-side-overloads is off. When +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 10029) // -fgpu-exclude-wrong-side-overloads is on, all candidates are compared +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 10030) // uniformly in isBetterOverloadCandidate. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 10031) if (S.getLangOpts().CUDA && !S.getLangOpts().GPUExcludeWrongSideOverloads) { +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10032) const FunctionDecl *Caller = dyn_cast(S.CurContext); +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10033) bool ContainsSameSideCandidate = +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10034) llvm::any_of(Candidates, [&](OverloadCandidate *Cand) { +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10035) // Check viable function only. +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10036) return Cand->Viable && Cand->Function && +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10037) S.IdentifyCUDAPreference(Caller, Cand->Function) == +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10038) Sema::CFP_SameSide; +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10039) }); +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10040) if (ContainsSameSideCandidate) { +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10041) auto IsWrongSideCandidate = [&](OverloadCandidate *Cand) { +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10042) // Check viable function only to avoid unnecessary data copying/moving. +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10043) return Cand->Viable && Cand->Function && +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10044) S.IdentifyCUDAPreference(Caller, Cand->Function) == +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10045) Sema::CFP_WrongSide; +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10046) }; +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10047) llvm::erase_if(Candidates, IsWrongSideCandidate); +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10048) } +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10049) } +dfc0d9475556c (Fangrui Song 2020-06-10 17:40:04 -0700 10050) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10051) // Find the best viable function. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10052) Best = end(); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10053) for (auto *Cand : Candidates) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10054) Cand->Best = false; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10055) if (Cand->Viable) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 10056) if (Best == end() || +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 10057) isBetterOverloadCandidate(S, *Cand, *Best, Loc, Kind)) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10058) Best = Cand; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10059) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10060) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10061) // If we didn't find any viable functions, abort. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10062) if (Best == end()) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10063) return OR_No_Viable_Function; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10064) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 10065) llvm::SmallVector EquivalentCands; +896c66ecc64e9 (Richard Smith 2015-10-21 07:13:52 +0000 10066) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10067) llvm::SmallVector PendingBest; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10068) PendingBest.push_back(&*Best); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10069) Best->Best = true; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10070) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10071) // Make sure that this function is better than every other viable +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10072) // function. If not, we have an ambiguity. +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10073) while (!PendingBest.empty()) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10074) auto *Curr = PendingBest.pop_back_val(); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10075) for (auto *Cand : Candidates) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10076) if (Cand->Viable && !Cand->Best && +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10077) !isBetterOverloadCandidate(S, *Curr, *Cand, Loc, Kind)) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10078) PendingBest.push_back(Cand); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10079) Cand->Best = true; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10080) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10081) if (S.isEquivalentInternalLinkageDeclaration(Cand->Function, +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10082) Curr->Function)) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10083) EquivalentCands.push_back(Cand->Function); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10084) else +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10085) Best = end(); +896c66ecc64e9 (Richard Smith 2015-10-21 07:13:52 +0000 10086) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 10087) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10088) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 10089) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10090) // If we found more than one best candidate, this is ambiguous. +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10091) if (Best == end()) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10092) return OR_Ambiguous; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 10093) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10094) // Best is the best viable function. +13ee62f7d7eed (Erik Pilkington 2019-03-20 19:26:33 +0000 10095) if (Best->Function && Best->Function->isDeleted()) +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 10096) return OR_Deleted; +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 10097) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 10098) if (!EquivalentCands.empty()) +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 10099) S.diagnoseEquivalentInternalLinkageDeclarations(Loc, Best->Function, +2dbe4043e8f54 (Richard Smith 2015-11-04 19:26:32 +0000 10100) EquivalentCands); +896c66ecc64e9 (Richard Smith 2015-10-21 07:13:52 +0000 10101) +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10102) return OR_Success; +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10103) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 10104) +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10105) namespace { +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10106) +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10107) enum OverloadCandidateKind { +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10108) oc_function, +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10109) oc_method, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10110) oc_reversed_binary_operator, +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10111) oc_constructor, +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10112) oc_implicit_default_constructor, +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10113) oc_implicit_copy_constructor, +119c10ef231ee (Alexis Hunt 2011-05-25 23:16:36 +0000 10114) oc_implicit_move_constructor, +0890502f44a1f (Sebastian Redl 2011-02-05 19:23:19 +0000 10115) oc_implicit_copy_assignment, +119c10ef231ee (Alexis Hunt 2011-05-25 23:16:36 +0000 10116) oc_implicit_move_assignment, +bc24014b9765a (Richard Smith 2019-12-10 16:45:02 -0800 10117) oc_implicit_equality_comparison, +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10118) oc_inherited_constructor +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10119) }; +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10120) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10121) enum OverloadCandidateSelect { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10122) ocs_non_template, +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10123) ocs_template, +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10124) ocs_described_template, +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10125) }; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10126) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10127) static std::pair +d66d37cbd96f3 (George Burgess IV 2016-10-28 21:42:06 +0000 10128) ClassifyOverloadCandidate(Sema &S, NamedDecl *Found, FunctionDecl *Fn, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10129) OverloadCandidateRewriteKind CRK, +d66d37cbd96f3 (George Burgess IV 2016-10-28 21:42:06 +0000 10130) std::string &Description) { +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10131) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10132) bool isTemplate = Fn->isTemplateDecl() || Found->isTemplateDecl(); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10133) if (FunctionTemplateDecl *FunTmpl = Fn->getPrimaryTemplate()) { +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10134) isTemplate = true; +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10135) Description = S.getTemplateArgumentBindingsText( +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10136) FunTmpl->getTemplateParameters(), *Fn->getTemplateSpecializationArgs()); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10137) } +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10138) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10139) OverloadCandidateSelect Select = [&]() { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10140) if (!Description.empty()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10141) return ocs_described_template; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10142) return isTemplate ? ocs_template : ocs_non_template; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10143) }(); +0890502f44a1f (Sebastian Redl 2011-02-05 19:23:19 +0000 10144) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10145) OverloadCandidateKind Kind = [&]() { +bc24014b9765a (Richard Smith 2019-12-10 16:45:02 -0800 10146) if (Fn->isImplicit() && Fn->getOverloadedOperator() == OO_EqualEqual) +bc24014b9765a (Richard Smith 2019-12-10 16:45:02 -0800 10147) return oc_implicit_equality_comparison; +bc24014b9765a (Richard Smith 2019-12-10 16:45:02 -0800 10148) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10149) if (CRK & CRK_Reversed) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10150) return oc_reversed_binary_operator; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10151) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10152) if (CXXConstructorDecl *Ctor = dyn_cast(Fn)) { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10153) if (!Ctor->isImplicit()) { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10154) if (isa(Found)) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10155) return oc_inherited_constructor; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10156) else +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10157) return oc_constructor; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10158) } +119c10ef231ee (Alexis Hunt 2011-05-25 23:16:36 +0000 10159) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10160) if (Ctor->isDefaultConstructor()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10161) return oc_implicit_default_constructor; +119c10ef231ee (Alexis Hunt 2011-05-25 23:16:36 +0000 10162) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10163) if (Ctor->isMoveConstructor()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10164) return oc_implicit_move_constructor; +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10165) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10166) assert(Ctor->isCopyConstructor() && +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10167) "unexpected sort of implicit constructor"); +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10168) return oc_implicit_copy_constructor; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10169) } +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10170) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10171) if (CXXMethodDecl *Meth = dyn_cast(Fn)) { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10172) // This actually gets spelled 'candidate function' for now, but +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10173) // it doesn't hurt to split it out. +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10174) if (!Meth->isImplicit()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10175) return oc_method; +119c10ef231ee (Alexis Hunt 2011-05-25 23:16:36 +0000 10176) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10177) if (Meth->isMoveAssignmentOperator()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10178) return oc_implicit_move_assignment; +12695101ec453 (Douglas Gregor 2012-02-10 08:36:38 +0000 10179) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10180) if (Meth->isCopyAssignmentOperator()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10181) return oc_implicit_copy_assignment; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10182) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10183) assert(isa(Meth) && "expected conversion"); +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10184) return oc_method; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10185) } +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10186) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10187) return oc_function; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10188) }(); +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10189) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10190) return std::make_pair(Kind, Select); +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10191) } +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10192) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10193) void MaybeEmitInheritedConstructorNote(Sema &S, Decl *FoundDecl) { +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10194) // FIXME: It'd be nice to only emit a note once per using-decl per overload +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10195) // set. +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10196) if (auto *Shadow = dyn_cast(FoundDecl)) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10197) S.Diag(FoundDecl->getLocation(), +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10198) diag::note_ovl_candidate_inherited_constructor) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10199) << Shadow->getNominatedBaseClass(); +0890502f44a1f (Sebastian Redl 2011-02-05 19:23:19 +0000 10200) } +0890502f44a1f (Sebastian Redl 2011-02-05 19:23:19 +0000 10201) +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10202) } // end anonymous namespace +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10203) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10204) static bool isFunctionAlwaysEnabled(const ASTContext &Ctx, +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10205) const FunctionDecl *FD) { +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10206) for (auto *EnableIf : FD->specific_attrs()) { +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10207) bool AlwaysTrue; +04323c24a1ac9 (Dmitri Gribenko 2019-05-17 17:16:53 +0000 10208) if (EnableIf->getCond()->isValueDependent() || +04323c24a1ac9 (Dmitri Gribenko 2019-05-17 17:16:53 +0000 10209) !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx)) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10210) return false; +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10211) if (!AlwaysTrue) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10212) return false; +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10213) } +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10214) return true; +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10215) } +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10216) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 10217) /// Returns true if we can take the address of the function. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10218) /// +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10219) /// \param Complain - If true, we'll emit a diagnostic +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10220) /// \param InOverloadResolution - For the purposes of emitting a diagnostic, are +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10221) /// we in overload resolution? +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10222) /// \param Loc - The location of the statement we're complaining about. Ignored +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10223) /// if we're not complaining, or if we're in overload resolution. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10224) static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10225) bool Complain, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10226) bool InOverloadResolution, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10227) SourceLocation Loc) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10228) if (!isFunctionAlwaysEnabled(S.Context, FD)) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10229) if (Complain) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10230) if (InOverloadResolution) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 10231) S.Diag(FD->getBeginLoc(), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10232) diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10233) else +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10234) S.Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10235) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10236) return false; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10237) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10238) +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 10239) if (FD->getTrailingRequiresClause()) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10240) ConstraintSatisfaction Satisfaction; +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 10241) if (S.CheckFunctionConstraints(FD, Satisfaction, Loc)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10242) return false; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10243) if (!Satisfaction.IsSatisfied) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10244) if (Complain) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10245) if (InOverloadResolution) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10246) S.Diag(FD->getBeginLoc(), +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10247) diag::note_ovl_candidate_unsatisfied_constraints); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10248) else +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10249) S.Diag(Loc, diag::err_addrof_function_constraints_not_satisfied) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10250) << FD; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10251) S.DiagnoseUnsatisfiedConstraint(Satisfaction); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10252) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10253) return false; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10254) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10255) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10256) +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 10257) auto I = llvm::find_if(FD->parameters(), [](const ParmVarDecl *P) { +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 10258) return P->hasAttr(); +21081364f84dc (George Burgess IV 2016-07-24 23:12:40 +0000 10259) }); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10260) if (I == FD->param_end()) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10261) return true; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10262) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10263) if (Complain) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10264) // Add one to ParamNo because it's user-facing +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10265) unsigned ParamNo = std::distance(FD->param_begin(), I) + 1; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10266) if (InOverloadResolution) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10267) S.Diag(FD->getLocation(), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10268) diag::note_ovl_candidate_has_pass_object_size_params) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10269) << ParamNo; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10270) else +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10271) S.Diag(Loc, diag::err_address_of_function_with_pass_object_size_params) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10272) << FD << ParamNo; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10273) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10274) return false; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10275) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10276) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10277) static bool checkAddressOfCandidateIsAvailable(Sema &S, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10278) const FunctionDecl *FD) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10279) return checkAddressOfFunctionIsAvailable(S, FD, /*Complain=*/true, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10280) /*InOverloadResolution=*/true, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10281) /*Loc=*/SourceLocation()); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10282) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10283) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10284) bool Sema::checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10285) bool Complain, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10286) SourceLocation Loc) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10287) return ::checkAddressOfFunctionIsAvailable(*this, Function, Complain, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10288) /*InOverloadResolution=*/false, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10289) Loc); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10290) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10291) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10292) // Don't print candidates other than the one that matches the calling +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10293) // convention of the call operator, since that is guaranteed to exist. +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10294) static bool shouldSkipNotingLambdaConversionDecl(FunctionDecl *Fn) { +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10295) const auto *ConvD = dyn_cast(Fn); +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10296) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10297) if (!ConvD) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10298) return false; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10299) const auto *RD = cast(Fn->getParent()); +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10300) if (!RD->isLambda()) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10301) return false; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10302) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10303) CXXMethodDecl *CallOp = RD->getLambdaCallOperator(); +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10304) CallingConv CallOpCC = +2901dc7575873 (Simon Pilgrim 2021-04-06 12:04:01 +0100 10305) CallOp->getType()->castAs()->getCallConv(); +2901dc7575873 (Simon Pilgrim 2021-04-06 12:04:01 +0100 10306) QualType ConvRTy = ConvD->getType()->castAs()->getReturnType(); +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10307) CallingConv ConvToCC = +2901dc7575873 (Simon Pilgrim 2021-04-06 12:04:01 +0100 10308) ConvRTy->getPointeeType()->castAs()->getCallConv(); +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10309) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10310) return ConvToCC != CallOpCC; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10311) } +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10312) +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 10313) // Notes the location of an overload candidate. +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10314) void Sema::NoteOverloadCandidate(NamedDecl *Found, FunctionDecl *Fn, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10315) OverloadCandidateRewriteKind RewriteKind, +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10316) QualType DestType, bool TakingAddress) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10317) if (TakingAddress && !checkAddressOfCandidateIsAvailable(*this, Fn)) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10318) return; +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 10319) if (Fn->isMultiVersion() && Fn->hasAttr() && +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 10320) !Fn->getAttr()->isDefaultVersion()) +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 10321) return; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10322) if (shouldSkipNotingLambdaConversionDecl(Fn)) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 10323) return; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10324) +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10325) std::string FnDesc; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10326) std::pair KSPair = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10327) ClassifyOverloadCandidate(*this, Found, Fn, RewriteKind, FnDesc); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 10328) PartialDiagnostic PD = PDiag(diag::note_ovl_candidate) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10329) << (unsigned)KSPair.first << (unsigned)KSPair.second +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10330) << Fn << FnDesc; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10331) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10332) HandleFunctionTypeMismatch(PD, Fn->getType(), DestType); +caff247882fce (Richard Trieu 2011-11-23 22:32:32 +0000 10333) Diag(Fn->getLocation(), PD); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10334) MaybeEmitInheritedConstructorNote(*this, Found); +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10335) } +fd0b2f8fe486f (John McCall 2010-01-06 09:43:14 +0000 10336) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10337) static void +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10338) MaybeDiagnoseAmbiguousConstraints(Sema &S, ArrayRef Cands) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10339) // Perhaps the ambiguity was caused by two atomic constraints that are +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10340) // 'identical' but not equivalent: +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10341) // +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10342) // void foo() requires (sizeof(T) > 4) { } // #1 +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10343) // void foo() requires (sizeof(T) > 4) && T::value { } // #2 +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10344) // +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10345) // The 'sizeof(T) > 4' constraints are seemingly equivalent and should cause +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10346) // #2 to subsume #1, but these constraint are not considered equivalent +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10347) // according to the subsumption rules because they are not the same +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10348) // source-level construct. This behavior is quite confusing and we should try +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10349) // to help the user figure out what happened. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10350) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10351) SmallVector FirstAC, SecondAC; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10352) FunctionDecl *FirstCand = nullptr, *SecondCand = nullptr; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10353) for (auto I = Cands.begin(), E = Cands.end(); I != E; ++I) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10354) if (!I->Function) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10355) continue; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10356) SmallVector AC; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10357) if (auto *Template = I->Function->getPrimaryTemplate()) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10358) Template->getAssociatedConstraints(AC); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10359) else +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10360) I->Function->getAssociatedConstraints(AC); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10361) if (AC.empty()) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10362) continue; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10363) if (FirstCand == nullptr) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10364) FirstCand = I->Function; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10365) FirstAC = AC; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10366) } else if (SecondCand == nullptr) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10367) SecondCand = I->Function; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10368) SecondAC = AC; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10369) } else { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10370) // We have more than one pair of constrained functions - this check is +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10371) // expensive and we'd rather not try to diagnose it. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10372) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10373) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10374) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10375) if (!SecondCand) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10376) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10377) // The diagnostic can only happen if there are associated constraints on +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10378) // both sides (there needs to be some identical atomic constraint). +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10379) if (S.MaybeEmitAmbiguousAtomicConstraintsDiagnostic(FirstCand, FirstAC, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10380) SecondCand, SecondAC)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10381) // Just show the user one diagnostic, they'll probably figure it out +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10382) // from here. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10383) return; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10384) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 10385) +ed4265c24e2b6 (Nick Lewycky 2013-09-22 10:06:01 +0000 10386) // Notes the location of all overload candidates designated through +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10387) // OverloadedExpr +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10388) void Sema::NoteAllOverloadCandidates(Expr *OverloadedExpr, QualType DestType, +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10389) bool TakingAddress) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10390) assert(OverloadedExpr->getType() == Context.OverloadTy); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10391) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10392) OverloadExpr::FindResult Ovl = OverloadExpr::find(OverloadedExpr); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10393) OverloadExpr *OvlExpr = Ovl.Expression; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10394) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10395) for (UnresolvedSetIterator I = OvlExpr->decls_begin(), +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10396) IEnd = OvlExpr->decls_end(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10397) I != IEnd; ++I) { +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10398) if (FunctionTemplateDecl *FunTmpl = +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10399) dyn_cast((*I)->getUnderlyingDecl()) ) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10400) NoteOverloadCandidate(*I, FunTmpl->getTemplatedDecl(), CRK_None, DestType, +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 10401) TakingAddress); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10402) } else if (FunctionDecl *Fun +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10403) = dyn_cast((*I)->getUnderlyingDecl()) ) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10404) NoteOverloadCandidate(*I, Fun, CRK_None, DestType, TakingAddress); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10405) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10406) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10407) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 10408) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 10409) /// Diagnoses an ambiguous conversion. The partial diagnostic is the +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 10410) /// "lead" diagnostic; it will be given two arguments, the source and +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 10411) /// target types of the conversion. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10412) void ImplicitConversionSequence::DiagnoseAmbiguousConversion( +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10413) Sema &S, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10414) SourceLocation CaretLoc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10415) const PartialDiagnostic &PDiag) const { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10416) S.Diag(CaretLoc, PDiag) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 10417) << Ambiguous.getFromType() << Ambiguous.getToType(); +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10418) unsigned CandsShown = 0; +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10419) AmbiguousConversionSequence::const_iterator I, E; +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10420) for (I = Ambiguous.begin(), E = Ambiguous.end(); I != E; ++I) { +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 10421) if (CandsShown >= S.Diags.getNumOverloadCandidatesToShow()) +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10422) break; +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10423) ++CandsShown; +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10424) S.NoteOverloadCandidate(I->first, I->second); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 10425) } +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 10426) S.Diags.overloadCandidatesShown(CandsShown); +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10427) if (I != E) +641bd89d6b5e7 (Matt Beaumont-Gay 2012-11-08 20:50:02 +0000 10428) S.Diag(SourceLocation(), diag::note_ovl_too_many_candidates) << int(E - I); +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 10429) } +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 10430) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10431) static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10432) unsigned I, bool TakingCandidateAddress) { +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10433) const ImplicitConversionSequence &Conv = Cand->Conversions[I]; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10434) assert(Conv.isBad()); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10435) assert(Cand->Function && "for now, candidate must be a function"); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10436) FunctionDecl *Fn = Cand->Function; +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10437) +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10438) // There's a conversion slot for the object argument if this is a +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10439) // non-constructor method. Note that 'I' corresponds the +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10440) // conversion-slot index. +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10441) bool isObjectArgument = false; +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10442) if (isa(Fn) && !isa(Fn)) { +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10443) if (I == 0) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10444) isObjectArgument = true; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10445) else +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10446) I--; +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10447) } +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10448) +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10449) std::string FnDesc; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10450) std::pair FnKindPair = +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 10451) ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, Cand->getRewriteKind(), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10452) FnDesc); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10453) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10454) Expr *FromExpr = Conv.Bad.FromExpr; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10455) QualType FromTy = Conv.Bad.getFromType(); +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10456) QualType ToTy = Conv.Bad.getToType(); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10457) +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10458) if (FromTy == S.Context.OverloadTy) { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 10459) assert(FromExpr && "overload set argument came from implicit argument?"); +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10460) Expr *E = FromExpr->IgnoreParens(); +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10461) if (isa(E)) +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10462) E = cast(E)->getSubExpr()->IgnoreParens(); +1acbbb5a4c6e6 (John McCall 2010-02-02 06:20:04 +0000 10463) DeclarationName Name = cast(E)->getName(); +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10464) +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10465) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10466) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10467) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << ToTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10468) << Name << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10469) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10470) return; +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10471) } +fb7ad0f57a0cb (John McCall 2010-02-02 02:42:52 +0000 10472) +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10473) // Do some hand-waving analysis to see if the non-viability is due +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10474) // to a qualifier mismatch. +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10475) CanQualType CFromTy = S.Context.getCanonicalType(FromTy); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10476) CanQualType CToTy = S.Context.getCanonicalType(ToTy); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10477) if (CanQual RT = CToTy->getAs()) +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10478) CToTy = RT->getPointeeType(); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10479) else { +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10480) // TODO: detect and diagnose the full richness of const mismatches. +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10481) if (CanQual FromPT = CFromTy->getAs()) +cc3949d99af2b (Richard Trieu 2016-02-18 22:34:54 +0000 10482) if (CanQual ToPT = CToTy->getAs()) { +cc3949d99af2b (Richard Trieu 2016-02-18 22:34:54 +0000 10483) CFromTy = FromPT->getPointeeType(); +cc3949d99af2b (Richard Trieu 2016-02-18 22:34:54 +0000 10484) CToTy = ToPT->getPointeeType(); +cc3949d99af2b (Richard Trieu 2016-02-18 22:34:54 +0000 10485) } +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10486) } +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10487) +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10488) if (CToTy.getUnqualifiedType() == CFromTy.getUnqualifiedType() && +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10489) !CToTy.isAtLeastAsQualifiedAs(CFromTy)) { +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10490) Qualifiers FromQs = CFromTy.getQualifiers(); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10491) Qualifiers ToQs = CToTy.getQualifiers(); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10492) +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10493) if (FromQs.getAddressSpace() != ToQs.getAddressSpace()) { +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10494) if (isObjectArgument) +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10495) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this) +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10496) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10497) << FnDesc << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10498) << FromQs.getAddressSpace() << ToQs.getAddressSpace(); +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10499) else +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10500) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace) +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10501) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10502) << FnDesc << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10503) << FromQs.getAddressSpace() << ToQs.getAddressSpace() +ed8dadb37c7e1 (Anastasia Stulova 2019-12-13 12:30:59 +0000 10504) << ToTy->isReferenceType() << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10505) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10506) return; +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10507) } +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10508) +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 10509) if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) { +cff00d9c127c7 (Argyrios Kyrtzidis 2011-06-24 00:08:59 +0000 10510) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10511) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10512) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10513) << FromQs.getObjCLifetime() << ToQs.getObjCLifetime() +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10514) << (unsigned)isObjectArgument << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10515) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 10516) return; +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 10517) } +31168b077c368 (John McCall 2011-06-15 23:02:42 +0000 10518) +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 10519) if (FromQs.getObjCGCAttr() != ToQs.getObjCGCAttr()) { +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 10520) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10521) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10522) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10523) << FromQs.getObjCGCAttr() << ToQs.getObjCGCAttr() +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10524) << (unsigned)isObjectArgument << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10525) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 10526) return; +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 10527) } +aec25847606fd (Douglas Gregor 2011-04-26 23:16:46 +0000 10528) +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 10529) if (FromQs.hasUnaligned() != ToQs.hasUnaligned()) { +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 10530) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_unaligned) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10531) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10532) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10533) << FromQs.hasUnaligned() << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10534) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 10535) return; +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 10536) } +45d413260e82b (Andrey Bokhanko 2016-05-11 18:38:21 +0000 10537) +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10538) unsigned CVR = FromQs.getCVRQualifiers() & ~ToQs.getCVRQualifiers(); +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10539) assert(CVR && "expected qualifiers mismatch"); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10540) +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10541) if (isObjectArgument) { +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10542) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10543) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10544) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10545) << (CVR - 1); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10546) } else { +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10547) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10548) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10549) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10550) << (CVR - 1) << I + 1; +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10551) } +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10552) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10553) return; +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10554) } +47000997193cf (John McCall 2010-01-14 03:28:57 +0000 10555) +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10556) if (Conv.Bad.Kind == BadConversionSequence::lvalue_ref_to_rvalue || +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10557) Conv.Bad.Kind == BadConversionSequence::rvalue_ref_to_lvalue) { +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10558) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category) +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10559) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10560) << (unsigned)isObjectArgument << I + 1 +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10561) << (Conv.Bad.Kind == BadConversionSequence::rvalue_ref_to_lvalue) +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10562) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()); +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10563) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10564) return; +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10565) } +6f84779674a97 (Aaron Puchert 2020-11-15 16:11:23 +0100 10566) +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10567) // Special diagnostic for failure to convert an initializer list, since +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10568) // telling the user that it has type void is not useful. +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10569) if (FromExpr && isa(FromExpr)) { +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10570) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10571) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10572) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10573) << ToTy << (unsigned)isObjectArgument << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10574) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10575) return; +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10576) } +a72462cdf43be (Sebastian Redl 2011-09-24 17:48:32 +0000 10577) +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10578) // Diagnose references or pointers to incomplete types differently, +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10579) // since it's far from impossible that the incompleteness triggered +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10580) // the failure. +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10581) QualType TempFromTy = FromTy.getNonReferenceType(); +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10582) if (const PointerType *PTy = TempFromTy->getAs()) +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10583) TempFromTy = PTy->getPointeeType(); +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10584) if (TempFromTy->isIncompleteType()) { +ac92893a93618 (David Blaikie 2016-03-04 22:29:11 +0000 10585) // Emit the generic diagnostic and, optionally, add the hints to it. +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10586) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10587) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10588) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10589) << ToTy << (unsigned)isObjectArgument << I + 1 +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10590) << (unsigned)(Cand->Fix.Kind); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10591) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10592) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10593) return; +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10594) } +6d174646dd1a8 (John McCall 2010-01-23 08:10:49 +0000 10595) +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10596) // Diagnose base -> derived pointer conversions. +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10597) unsigned BaseToDerivedConversion = 0; +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10598) if (const PointerType *FromPtrTy = FromTy->getAs()) { +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10599) if (const PointerType *ToPtrTy = ToTy->getAs()) { +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10600) if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs( +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10601) FromPtrTy->getPointeeType()) && +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10602) !FromPtrTy->getPointeeType()->isIncompleteType() && +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10603) !ToPtrTy->getPointeeType()->isIncompleteType() && +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 10604) S.IsDerivedFrom(SourceLocation(), ToPtrTy->getPointeeType(), +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10605) FromPtrTy->getPointeeType())) +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10606) BaseToDerivedConversion = 1; +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10607) } +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10608) } else if (const ObjCObjectPointerType *FromPtrTy +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10609) = FromTy->getAs()) { +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10610) if (const ObjCObjectPointerType *ToPtrTy +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10611) = ToTy->getAs()) +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10612) if (const ObjCInterfaceDecl *FromIface = FromPtrTy->getInterfaceDecl()) +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10613) if (const ObjCInterfaceDecl *ToIface = ToPtrTy->getInterfaceDecl()) +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10614) if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs( +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10615) FromPtrTy->getPointeeType()) && +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10616) FromIface->isSuperClassOf(ToIface)) +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10617) BaseToDerivedConversion = 2; +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10618) } else if (const ReferenceType *ToRefTy = ToTy->getAs()) { +9ea8f7e6c53fa (Kaelyn Uhrain 2012-06-19 00:37:47 +0000 10619) if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy) && +9ea8f7e6c53fa (Kaelyn Uhrain 2012-06-19 00:37:47 +0000 10620) !FromTy->isIncompleteType() && +9ea8f7e6c53fa (Kaelyn Uhrain 2012-06-19 00:37:47 +0000 10621) !ToRefTy->getPointeeType()->isIncompleteType() && +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 10622) S.IsDerivedFrom(SourceLocation(), ToRefTy->getPointeeType(), FromTy)) { +9ea8f7e6c53fa (Kaelyn Uhrain 2012-06-19 00:37:47 +0000 10623) BaseToDerivedConversion = 3; +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10624) } +9ea8f7e6c53fa (Kaelyn Uhrain 2012-06-19 00:37:47 +0000 10625) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10626) +fb0c0d37b7f2d (Douglas Gregor 2010-07-01 02:14:45 +0000 10627) if (BaseToDerivedConversion) { +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10628) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10629) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10630) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10631) << (BaseToDerivedConversion - 1) << FromTy << ToTy << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10632) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10633) return; +56f2e34a6a081 (Douglas Gregor 2010-06-30 23:01:39 +0000 10634) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10635) +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10636) if (isa(CFromTy) && +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10637) isa(CToTy)) { +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10638) Qualifiers FromQs = CFromTy.getQualifiers(); +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10639) Qualifiers ToQs = CToTy.getQualifiers(); +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10640) if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) { +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10641) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10642) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10643) << FnDesc << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10644) << FromTy << ToTy << (unsigned)isObjectArgument << I + 1; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10645) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10646) return; +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10647) } +a644f9cb73a1b (Fariborz Jahanian 2011-07-20 17:14:09 +0000 10648) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10649) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10650) if (TakingCandidateAddress && +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10651) !checkAddressOfCandidateIsAvailable(S, Cand->Function)) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10652) return; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10653) +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10654) // Emit the generic diagnostic and, optionally, add the hints to it. +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10655) PartialDiagnostic FDiag = S.PDiag(diag::note_ovl_candidate_bad_conv); +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10656) FDiag << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10657) << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << FromTy +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10658) << ToTy << (unsigned)isObjectArgument << I + 1 +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10659) << (unsigned)(Cand->Fix.Kind); +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10660) +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10661) // If we can fix the conversion, suggest the FixIts. +490afa6b9d1b3 (Benjamin Kramer 2012-01-14 21:05:10 +0000 10662) for (std::vector::iterator HI = Cand->Fix.Hints.begin(), +490afa6b9d1b3 (Benjamin Kramer 2012-01-14 21:05:10 +0000 10663) HE = Cand->Fix.Hints.end(); HI != HE; ++HI) +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10664) FDiag << *HI; +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10665) S.Diag(Fn->getLocation(), FDiag); +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 10666) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10667) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10668) } +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10669) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10670) /// Additional arity mismatch diagnosis specific to a function overload +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10671) /// candidates. This is not covered by the more general DiagnoseArityMismatch() +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10672) /// over a candidate in any candidate set. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10673) static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10674) unsigned NumArgs) { +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10675) FunctionDecl *Fn = Cand->Function; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10676) unsigned MinParams = Fn->getMinRequiredArguments(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10677) +1d33f8d8a0d7e (Douglas Gregor 2011-05-05 00:13:13 +0000 10678) // With invalid overloaded operators, it's possible that we think we +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10679) // have an arity mismatch when in fact it looks like we have the +1d33f8d8a0d7e (Douglas Gregor 2011-05-05 00:13:13 +0000 10680) // right number of arguments, because only overloaded operators have +1d33f8d8a0d7e (Douglas Gregor 2011-05-05 00:13:13 +0000 10681) // the weird behavior of overloading member and non-member functions. +1d33f8d8a0d7e (Douglas Gregor 2011-05-05 00:13:13 +0000 10682) // Just don't report anything. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10683) if (Fn->isInvalidDecl() && +1d33f8d8a0d7e (Douglas Gregor 2011-05-05 00:13:13 +0000 10684) Fn->getDeclName().getNameKind() == DeclarationName::CXXOperatorName) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10685) return true; +8d33da6d58f34 (Larisse Voufo 2013-07-19 22:34:32 +0000 10686) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10687) if (NumArgs < MinParams) { +47c0845e0b388 (Larisse Voufo 2013-07-19 22:53:23 +0000 10688) assert((Cand->FailureKind == ovl_fail_too_few_arguments) || +47c0845e0b388 (Larisse Voufo 2013-07-19 22:53:23 +0000 10689) (Cand->FailureKind == ovl_fail_bad_deduction && +47c0845e0b388 (Larisse Voufo 2013-07-19 22:53:23 +0000 10690) Cand->DeductionFailure.Result == Sema::TDK_TooFewArguments)); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10691) } else { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10692) assert((Cand->FailureKind == ovl_fail_too_many_arguments) || +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10693) (Cand->FailureKind == ovl_fail_bad_deduction && +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10694) Cand->DeductionFailure.Result == Sema::TDK_TooManyArguments)); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10695) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10696) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10697) return false; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10698) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10699) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10700) /// General arity mismatch diagnosis over a candidate in a candidate set. +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10701) static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10702) unsigned NumFormalArgs) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10703) assert(isa(D) && +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10704) "The templated declaration should at least be a function" +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10705) " when diagnosing bad template argument deduction due to too many" +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10706) " or too few arguments"); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10707) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10708) FunctionDecl *Fn = cast(D); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 10709) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10710) // TODO: treat calls to a missing default constructor as a special case +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 10711) const auto *FnTy = Fn->getType()->castAs(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10712) unsigned MinParams = Fn->getMinRequiredArguments(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10713) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10714) // at least / at most / exactly +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10715) unsigned mode, modeCount; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10716) if (NumFormalArgs < MinParams) { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 10717) if (MinParams != FnTy->getNumParams() || FnTy->isVariadic() || +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 10718) FnTy->isTemplateVariadic()) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10719) mode = 0; // "at least" +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10720) else +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10721) mode = 2; // "exactly" +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10722) modeCount = MinParams; +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10723) } else { +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 10724) if (MinParams != FnTy->getNumParams()) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10725) mode = 1; // "at most" +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10726) else +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10727) mode = 2; // "exactly" +9cacbabd33eea (Alp Toker 2014-01-20 20:26:09 +0000 10728) modeCount = FnTy->getNumParams(); +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10729) } +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10730) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10731) std::string Description; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10732) std::pair FnKindPair = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 10733) ClassifyOverloadCandidate(S, Found, Fn, CRK_None, Description); +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 10734) +10ff50d7d8d61 (Richard Smith 2012-05-11 05:16:41 +0000 10735) if (modeCount == 1 && Fn->getParamDecl(0)->getDeclName()) +10ff50d7d8d61 (Richard Smith 2012-05-11 05:16:41 +0000 10736) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10737) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10738) << Description << mode << Fn->getParamDecl(0) << NumFormalArgs; +10ff50d7d8d61 (Richard Smith 2012-05-11 05:16:41 +0000 10739) else +10ff50d7d8d61 (Richard Smith 2012-05-11 05:16:41 +0000 10740) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10741) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10742) << Description << mode << modeCount << NumFormalArgs; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 10743) +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10744) MaybeEmitInheritedConstructorNote(S, Found); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10745) } +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 10746) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10747) /// Arity mismatch diagnosis specific to a function overload candidate. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10748) static void DiagnoseArityMismatch(Sema &S, OverloadCandidate *Cand, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10749) unsigned NumFormalArgs) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10750) if (!CheckArityMismatch(S, Cand, NumFormalArgs)) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10751) DiagnoseArityMismatch(S, Cand->FoundDecl, Cand->Function, NumFormalArgs); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10752) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10753) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10754) static TemplateDecl *getDescribedTemplate(Decl *Templated) { +7dcc97e7ac0a7 (Serge Pavlov 2016-04-19 06:19:52 +0000 10755) if (TemplateDecl *TD = Templated->getDescribedTemplate()) +7dcc97e7ac0a7 (Serge Pavlov 2016-04-19 06:19:52 +0000 10756) return TD; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10757) llvm_unreachable("Unsupported: Getting the described template declaration" +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10758) " for bad deduction diagnosis"); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10759) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10760) +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10761) /// Diagnose a failed template-argument deduction. +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10762) static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 10763) DeductionFailureInfo &DeductionFailure, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10764) unsigned NumArgs, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 10765) bool TakingCandidateAddress) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10766) TemplateParameter Param = DeductionFailure.getTemplateParameter(); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10767) NamedDecl *ParamD; +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10768) (ParamD = Param.dyn_cast()) || +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10769) (ParamD = Param.dyn_cast()) || +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10770) (ParamD = Param.dyn_cast()); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10771) switch (DeductionFailure.Result) { +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10772) case Sema::TDK_Success: +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10773) llvm_unreachable("TDK_success while diagnosing bad deduction"); +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10774) +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10775) case Sema::TDK_Incomplete: { +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10776) assert(ParamD && "no parameter found for incomplete deduction result"); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10777) S.Diag(Templated->getLocation(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10778) diag::note_ovl_candidate_incomplete_deduction) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10779) << ParamD->getDeclName(); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10780) MaybeEmitInheritedConstructorNote(S, Found); +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10781) return; +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10782) } +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 10783) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10784) case Sema::TDK_IncompletePack: { +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10785) assert(ParamD && "no parameter found for incomplete deduction result"); +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10786) S.Diag(Templated->getLocation(), +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10787) diag::note_ovl_candidate_incomplete_deduction_pack) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10788) << ParamD->getDeclName() +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10789) << (DeductionFailure.getFirstArg()->pack_size() + 1) +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10790) << *DeductionFailure.getFirstArg(); +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10791) MaybeEmitInheritedConstructorNote(S, Found); +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10792) return; +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10793) } +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 10794) +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10795) case Sema::TDK_Underqualified: { +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10796) assert(ParamD && "no parameter found for bad qualifiers deduction result"); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10797) TemplateTypeParmDecl *TParam = cast(ParamD); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10798) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10799) QualType Param = DeductionFailure.getFirstArg()->getAsType(); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10800) +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10801) // Param will have been canonicalized, but it should just be a +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10802) // qualified version of ParamD, so move the qualifiers to that. +717d9b0e2f2a8 (John McCall 2010-12-10 11:01:00 +0000 10803) QualifierCollector Qs; +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10804) Qs.strip(Param); +717d9b0e2f2a8 (John McCall 2010-12-10 11:01:00 +0000 10805) QualType NonCanonParam = Qs.apply(S.Context, TParam->getTypeForDecl()); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10806) assert(S.Context.hasSameType(Param, NonCanonParam)); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10807) +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10808) // Arg has also been canonicalized, but there's nothing we can do +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10809) // about that. It also doesn't matter as much, because it won't +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10810) // have any template parameters in it (because deduction isn't +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10811) // done on dependent types). +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10812) QualType Arg = DeductionFailure.getSecondArg()->getAsType(); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10813) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10814) S.Diag(Templated->getLocation(), diag::note_ovl_candidate_underqualified) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10815) << ParamD->getDeclName() << Arg << NonCanonParam; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10816) MaybeEmitInheritedConstructorNote(S, Found); +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10817) return; +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10818) } +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10819) +42d7d19710d09 (John McCall 2010-08-05 09:05:08 +0000 10820) case Sema::TDK_Inconsistent: { +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 10821) assert(ParamD && "no parameter found for inconsistent deduction result"); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10822) int which = 0; +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10823) if (isa(ParamD)) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10824) which = 0; +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10825) else if (isa(ParamD)) { +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10826) // Deduction might have failed because we deduced arguments of two +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10827) // different types for a non-type template parameter. +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10828) // FIXME: Use a different TDK value for this. +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10829) QualType T1 = +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10830) DeductionFailure.getFirstArg()->getNonTypeTemplateArgumentType(); +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10831) QualType T2 = +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10832) DeductionFailure.getSecondArg()->getNonTypeTemplateArgumentType(); +e54d9525ad594 (Richard Smith 2018-10-09 18:49:22 +0000 10833) if (!T1.isNull() && !T2.isNull() && !S.Context.hasSameType(T1, T2)) { +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10834) S.Diag(Templated->getLocation(), +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10835) diag::note_ovl_candidate_inconsistent_deduction_types) +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10836) << ParamD->getDeclName() << *DeductionFailure.getFirstArg() << T1 +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10837) << *DeductionFailure.getSecondArg() << T2; +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10838) MaybeEmitInheritedConstructorNote(S, Found); +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10839) return; +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10840) } +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10841) +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10842) which = 1; +593d6a168f457 (Richard Smith 2016-12-23 01:30:39 +0000 10843) } else { +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10844) which = 2; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10845) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10846) +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10847) // Tweak the diagnostic if the problem is that we deduced packs of +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10848) // different arities. We'll print the actual packs anyway in case that +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10849) // includes additional useful information. +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10850) if (DeductionFailure.getFirstArg()->getKind() == TemplateArgument::Pack && +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10851) DeductionFailure.getSecondArg()->getKind() == TemplateArgument::Pack && +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10852) DeductionFailure.getFirstArg()->pack_size() != +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10853) DeductionFailure.getSecondArg()->pack_size()) { +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10854) which = 3; +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10855) } +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10856) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10857) S.Diag(Templated->getLocation(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10858) diag::note_ovl_candidate_inconsistent_deduction) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10859) << which << ParamD->getDeclName() << *DeductionFailure.getFirstArg() +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10860) << *DeductionFailure.getSecondArg(); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10861) MaybeEmitInheritedConstructorNote(S, Found); +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10862) return; +3626a5cac2edf (Douglas Gregor 2010-05-08 17:41:32 +0000 10863) } +02eb4835ce7da (Douglas Gregor 2010-05-08 18:13:28 +0000 10864) +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10865) case Sema::TDK_InvalidExplicitArguments: +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10866) assert(ParamD && "no parameter found for invalid explicit arguments"); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10867) if (ParamD->getDeclName()) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10868) S.Diag(Templated->getLocation(), +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10869) diag::note_ovl_candidate_explicit_arg_mismatch_named) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10870) << ParamD->getDeclName(); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10871) else { +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10872) int index = 0; +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10873) if (TemplateTypeParmDecl *TTP = dyn_cast(ParamD)) +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10874) index = TTP->getIndex(); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10875) else if (NonTypeTemplateParmDecl *NTTP +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10876) = dyn_cast(ParamD)) +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10877) index = NTTP->getIndex(); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10878) else +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10879) index = cast(ParamD)->getIndex(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10880) S.Diag(Templated->getLocation(), +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10881) diag::note_ovl_candidate_explicit_arg_mismatch_unnamed) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10882) << (index + 1); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10883) } +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10884) MaybeEmitInheritedConstructorNote(S, Found); +1d72edd7c55a8 (Douglas Gregor 2010-05-08 19:15:54 +0000 10885) return; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10886) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10887) case Sema::TDK_ConstraintsNotSatisfied: { +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10888) // Format the template argument list into the argument string. +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10889) SmallString<128> TemplateArgString; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10890) TemplateArgumentList *Args = DeductionFailure.getTemplateArgumentList(); +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10891) TemplateArgString = " "; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10892) TemplateArgString += S.getTemplateArgumentBindingsText( +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10893) getDescribedTemplate(Templated)->getTemplateParameters(), *Args); +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10894) if (TemplateArgString.size() == 1) +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10895) TemplateArgString.clear(); +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10896) S.Diag(Templated->getLocation(), +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10897) diag::note_ovl_candidate_unsatisfied_constraints) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10898) << TemplateArgString; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10899) +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10900) S.DiagnoseUnsatisfiedConstraint( +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10901) static_cast(DeductionFailure.Data)->Satisfaction); +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10902) return; +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 10903) } +02eb4835ce7da (Douglas Gregor 2010-05-08 18:13:28 +0000 10904) case Sema::TDK_TooManyArguments: +02eb4835ce7da (Douglas Gregor 2010-05-08 18:13:28 +0000 10905) case Sema::TDK_TooFewArguments: +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 10906) DiagnoseArityMismatch(S, Found, Templated, NumArgs); +02eb4835ce7da (Douglas Gregor 2010-05-08 18:13:28 +0000 10907) return; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10908) +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10909) case Sema::TDK_InstantiationDepth: +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10910) S.Diag(Templated->getLocation(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10911) diag::note_ovl_candidate_instantiation_depth); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10912) MaybeEmitInheritedConstructorNote(S, Found); +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10913) return; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10914) +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10915) case Sema::TDK_SubstitutionFailure: { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10916) // Format the template argument list into the argument string. +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 10917) SmallString<128> TemplateArgString; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10918) if (TemplateArgumentList *Args = +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10919) DeductionFailure.getTemplateArgumentList()) { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10920) TemplateArgString = " "; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10921) TemplateArgString += S.getTemplateArgumentBindingsText( +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10922) getDescribedTemplate(Templated)->getTemplateParameters(), *Args); +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10923) if (TemplateArgString.size() == 1) +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10924) TemplateArgString.clear(); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10925) } +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10926) +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10927) // If this candidate was disabled by enable_if, say so. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10928) PartialDiagnosticAt *PDiag = DeductionFailure.getSFINAEDiagnostic(); +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10929) if (PDiag && PDiag->second.getDiagID() == +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10930) diag::err_typename_nested_not_found_enable_if) { +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10931) // FIXME: Use the source range of the condition, and the fully-qualified +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10932) // name of the enable_if template. These are both present in PDiag. +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10933) S.Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if) +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10934) << "'enable_if'" << TemplateArgString; +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10935) return; +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10936) } +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10937) +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10938) // We found a specific requirement that disabled the enable_if. +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10939) if (PDiag && PDiag->second.getDiagID() == +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10940) diag::err_typename_nested_not_found_requirement) { +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10941) S.Diag(Templated->getLocation(), +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10942) diag::note_ovl_candidate_disabled_by_requirement) +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10943) << PDiag->second.getStringArg(0) << TemplateArgString; +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10944) return; +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10945) } +00fa10b43f25d (Douglas Gregor 2017-07-05 20:20:14 +0000 10946) +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10947) // Format the SFINAE diagnostic into the argument string. +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10948) // FIXME: Add a general mechanism to include a PartialDiagnostic *'s +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10949) // formatted message in another diagnostic. +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 10950) SmallString<128> SFINAEArgString; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10951) SourceRange R; +6f8d2c6c9c345 (Richard Smith 2012-05-09 05:17:00 +0000 10952) if (PDiag) { +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10953) SFINAEArgString = ": "; +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10954) R = SourceRange(PDiag->first, PDiag->first); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10955) PDiag->second.EmitToString(S.getDiagnostics(), SFINAEArgString); +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10956) } +9ca6461f5a9ac (Richard Smith 2012-05-07 09:03:25 +0000 10957) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10958) S.Diag(Templated->getLocation(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10959) diag::note_ovl_candidate_substitution_failure) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10960) << TemplateArgString << SFINAEArgString << R; +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 10961) MaybeEmitInheritedConstructorNote(S, Found); +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10962) return; +d09efd43d3f84 (Douglas Gregor 2010-05-08 20:07:26 +0000 10963) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 10964) +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 10965) case Sema::TDK_DeducedMismatch: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 10966) case Sema::TDK_DeducedMismatchNested: { +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10967) // Format the template argument list into the argument string. +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10968) SmallString<128> TemplateArgString; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10969) if (TemplateArgumentList *Args = +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10970) DeductionFailure.getTemplateArgumentList()) { +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10971) TemplateArgString = " "; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10972) TemplateArgString += S.getTemplateArgumentBindingsText( +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10973) getDescribedTemplate(Templated)->getTemplateParameters(), *Args); +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10974) if (TemplateArgString.size() == 1) +907cefe721437 (Richard Smith 2020-01-06 17:16:29 -0800 10975) TemplateArgString.clear(); +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10976) } +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10977) +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10978) S.Diag(Templated->getLocation(), diag::note_ovl_candidate_deduced_mismatch) +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10979) << (*DeductionFailure.getCallArgIndex() + 1) +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10980) << *DeductionFailure.getFirstArg() << *DeductionFailure.getSecondArg() +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 10981) << TemplateArgString +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 10982) << (DeductionFailure.Result == Sema::TDK_DeducedMismatchNested); +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10983) break; +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10984) } +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 10985) +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10986) case Sema::TDK_NonDeducedMismatch: { +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 10987) // FIXME: Provide a source location to indicate what we couldn't match. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10988) TemplateArgument FirstTA = *DeductionFailure.getFirstArg(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 10989) TemplateArgument SecondTA = *DeductionFailure.getSecondArg(); +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10990) if (FirstTA.getKind() == TemplateArgument::Template && +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10991) SecondTA.getKind() == TemplateArgument::Template) { +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10992) TemplateName FirstTN = FirstTA.getAsTemplate(); +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10993) TemplateName SecondTN = SecondTA.getAsTemplate(); +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10994) if (FirstTN.getKind() == TemplateName::Template && +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10995) SecondTN.getKind() == TemplateName::Template) { +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10996) if (FirstTN.getAsTemplateDecl()->getName() == +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10997) SecondTN.getAsTemplateDecl()->getName()) { +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10998) // FIXME: This fixes a bad diagnostic where both templates are named +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 10999) // the same. This particular case is a bit difficult since: +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11000) // 1) It is passed as a string to the diagnostic printer. +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11001) // 2) The diagnostic printer only attempts to find a better +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11002) // name for types, not decls. +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11003) // Ideally, this should folded into the diagnostic printer. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11004) S.Diag(Templated->getLocation(), +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11005) diag::note_ovl_candidate_non_deduced_mismatch_qualified) +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11006) << FirstTN.getAsTemplateDecl() << SecondTN.getAsTemplateDecl(); +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11007) return; +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11008) } +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11009) } +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11010) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11011) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11012) if (TakingCandidateAddress && isa(Templated) && +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11013) !checkAddressOfCandidateIsAvailable(S, cast(Templated))) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11014) return; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11015) +2b391ab7086b8 (Faisal Vali 2013-09-26 19:54:12 +0000 11016) // FIXME: For generic lambda parameters, check if the function is a lambda +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11017) // call operator, and if so, emit a prettier and more informative +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11018) // diagnostic that mentions 'auto' and lambda in addition to +2b391ab7086b8 (Faisal Vali 2013-09-26 19:54:12 +0000 11019) // (or instead of?) the canonical template type parameters. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11020) S.Diag(Templated->getLocation(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11021) diag::note_ovl_candidate_non_deduced_mismatch) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11022) << FirstTA << SecondTA; +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 11023) return; +e373235c7cf8e (Richard Trieu 2013-04-08 21:11:40 +0000 11024) } +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11025) // TODO: diagnose these individually, then kill off +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11026) // note_ovl_candidate_bad_deduction, which is uselessly vague. +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 11027) case Sema::TDK_MiscellaneousDeductionFailure: +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11028) S.Diag(Templated->getLocation(), diag::note_ovl_candidate_bad_deduction); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 11029) MaybeEmitInheritedConstructorNote(S, Found); +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11030) return; +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 11031) case Sema::TDK_CUDATargetMismatch: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 11032) S.Diag(Templated->getLocation(), +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 11033) diag::note_cuda_ovl_candidate_target_mismatch); +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 11034) return; +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11035) } +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11036) } +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11037) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11038) /// Diagnose a failed template-argument deduction, for function calls. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11039) static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11040) unsigned NumArgs, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11041) bool TakingCandidateAddress) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11042) unsigned TDK = Cand->DeductionFailure.Result; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11043) if (TDK == Sema::TDK_TooFewArguments || TDK == Sema::TDK_TooManyArguments) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11044) if (CheckArityMismatch(S, Cand, NumArgs)) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11045) return; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11046) } +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11047) DiagnoseBadDeduction(S, Cand->FoundDecl, Cand->Function, // pattern +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11048) Cand->DeductionFailure, NumArgs, TakingCandidateAddress); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11049) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11050) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11051) /// CUDA: diagnose an invalid call across targets. +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11052) static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) { +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11053) FunctionDecl *Caller = cast(S.CurContext); +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11054) FunctionDecl *Callee = Cand->Function; +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11055) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11056) Sema::CUDAFunctionTarget CallerTarget = S.IdentifyCUDATarget(Caller), +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11057) CalleeTarget = S.IdentifyCUDATarget(Callee); +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11058) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11059) std::string FnDesc; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11060) std::pair FnKindPair = +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11061) ClassifyOverloadCandidate(S, Cand->FoundDecl, Callee, +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11062) Cand->getRewriteKind(), FnDesc); +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11063) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11064) S.Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11065) << (unsigned)FnKindPair.first << (unsigned)ocs_non_template +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11066) << FnDesc /* Ignored */ +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11067) << CalleeTarget << CallerTarget; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11068) +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11069) // This could be an implicit constructor for which we could not infer the +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11070) // target due to a collsion. Diagnose that case. +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11071) CXXMethodDecl *Meth = dyn_cast(Callee); +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11072) if (Meth != nullptr && Meth->isImplicit()) { +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11073) CXXRecordDecl *ParentClass = Meth->getParent(); +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11074) Sema::CXXSpecialMember CSM; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11075) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11076) switch (FnKindPair.first) { +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11077) default: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11078) return; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11079) case oc_implicit_default_constructor: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11080) CSM = Sema::CXXDefaultConstructor; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11081) break; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11082) case oc_implicit_copy_constructor: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11083) CSM = Sema::CXXCopyConstructor; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11084) break; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11085) case oc_implicit_move_constructor: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11086) CSM = Sema::CXXMoveConstructor; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11087) break; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11088) case oc_implicit_copy_assignment: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11089) CSM = Sema::CXXCopyAssignment; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11090) break; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11091) case oc_implicit_move_assignment: +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11092) CSM = Sema::CXXMoveAssignment; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11093) break; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11094) }; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11095) +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11096) bool ConstRHS = false; +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11097) if (Meth->getNumParams()) { +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11098) if (const ReferenceType *RT = +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11099) Meth->getParamDecl(0)->getType()->getAs()) { +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11100) ConstRHS = RT->getPointeeType().isConstQualified(); +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11101) } +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11102) } +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11103) +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11104) S.inferCUDATargetForImplicitSpecialMember(ParentClass, CSM, Meth, +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11105) /* ConstRHS */ ConstRHS, +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11106) /* Diagnose */ true); +9a220fca4a6f0 (Eli Bendersky 2014-09-29 20:38:29 +0000 11107) } +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11108) } +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11109) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11110) static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11111) FunctionDecl *Callee = Cand->Function; +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11112) EnableIfAttr *Attr = static_cast(Cand->DeductionFailure.Data); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11113) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11114) S.Diag(Callee->getLocation(), +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11115) diag::note_ovl_candidate_disabled_by_function_cond_attr) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11116) << Attr->getCond()->getSourceRange() << Attr->getMessage(); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11117) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11118) +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11119) static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11120) ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Cand->Function); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11121) assert(ES.isExplicit() && "not an explicit candidate"); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11122) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11123) unsigned Kind; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11124) switch (Cand->Function->getDeclKind()) { +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11125) case Decl::Kind::CXXConstructor: +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11126) Kind = 0; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11127) break; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11128) case Decl::Kind::CXXConversion: +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11129) Kind = 1; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11130) break; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11131) case Decl::Kind::CXXDeductionGuide: +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11132) Kind = Cand->Function->isImplicit() ? 0 : 2; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11133) break; +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11134) default: +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11135) llvm_unreachable("invalid Decl"); +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11136) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11137) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11138) // Note the location of the first (in-class) declaration; a redeclaration +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11139) // (particularly an out-of-class definition) will typically lack the +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11140) // 'explicit' specifier. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11141) // FIXME: This is probably a good thing to do for all 'candidate' notes. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11142) FunctionDecl *First = Cand->Function->getFirstDecl(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11143) if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern()) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11144) First = Pattern->getFirstDecl(); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11145) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11146) S.Diag(First->getLocation(), +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11147) diag::note_ovl_candidate_explicit) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11148) << Kind << (ES.getExpr() ? 1 : 0) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11149) << (ES.getExpr() ? ES.getExpr()->getSourceRange() : SourceRange()); +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11150) } +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11151) +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11152) /// Generates a 'note' diagnostic for an overload candidate. We've +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11153) /// already generated a primary error at the call site. +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11154) /// +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11155) /// It really does need to be a single diagnostic with its caret +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11156) /// pointed at the candidate declaration. Yes, this creates some +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11157) /// major challenges of technical writing. Yes, this makes pointing +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11158) /// out problems with specific arguments quite awkward. It's still +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11159) /// better than generating twenty screens of text for every failed +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11160) /// overload. +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11161) /// +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11162) /// It would be great to be able to express per-candidate problems +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11163) /// more richly for those diagnostic clients that cared, but we'd +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11164) /// still have to be just as careful with the default diagnostics. +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11165) /// \param CtorDestAS Addr space of object being constructed (for ctor +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11166) /// candidates only). +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11167) static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11168) unsigned NumArgs, +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11169) bool TakingCandidateAddress, +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11170) LangAS CtorDestAS = LangAS::Default) { +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 11171) FunctionDecl *Fn = Cand->Function; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 11172) if (shouldSkipNotingLambdaConversionDecl(Fn)) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 11173) return; +53262c96d9a90 (John McCall 2010-01-12 02:15:36 +0000 11174) +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11175) // Note deleted candidates, but only if they're viable. +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11176) if (Cand->Viable) { +13ee62f7d7eed (Erik Pilkington 2019-03-20 19:26:33 +0000 11177) if (Fn->isDeleted()) { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11178) std::string FnDesc; +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11179) std::pair FnKindPair = +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11180) ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11181) Cand->getRewriteKind(), FnDesc); +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11182) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11183) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11184) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second << FnDesc +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 11185) << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11186) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11187) return; +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11188) } +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 11189) +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 11190) // We don't really have anything else to say about viable candidates. +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11191) S.NoteOverloadCandidate(Cand->FoundDecl, Fn, Cand->getRewriteKind()); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11192) return; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11193) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11194) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11195) switch (Cand->FailureKind) { +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11196) case ovl_fail_too_many_arguments: +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11197) case ovl_fail_too_few_arguments: +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11198) return DiagnoseArityMismatch(S, Cand, NumArgs); +e1ac8d1742209 (John McCall 2010-01-13 00:25:19 +0000 11199) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11200) case ovl_fail_bad_deduction: +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11201) return DiagnoseBadDeduction(S, Cand, NumArgs, +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11202) TakingCandidateAddress); +8b9ed55bfbea0 (John McCall 2010-02-01 18:53:26 +0000 11203) +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11204) case ovl_fail_illegal_constructor: { +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11205) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor) +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11206) << (Fn->getPrimaryTemplate() ? 1 : 0); +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 11207) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11208) return; +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11209) } +578a1f8c6d275 (John McCall 2014-12-14 01:46:53 +0000 11210) +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11211) case ovl_fail_object_addrspace_mismatch: { +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11212) Qualifiers QualsForPrinting; +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11213) QualsForPrinting.setAddressSpace(CtorDestAS); +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11214) S.Diag(Fn->getLocation(), +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11215) diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch) +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11216) << QualsForPrinting; +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11217) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11218) return; +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11219) } +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11220) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11221) case ovl_fail_trivial_conversion: +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11222) case ovl_fail_bad_final_conversion: +2c326bce387c8 (Douglas Gregor 2010-04-12 23:42:09 +0000 11223) case ovl_fail_final_conversion_not_exact: +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11224) return S.NoteOverloadCandidate(Cand->FoundDecl, Fn, Cand->getRewriteKind()); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11225) +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 11226) case ovl_fail_bad_conversion: { +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 11227) unsigned I = (Cand->IgnoreObjectArgument ? 1 : 0); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11228) for (unsigned N = Cand->Conversions.size(); I != N; ++I) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11229) if (Cand->Conversions[I].isBad()) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11230) return DiagnoseBadConversion(S, Cand, I, TakingCandidateAddress); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 11231) +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11232) // FIXME: this currently happens when we're called from SemaInit +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11233) // when user-conversion overload fails. Figure out how to handle +6a61b5203dc68 (John McCall 2010-01-13 09:16:55 +0000 11234) // those conditions and diagnose them well. +56b5eab12970e (Richard Smith 2019-11-09 05:52:18 -0800 11235) return S.NoteOverloadCandidate(Cand->FoundDecl, Fn, Cand->getRewriteKind()); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11236) } +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11237) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11238) case ovl_fail_bad_target: +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 11239) return DiagnoseBadTarget(S, Cand); +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11240) +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11241) case ovl_fail_enable_if: +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 11242) return DiagnoseFailedEnableIfAttr(S, Cand); +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11243) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11244) case ovl_fail_explicit: +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11245) return DiagnoseFailedExplicitSpec(S, Cand); +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 11246) +f9c59b71220ce (Richard Smith 2017-01-08 21:45:44 +0000 11247) case ovl_fail_inhctor_slice: +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11248) // It's generally not interesting to note copy/move constructors here. +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11249) if (cast(Fn)->isCopyOrMoveConstructor()) +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11250) return; +f9c59b71220ce (Richard Smith 2017-01-08 21:45:44 +0000 11251) S.Diag(Fn->getLocation(), +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11252) diag::note_ovl_candidate_inherited_constructor_slice) +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11253) << (Fn->getPrimaryTemplate() ? 1 : 0) +836a3b416d222 (Richard Smith 2017-01-13 20:46:54 +0000 11254) << Fn->getParamDecl(0)->getType()->isRValueReferenceType(); +f9c59b71220ce (Richard Smith 2017-01-08 21:45:44 +0000 11255) MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl); +f9c59b71220ce (Richard Smith 2017-01-08 21:45:44 +0000 11256) return; +f9c59b71220ce (Richard Smith 2017-01-08 21:45:44 +0000 11257) +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11258) case ovl_fail_addr_not_available: { +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11259) bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function); +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11260) (void)Available; +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11261) assert(!Available); +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11262) break; +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 11263) } +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 11264) case ovl_non_default_multiversion_function: +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 11265) // Do nothing, these should simply be ignored. +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 11266) break; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11267) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11268) case ovl_fail_constraints_not_satisfied: { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11269) std::string FnDesc; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11270) std::pair FnKindPair = +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11271) ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11272) Cand->getRewriteKind(), FnDesc); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11273) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11274) S.Diag(Fn->getLocation(), +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11275) diag::note_ovl_candidate_constraints_not_satisfied) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11276) << (unsigned)FnKindPair.first << (unsigned)ocs_non_template +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11277) << FnDesc /* Ignored */; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11278) ConstraintSatisfaction Satisfaction; +713562f54858f (Saar Raz 2020-01-25 22:54:27 +0200 11279) if (S.CheckFunctionConstraints(Fn, Satisfaction)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11280) break; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11281) S.DiagnoseUnsatisfiedConstraint(Satisfaction); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11282) } +65eb879d22cc9 (John McCall 2010-02-25 01:37:24 +0000 11283) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11284) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11285) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11286) static void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand) { +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 11287) if (shouldSkipNotingLambdaConversionDecl(Cand->Surrogate)) +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 11288) return; +6976fef05b7e5 (Erich Keane 2020-11-16 15:26:22 -0800 11289) +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11290) // Desugar the type of the surrogate down to a function type, +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11291) // retaining as many typedefs as possible while still showing +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11292) // the function type (and, therefore, its parameter types). +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11293) QualType FnType = Cand->Surrogate->getConversionType(); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11294) bool isLValueReference = false; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11295) bool isRValueReference = false; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11296) bool isPointer = false; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11297) if (const LValueReferenceType *FnTypeRef = +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11298) FnType->getAs()) { +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11299) FnType = FnTypeRef->getPointeeType(); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11300) isLValueReference = true; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11301) } else if (const RValueReferenceType *FnTypeRef = +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11302) FnType->getAs()) { +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11303) FnType = FnTypeRef->getPointeeType(); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11304) isRValueReference = true; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11305) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11306) if (const PointerType *FnTypePtr = FnType->getAs()) { +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11307) FnType = FnTypePtr->getPointeeType(); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11308) isPointer = true; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11309) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11310) // Desugar down to a function type. +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11311) FnType = QualType(FnType->getAs(), 0); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11312) // Reconstruct the pointer/reference as appropriate. +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11313) if (isPointer) FnType = S.Context.getPointerType(FnType); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11314) if (isRValueReference) FnType = S.Context.getRValueReferenceType(FnType); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11315) if (isLValueReference) FnType = S.Context.getLValueReferenceType(FnType); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11316) +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11317) S.Diag(Cand->Surrogate->getLocation(), diag::note_ovl_surrogate_cand) +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11318) << FnType; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11319) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11320) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11321) static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11322) SourceLocation OpLoc, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11323) OverloadCandidate *Cand) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11324) assert(Cand->Conversions.size() <= 2 && "builtin operator is not binary"); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11325) std::string TypeStr("operator"); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11326) TypeStr += Opc; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11327) TypeStr += "("; +5f6ab9a8bf307 (George Burgess IV 2017-06-08 20:55:21 +0000 11328) TypeStr += Cand->BuiltinParamTypes[0].getAsString(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11329) if (Cand->Conversions.size() == 1) { +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11330) TypeStr += ")"; +783fc95f3eedf (Sven van Haastregt 2019-09-09 14:39:20 +0000 11331) S.Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11332) } else { +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11333) TypeStr += ", "; +5f6ab9a8bf307 (George Burgess IV 2017-06-08 20:55:21 +0000 11334) TypeStr += Cand->BuiltinParamTypes[1].getAsString(); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11335) TypeStr += ")"; +783fc95f3eedf (Sven van Haastregt 2019-09-09 14:39:20 +0000 11336) S.Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11337) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11338) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11339) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11340) static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11341) OverloadCandidate *Cand) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11342) for (const ImplicitConversionSequence &ICS : Cand->Conversions) { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11343) if (ICS.isBad()) break; // all meaningless after first invalid +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11344) if (!ICS.isAmbiguous()) continue; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11345) +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11346) ICS.DiagnoseAmbiguousConversion( +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11347) S, OpLoc, S.PDiag(diag::note_ambiguous_type_conversion)); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11348) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11349) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11350) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11351) static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand) { +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11352) if (Cand->Function) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11353) return Cand->Function->getLocation(); +982adb518c34b (John McCall 2010-01-16 03:50:16 +0000 11354) if (Cand->IsSurrogate) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11355) return Cand->Surrogate->getLocation(); +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11356) return SourceLocation(); +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11357) } +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11358) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11359) static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI) { +73fddfe1b0d51 (Chandler Carruth 2011-09-10 00:51:24 +0000 11360) switch ((Sema::TemplateDeductionResult)DFI.Result) { +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11361) case Sema::TDK_Success: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11362) case Sema::TDK_NonDependentConversionFailure: +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11363) llvm_unreachable("non-deduction failure while diagnosing bad deduction"); +8a8051f2cdfcc (Benjamin Kramer 2011-09-10 21:52:04 +0000 11364) +c5c01a60c2e3f (Douglas Gregor 2012-09-13 21:01:57 +0000 11365) case Sema::TDK_Invalid: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11366) case Sema::TDK_Incomplete: +4a8f3518cb144 (Richard Smith 2018-07-19 19:00:37 +0000 11367) case Sema::TDK_IncompletePack: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11368) return 1; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11369) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11370) case Sema::TDK_Underqualified: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11371) case Sema::TDK_Inconsistent: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11372) return 2; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11373) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11374) case Sema::TDK_SubstitutionFailure: +9b534547250a3 (Richard Smith 2015-12-31 02:02:54 +0000 11375) case Sema::TDK_DeducedMismatch: +fdf80e86a5284 (Saar Raz 2019-12-06 01:30:21 +0200 11376) case Sema::TDK_ConstraintsNotSatisfied: +c92d206ce4419 (Richard Smith 2017-01-05 23:02:44 +0000 11377) case Sema::TDK_DeducedMismatchNested: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11378) case Sema::TDK_NonDeducedMismatch: +44ecdbdc6134c (Richard Smith 2013-01-31 05:19:49 +0000 11379) case Sema::TDK_MiscellaneousDeductionFailure: +13e9b4d76851d (Artem Belevich 2016-12-07 19:27:16 +0000 11380) case Sema::TDK_CUDATargetMismatch: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11381) return 3; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11382) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11383) case Sema::TDK_InstantiationDepth: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11384) return 4; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11385) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11386) case Sema::TDK_InvalidExplicitArguments: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11387) return 5; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11388) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11389) case Sema::TDK_TooManyArguments: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11390) case Sema::TDK_TooFewArguments: +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11391) return 6; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11392) } +8a8051f2cdfcc (Benjamin Kramer 2011-09-10 21:52:04 +0000 11393) llvm_unreachable("Unhandled deduction result"); +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11394) } +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11395) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11396) namespace { +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11397) struct CompareOverloadCandidatesForDisplay { +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11398) Sema &S; +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 11399) SourceLocation Loc; +b96b3be8996bb (Kaelyn Takata 2014-05-01 21:15:24 +0000 11400) size_t NumArgs; +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11401) OverloadCandidateSet::CandidateSetKind CSK; +b96b3be8996bb (Kaelyn Takata 2014-05-01 21:15:24 +0000 11402) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11403) CompareOverloadCandidatesForDisplay( +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11404) Sema &S, SourceLocation Loc, size_t NArgs, +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11405) OverloadCandidateSet::CandidateSetKind CSK) +fd54435b95922 (Richard Smith 2017-09-26 21:33:43 +0000 11406) : S(S), NumArgs(NArgs), CSK(CSK) {} +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11407) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11408) OverloadFailureKind EffectiveFailureKind(const OverloadCandidate *C) const { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11409) // If there are too many or too few arguments, that's the high-order bit we +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11410) // want to sort by, even if the immediate failure kind was something else. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11411) if (C->FailureKind == ovl_fail_too_many_arguments || +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11412) C->FailureKind == ovl_fail_too_few_arguments) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11413) return static_cast(C->FailureKind); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11414) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11415) if (C->Function) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11416) if (NumArgs > C->Function->getNumParams() && !C->Function->isVariadic()) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11417) return ovl_fail_too_many_arguments; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11418) if (NumArgs < C->Function->getMinRequiredArguments()) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11419) return ovl_fail_too_few_arguments; +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11420) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11421) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11422) return static_cast(C->FailureKind); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11423) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11424) +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11425) bool operator()(const OverloadCandidate *L, +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11426) const OverloadCandidate *R) { +982adb518c34b (John McCall 2010-01-16 03:50:16 +0000 11427) // Fast-path this check. +982adb518c34b (John McCall 2010-01-16 03:50:16 +0000 11428) if (L == R) return false; +982adb518c34b (John McCall 2010-01-16 03:50:16 +0000 11429) +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11430) // Order first by viability. +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11431) if (L->Viable) { +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11432) if (!R->Viable) return true; +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11433) +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11434) // TODO: introduce a tri-valued comparison for overload +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11435) // candidates. Would be more worthwhile if we had a sort +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11436) // that could exploit it. +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11437) if (isBetterOverloadCandidate(S, *L, *R, SourceLocation(), CSK)) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11438) return true; +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11439) if (isBetterOverloadCandidate(S, *R, *L, SourceLocation(), CSK)) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 11440) return false; +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11441) } else if (R->Viable) +ad2587a394059 (John McCall 2010-01-12 00:48:53 +0000 11442) return false; +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11443) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11444) assert(L->Viable == R->Viable); +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11445) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11446) // Criteria by which we can sort non-viable candidates: +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11447) if (!L->Viable) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11448) OverloadFailureKind LFailureKind = EffectiveFailureKind(L); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11449) OverloadFailureKind RFailureKind = EffectiveFailureKind(R); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11450) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11451) // 1. Arity mismatches come after other candidates. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11452) if (LFailureKind == ovl_fail_too_many_arguments || +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11453) LFailureKind == ovl_fail_too_few_arguments) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11454) if (RFailureKind == ovl_fail_too_many_arguments || +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11455) RFailureKind == ovl_fail_too_few_arguments) { +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11456) int LDist = std::abs((int)L->getNumParams() - (int)NumArgs); +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11457) int RDist = std::abs((int)R->getNumParams() - (int)NumArgs); +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11458) if (LDist == RDist) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11459) if (LFailureKind == RFailureKind) +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11460) // Sort non-surrogates before surrogates. +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11461) return !L->IsSurrogate && R->IsSurrogate; +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11462) // Sort candidates requiring fewer parameters than there were +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11463) // arguments given after candidates requiring more parameters +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11464) // than there were arguments given. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11465) return LFailureKind == ovl_fail_too_many_arguments; +50c4ffcca78e0 (Kaelyn Takata 2014-05-07 00:43:38 +0000 11466) } +b96b3be8996bb (Kaelyn Takata 2014-05-01 21:15:24 +0000 11467) return LDist < RDist; +b96b3be8996bb (Kaelyn Takata 2014-05-01 21:15:24 +0000 11468) } +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11469) return false; +b96b3be8996bb (Kaelyn Takata 2014-05-01 21:15:24 +0000 11470) } +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11471) if (RFailureKind == ovl_fail_too_many_arguments || +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11472) RFailureKind == ovl_fail_too_few_arguments) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11473) return true; +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11474) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11475) // 2. Bad conversions come first and are ordered by the number +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11476) // of bad conversions and quality of good conversions. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11477) if (LFailureKind == ovl_fail_bad_conversion) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11478) if (RFailureKind != ovl_fail_bad_conversion) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11479) return true; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11480) +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11481) // The conversion that can be fixed with a smaller number of changes, +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11482) // comes first. +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11483) unsigned numLFixes = L->Fix.NumConversionsFixed; +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11484) unsigned numRFixes = R->Fix.NumConversionsFixed; +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11485) numLFixes = (numLFixes == 0) ? UINT_MAX : numLFixes; +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11486) numRFixes = (numRFixes == 0) ? UINT_MAX : numRFixes; +9ccf84e35dcf4 (Anna Zaks 2011-07-21 00:34:39 +0000 11487) if (numLFixes != numRFixes) { +7a3cbb299772b (David Blaikie 2015-03-09 02:02:07 +0000 11488) return numLFixes < numRFixes; +9ccf84e35dcf4 (Anna Zaks 2011-07-21 00:34:39 +0000 11489) } +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11490) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11491) // If there's any ordering between the defined conversions... +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11492) // FIXME: this might not be transitive. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11493) assert(L->Conversions.size() == R->Conversions.size()); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11494) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11495) int leftBetter = 0; +21b57fa4e5f1b (John McCall 2010-02-25 10:46:05 +0000 11496) unsigned I = (L->IgnoreObjectArgument || R->IgnoreObjectArgument); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11497) for (unsigned E = L->Conversions.size(); I != E; ++I) { +0f59cb38e7f31 (Richard Smith 2015-12-18 21:45:41 +0000 11498) switch (CompareImplicitConversionSequences(S, Loc, +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11499) L->Conversions[I], +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11500) R->Conversions[I])) { +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11501) case ImplicitConversionSequence::Better: +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11502) leftBetter++; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11503) break; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11504) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11505) case ImplicitConversionSequence::Worse: +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11506) leftBetter--; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11507) break; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11508) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11509) case ImplicitConversionSequence::Indistinguishable: +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11510) break; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11511) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11512) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11513) if (leftBetter > 0) return true; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11514) if (leftBetter < 0) return false; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11515) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11516) } else if (RFailureKind == ovl_fail_bad_conversion) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11517) return false; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11518) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11519) if (LFailureKind == ovl_fail_bad_deduction) { +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11520) if (RFailureKind != ovl_fail_bad_deduction) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11521) return true; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11522) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11523) if (L->DeductionFailure.Result != R->DeductionFailure.Result) +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11524) return RankDeductionFailure(L->DeductionFailure) +1e7a0c6a1d4f5 (Eli Friedman 2011-10-14 23:10:30 +0000 11525) < RankDeductionFailure(R->DeductionFailure); +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11526) } else if (RFailureKind == ovl_fail_bad_deduction) +e2c600cf4342a (Eli Friedman 2011-10-14 21:52:24 +0000 11527) return false; +45e9370a24f15 (Kaelyn Uhrain 2011-09-09 21:58:49 +0000 11528) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11529) // TODO: others? +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11530) } +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11531) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11532) // Sort everything else by location. +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11533) SourceLocation LLoc = GetLocationForCandidate(L); +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11534) SourceLocation RLoc = GetLocationForCandidate(R); +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11535) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11536) // Put candidates without locations (e.g. builtins) at the end. +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11537) if (LLoc.isInvalid()) return false; +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11538) if (RLoc.isInvalid()) return true; +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11539) +3712d9e391523 (John McCall 2010-01-15 23:32:50 +0000 11540) return S.SourceMgr.isBeforeInTranslationUnit(LLoc, RLoc); +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11541) } +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11542) }; +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 11543) } +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11544) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11545) /// CompleteNonViableCandidate - Normally, overload resolution only +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11546) /// computes up to the first bad conversion. Produces the FixIt set if +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11547) /// possible. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11548) static void +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11549) CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11550) ArrayRef Args, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11551) OverloadCandidateSet::CandidateSetKind CSK) { +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11552) assert(!Cand->Viable); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11553) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11554) // Don't do anything on failures other than bad conversion. +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11555) if (Cand->FailureKind != ovl_fail_bad_conversion) +25195541349b1 (Richard Smith 2020-01-09 12:27:48 -0800 11556) return; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11557) +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11558) // We only want the FixIts if all the arguments can be corrected. +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11559) bool Unfixable = false; +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 11560) // Use a implicit copy initialization to check conversion fixes. +1b06812f466f1 (Anna Zaks 2011-07-28 19:46:48 +0000 11561) Cand->Fix.setConversionChecker(TryCopyInitialization); +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11562) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11563) // Attempt to fix the bad conversion. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11564) unsigned ConvCount = Cand->Conversions.size(); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11565) for (unsigned ConvIdx = (Cand->IgnoreObjectArgument ? 1 : 0); /**/; +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11566) ++ConvIdx) { +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11567) assert(ConvIdx != ConvCount && "no bad conversion in candidate"); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11568) if (Cand->Conversions[ConvIdx].isInitialized() && +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11569) Cand->Conversions[ConvIdx].isBad()) { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11570) Unfixable = !Cand->TryToFixBadConversion(ConvIdx, S); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11571) break; +df92ddf8466bf (Anna Zaks 2011-07-19 19:49:12 +0000 11572) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11573) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11574) +adc7a704d2a38 (Douglas Gregor 2010-04-16 17:45:54 +0000 11575) // FIXME: this should probably be preserved from the overload +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11576) // operation somehow. +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11577) bool SuppressUserConversions = false; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11578) +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11579) unsigned ConvIdx = 0; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11580) unsigned ArgIdx = 0; +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11581) ArrayRef ParamTypes; +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 11582) bool Reversed = Cand->isReversed(); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11583) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11584) if (Cand->IsSurrogate) { +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11585) QualType ConvType +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11586) = Cand->Surrogate->getConversionType().getNonReferenceType(); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11587) if (const PointerType *ConvPtrType = ConvType->getAs()) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11588) ConvType = ConvPtrType->getPointeeType(); +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 11589) ParamTypes = ConvType->castAs()->getParamTypes(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11590) // Conversion 0 is 'this', which doesn't have a corresponding parameter. +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11591) ConvIdx = 1; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11592) } else if (Cand->Function) { +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11593) ParamTypes = +ed3b68e0dc3c0 (Simon Pilgrim 2019-10-02 14:02:27 +0000 11594) Cand->Function->getType()->castAs()->getParamTypes(); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11595) if (isa(Cand->Function) && +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 11596) !isa(Cand->Function) && !Reversed) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11597) // Conversion 0 is 'this', which doesn't have a corresponding parameter. +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11598) ConvIdx = 1; +52590319a2257 (Richard Smith 2019-10-29 13:06:34 -0700 11599) if (CSK == OverloadCandidateSet::CSK_Operator && +52590319a2257 (Richard Smith 2019-10-29 13:06:34 -0700 11600) Cand->Function->getDeclName().getCXXOverloadedOperator() != OO_Call) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11601) // Argument 0 is 'this', which doesn't have a corresponding parameter. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11602) ArgIdx = 1; +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11603) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11604) } else { +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11605) // Builtin operator. +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11606) assert(ConvCount <= 3); +5f6ab9a8bf307 (George Burgess IV 2017-06-08 20:55:21 +0000 11607) ParamTypes = Cand->BuiltinParamTypes; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11608) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11609) +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11610) // Fill in the rest of the conversions. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11611) for (unsigned ParamIdx = Reversed ? ParamTypes.size() - 1 : 0; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11612) ConvIdx != ConvCount; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11613) ++ConvIdx, ++ArgIdx, ParamIdx += (Reversed ? -1 : 1)) { +52590319a2257 (Richard Smith 2019-10-29 13:06:34 -0700 11614) assert(ArgIdx < Args.size() && "no argument for this arg conversion"); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11615) if (Cand->Conversions[ConvIdx].isInitialized()) { +14ead30ab8bcd (Richard Smith 2017-01-10 20:19:21 +0000 11616) // We've already checked this conversion. +52590319a2257 (Richard Smith 2019-10-29 13:06:34 -0700 11617) } else if (ParamIdx < ParamTypes.size()) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11618) if (ParamTypes[ParamIdx]->isDependentType()) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11619) Cand->Conversions[ConvIdx].setAsIdentityConversion( +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11620) Args[ArgIdx]->getType()); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11621) else { +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11622) Cand->Conversions[ConvIdx] = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 11623) TryCopyInitialization(S, Args[ArgIdx], ParamTypes[ParamIdx], +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11624) SuppressUserConversions, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11625) /*InOverloadResolution=*/true, +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11626) /*AllowObjCWritebackConversion=*/ +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11627) S.getLangOpts().ObjCAutoRefCount); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11628) // Store the FixIt in the candidate if it exists. +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11629) if (!Unfixable && Cand->Conversions[ConvIdx].isBad()) +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11630) Unfixable = !Cand->TryToFixBadConversion(ConvIdx, S); +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11631) } +6eedfe77c15fa (Richard Smith 2017-01-09 08:01:21 +0000 11632) } else +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11633) Cand->Conversions[ConvIdx].setEllipsis(); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11634) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11635) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11636) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11637) SmallVector OverloadCandidateSet::CompleteCandidates( +b2f0f05742130 (Richard Smith 2016-10-10 18:54:32 +0000 11638) Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef Args, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11639) SourceLocation OpLoc, +b2f0f05742130 (Richard Smith 2016-10-10 18:54:32 +0000 11640) llvm::function_ref Filter) { +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11641) // Sort the candidates by viability and position. Sorting directly would +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11642) // be prohibitive, so we make a set of pointers and sort those. +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 11643) SmallVector Cands; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11644) if (OCD == OCD_AllCandidates) Cands.reserve(size()); +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11645) for (iterator Cand = begin(), LastCand = end(); Cand != LastCand; ++Cand) { +b2f0f05742130 (Richard Smith 2016-10-10 18:54:32 +0000 11646) if (!Filter(*Cand)) +b2f0f05742130 (Richard Smith 2016-10-10 18:54:32 +0000 11647) continue; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11648) switch (OCD) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11649) case OCD_AllCandidates: +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11650) if (!Cand->Viable) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11651) if (!Cand->Function && !Cand->IsSurrogate) { +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11652) // This a non-viable builtin candidate. We do not, in general, +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11653) // want to list every possible builtin candidate. +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11654) continue; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11655) } +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11656) CompleteNonViableCandidate(S, Cand, Args, Kind); +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11657) } +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11658) break; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11659) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11660) case OCD_ViableCandidates: +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11661) if (!Cand->Viable) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11662) continue; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11663) break; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11664) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11665) case OCD_AmbiguousCandidates: +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11666) if (!Cand->Best) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11667) continue; +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11668) break; +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11669) } +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11670) +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 11671) Cands.push_back(Cand); +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11672) } +fe796ddd5a76f (John McCall 2010-01-23 05:17:32 +0000 11673) +899d13926df4b (Fangrui Song 2019-04-24 14:43:05 +0000 11674) llvm::stable_sort( +899d13926df4b (Fangrui Song 2019-04-24 14:43:05 +0000 11675) Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind)); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 11676) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11677) return Cands; +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11678) } +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11679) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11680) bool OverloadCandidateSet::shouldDeferDiags(Sema &S, ArrayRef Args, +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11681) SourceLocation OpLoc) { +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11682) bool DeferHint = false; +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11683) if (S.getLangOpts().CUDA && S.getLangOpts().GPUDeferDiag) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11684) // Defer diagnostic for CUDA/HIP if there are wrong-sided candidates or +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11685) // host device candidates. +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11686) auto WrongSidedCands = +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11687) CompleteCandidates(S, OCD_AllCandidates, Args, OpLoc, [](auto &Cand) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11688) return (Cand.Viable == false && +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11689) Cand.FailureKind == ovl_fail_bad_target) || +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11690) (Cand.Function->template hasAttr() && +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11691) Cand.Function->template hasAttr()); +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11692) }); +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11693) DeferHint = !WrongSidedCands.empty(); +52bcd691cb199 (Yaxun (Sam) Liu 2020-09-23 18:00:23 -0400 11694) } +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11695) return DeferHint; +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11696) } +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11697) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11698) /// When overload resolution fails, prints diagnostic messages containing the +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11699) /// candidates in the candidate set. +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11700) void OverloadCandidateSet::NoteCandidates( +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11701) PartialDiagnosticAt PD, Sema &S, OverloadCandidateDisplayKind OCD, +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11702) ArrayRef Args, StringRef Opc, SourceLocation OpLoc, +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11703) llvm::function_ref Filter) { +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11704) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11705) auto Cands = CompleteCandidates(S, OCD, Args, OpLoc, Filter); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11706) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11707) S.Diag(PD.first, PD.second, shouldDeferDiags(S, Args, OpLoc)); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11708) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11709) NoteCandidates(S, Args, Cands, Opc, OpLoc); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11710) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11711) if (OCD == OCD_AmbiguousCandidates) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 11712) MaybeDiagnoseAmbiguousConstraints(S, {begin(), end()}); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11713) } +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11714) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11715) void OverloadCandidateSet::NoteCandidates(Sema &S, ArrayRef Args, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11716) ArrayRef Cands, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11717) StringRef Opc, SourceLocation OpLoc) { +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11718) bool ReportedAmbiguousConversions = false; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11719) +7959178eb00e3 (Douglas Gregor 2012-10-23 23:11:23 +0000 11720) const OverloadsShown ShowOverloads = S.Diags.getShowOverloads(); +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11721) unsigned CandsShown = 0; +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11722) auto I = Cands.begin(), E = Cands.end(); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 11723) for (; I != E; ++I) { +12f97bc48ad40 (John McCall 2010-01-08 04:41:39 +0000 11724) OverloadCandidate *Cand = *I; +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11725) +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11726) if (CandsShown >= S.Diags.getNumOverloadCandidatesToShow() && +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11727) ShowOverloads == Ovl_Best) { +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11728) break; +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11729) } +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11730) ++CandsShown; +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11731) +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11732) if (Cand->Function) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11733) NoteFunctionCandidate(S, Cand, Args.size(), +c25ea86d43929 (Anastasia Stulova 2019-06-20 16:23:28 +0000 11734) /*TakingCandidateAddress=*/false, DestAS); +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11735) else if (Cand->IsSurrogate) +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11736) NoteSurrogateCandidate(S, Cand); +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11737) else { +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11738) assert(Cand->Viable && +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11739) "Non-viable built-in candidates are not added to Cands."); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11740) // Generally we only see ambiguities including viable builtin +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11741) // operators if overload resolution got screwed up by an +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11742) // ambiguous user-defined conversion. +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11743) // +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11744) // FIXME: It's quite possible for different conversions to see +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11745) // different ambiguities, though. +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11746) if (!ReportedAmbiguousConversions) { +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11747) NoteAmbiguousUserConversions(S, OpLoc, Cand); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11748) ReportedAmbiguousConversions = true; +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11749) } +d3224162336e1 (John McCall 2010-01-08 00:58:21 +0000 11750) +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 11751) // If this is a viable builtin, print it. +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 11752) NoteBuiltinOperatorCandidate(S, Opc, OpLoc, Cand); +a11693bc37b1b (Douglas Gregor 2008-11-12 17:17:38 +0000 11753) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 11754) } +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11755) +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11756) // Inform S.Diags that we've shown an overload set with N elements. This may +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11757) // inform the future value of S.Diags.getNumOverloadCandidatesToShow(). +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11758) S.Diags.overloadCandidatesShown(CandsShown); +c90dac27e94ec (Justin Lebar 2021-01-30 19:00:24 -0800 11759) +2b99c6fc4f3e0 (Jeffrey Yasskin 2010-06-11 05:57:47 +0000 11760) if (I != E) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11761) S.Diag(OpLoc, diag::note_ovl_too_many_candidates, +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11762) shouldDeferDiags(S, Args, OpLoc)) +acb6f80d96b74 (Yaxun (Sam) Liu 2020-11-25 10:33:18 -0500 11763) << int(E - I); +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 11764) } +5251f1b28324a (Douglas Gregor 2008-10-21 16:13:35 +0000 11765) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11766) static SourceLocation +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11767) GetLocationForCandidate(const TemplateSpecCandidate *Cand) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11768) return Cand->Specialization ? Cand->Specialization->getLocation() +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11769) : SourceLocation(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11770) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11771) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11772) namespace { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11773) struct CompareTemplateSpecCandidatesForDisplay { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11774) Sema &S; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11775) CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {} +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11776) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11777) bool operator()(const TemplateSpecCandidate *L, +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11778) const TemplateSpecCandidate *R) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11779) // Fast-path this check. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11780) if (L == R) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11781) return false; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11782) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11783) // Assuming that both candidates are not matches... +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11784) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11785) // Sort by the ranking of deduction failures. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11786) if (L->DeductionFailure.Result != R->DeductionFailure.Result) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11787) return RankDeductionFailure(L->DeductionFailure) < +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11788) RankDeductionFailure(R->DeductionFailure); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11789) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11790) // Sort everything else by location. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11791) SourceLocation LLoc = GetLocationForCandidate(L); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11792) SourceLocation RLoc = GetLocationForCandidate(R); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11793) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11794) // Put candidates without locations (e.g. builtins) at the end. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11795) if (LLoc.isInvalid()) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11796) return false; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11797) if (RLoc.isInvalid()) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11798) return true; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11799) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11800) return S.SourceMgr.isBeforeInTranslationUnit(LLoc, RLoc); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11801) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11802) }; +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 11803) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11804) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11805) /// Diagnose a template argument deduction failure. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11806) /// We are treating these failures as overload failures due to bad +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11807) /// deductions. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11808) void TemplateSpecCandidate::NoteDeductionFailure(Sema &S, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11809) bool ForTakingAddress) { +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 11810) DiagnoseBadDeduction(S, FoundDecl, Specialization, // pattern +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11811) DeductionFailure, /*NumArgs=*/0, ForTakingAddress); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11812) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11813) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11814) void TemplateSpecCandidateSet::destroyCandidates() { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11815) for (iterator i = begin(), e = end(); i != e; ++i) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11816) i->DeductionFailure.Destroy(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11817) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11818) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11819) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11820) void TemplateSpecCandidateSet::clear() { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11821) destroyCandidates(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11822) Candidates.clear(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11823) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11824) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11825) /// NoteCandidates - When no template specialization match is found, prints +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11826) /// diagnostic messages containing the non-matching specializations that form +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11827) /// the candidate set. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11828) /// This is analoguous to OverloadCandidateSet::NoteCandidates() with +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11829) /// OCD == OCD_AllCandidates and Cand->Viable == false. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11830) void TemplateSpecCandidateSet::NoteCandidates(Sema &S, SourceLocation Loc) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11831) // Sort the candidates by position (assuming no candidate is a match). +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11832) // Sorting directly would be prohibitive, so we make a set of pointers +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11833) // and sort those. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11834) SmallVector Cands; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11835) Cands.reserve(size()); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11836) for (iterator Cand = begin(), LastCand = end(); Cand != LastCand; ++Cand) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11837) if (Cand->Specialization) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11838) Cands.push_back(Cand); +d473363876d4b (Alp Toker 2013-12-05 04:47:09 +0000 11839) // Otherwise, this is a non-matching builtin candidate. We do not, +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11840) // in general, want to list every possible builtin candidate. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11841) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11842) +55fab260ca1c4 (Fangrui Song 2018-09-26 22:16:28 +0000 11843) llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S)); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11844) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11845) // FIXME: Perhaps rename OverloadsShown and getShowOverloads() +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11846) // for generalization purposes (?). +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11847) const OverloadsShown ShowOverloads = S.Diags.getShowOverloads(); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11848) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11849) SmallVectorImpl::iterator I, E; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11850) unsigned CandsShown = 0; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11851) for (I = Cands.begin(), E = Cands.end(); I != E; ++I) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11852) TemplateSpecCandidate *Cand = *I; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11853) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11854) // Set an arbitrary limit on the number of candidates we'll spam +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11855) // the user with. FIXME: This limit should depend on details of the +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11856) // candidate list. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11857) if (CandsShown >= 4 && ShowOverloads == Ovl_Best) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11858) break; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11859) ++CandsShown; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11860) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11861) assert(Cand->Specialization && +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11862) "Non-matching built-in candidates are not added to Cands."); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11863) Cand->NoteDeductionFailure(S, ForTakingAddress); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11864) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11865) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11866) if (I != E) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11867) S.Diag(Loc, diag::note_ovl_too_many_candidates) << int(E - I); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11868) } +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11869) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11870) // [PossiblyAFunctionType] --> [Return] +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11871) // NonFunctionType --> NonFunctionType +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11872) // R (A) --> R(A) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11873) // R (*)(A) --> R (A) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11874) // R (&)(A) --> R (A) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11875) // R (S::*)(A) --> R (A) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11876) QualType Sema::ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11877) QualType Ret = PossiblyAFunctionType; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11878) if (const PointerType *ToTypePtr = +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11879) PossiblyAFunctionType->getAs()) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11880) Ret = ToTypePtr->getPointeeType(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11881) else if (const ReferenceType *ToTypeRef = +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11882) PossiblyAFunctionType->getAs()) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11883) Ret = ToTypeRef->getPointeeType(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11884) else if (const MemberPointerType *MemTypePtr = +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11885) PossiblyAFunctionType->getAs()) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11886) Ret = MemTypePtr->getPointeeType(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11887) Ret = +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11888) Context.getCanonicalType(Ret).getUnqualifiedType(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11889) return Ret; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11890) } +064fdb2fe844a (Douglas Gregor 2010-04-14 23:11:21 +0000 11891) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11892) static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc, +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11893) bool Complain = true) { +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11894) if (S.getLangOpts().CPlusPlus14 && FD->getReturnType()->isUndeducedType() && +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11895) S.DeduceReturnType(FD, Loc, Complain)) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11896) return true; +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11897) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11898) auto *FPT = FD->getType()->castAs(); +c351fba69e24c (Aaron Ballman 2017-12-04 20:27:34 +0000 11899) if (S.getLangOpts().CPlusPlus17 && +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11900) isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) && +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11901) !S.ResolveExceptionSpec(Loc, FPT)) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11902) return true; +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11903) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11904) return false; +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11905) } +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 11906) +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11907) namespace { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11908) // A helper class to help with address of function resolution +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11909) // - allows us to avoid passing around all those ugly parameters +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 11910) class AddressOfFunctionResolver { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11911) Sema& S; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11912) Expr* SourceExpr; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11913) const QualType& TargetType; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11914) QualType TargetFunctionType; // Extracted function type from target type +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11915) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11916) bool Complain; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11917) //DeclAccessPair& ResultFunctionAccessPair; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11918) ASTContext& Context; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11919) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11920) bool TargetTypeIsNonStaticMemberFunction; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11921) bool FoundNonTemplateFunction; +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11922) bool StaticMemberFunctionFromBoundPointer; +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 11923) bool HasComplained; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11924) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11925) OverloadExpr::FindResult OvlExprInfo; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11926) OverloadExpr *OvlExpr; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11927) TemplateArgumentListInfo OvlExplicitTemplateArgs; +0e62c1cc0b47c (Chris Lattner 2011-07-23 10:55:15 +0000 11928) SmallVector, 4> Matches; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11929) TemplateSpecCandidateSet FailedCandidates; +24d189484b443 (John McCall 2010-08-24 22:52:39 +0000 11930) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11931) public: +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11932) AddressOfFunctionResolver(Sema &S, Expr *SourceExpr, +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11933) const QualType &TargetType, bool Complain) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11934) : S(S), SourceExpr(SourceExpr), TargetType(TargetType), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11935) Complain(Complain), Context(S.getASTContext()), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11936) TargetTypeIsNonStaticMemberFunction( +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11937) !!TargetType->getAs()), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11938) FoundNonTemplateFunction(false), +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11939) StaticMemberFunctionFromBoundPointer(false), +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 11940) HasComplained(false), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11941) OvlExprInfo(OverloadExpr::find(SourceExpr)), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 11942) OvlExpr(OvlExprInfo.Expression), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 11943) FailedCandidates(OvlExpr->getNameLoc(), /*ForTakingAddress=*/true) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11944) ExtractUnqualifiedFunctionTypeFromTargetType(); +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11945) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11946) if (TargetFunctionType->isFunctionType()) { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11947) if (UnresolvedMemberExpr *UME = dyn_cast(OvlExpr)) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11948) if (!UME->isImplicitAccess() && +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11949) !S.ResolveSingleFunctionTemplateSpecialization(UME)) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11950) StaticMemberFunctionFromBoundPointer = true; +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11951) } else if (OvlExpr->hasExplicitTemplateArgs()) { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11952) DeclAccessPair dap; +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11953) if (FunctionDecl *Fn = S.ResolveSingleFunctionTemplateSpecialization( +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11954) OvlExpr, false, &dap)) { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11955) if (CXXMethodDecl *Method = dyn_cast(Fn)) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11956) if (!Method->isStatic()) { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11957) // If the target type is a non-function type and the function found +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11958) // is a non-static member function, pretend as if that was the +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11959) // target, it's the only possible type to end up with. +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11960) TargetTypeIsNonStaticMemberFunction = true; +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11961) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11962) // And skip adding the function if its not in the proper form. +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11963) // We'll diagnose this due to an empty set of functions. +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11964) if (!OvlExprInfo.HasFormOfMemberPointer) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11965) return; +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 11966) } +ffce245700488 (Chandler Carruth 2011-03-29 08:08:18 +0000 11967) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 11968) Matches.push_back(std::make_pair(dap, Fn)); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11969) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11970) return; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11971) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 11972) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11973) if (OvlExpr->hasExplicitTemplateArgs()) +04ec5bfad8ff4 (James Y Knight 2015-12-24 02:59:37 +0000 11974) OvlExpr->copyTemplateArgumentsInto(OvlExplicitTemplateArgs); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11975) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11976) if (FindAllFunctionsThatMatchTargetTypeExactly()) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11977) // C++ [over.over]p4: +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11978) // If more than one function is selected, [...] +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 11979) if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11980) if (FoundNonTemplateFunction) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11981) EliminateAllTemplateMatches(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11982) else +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11983) EliminateAllExceptMostSpecializedTemplate(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11984) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11985) } +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 11986) +25c4a81e79b08 (Justin Lebar 2016-03-29 16:24:16 +0000 11987) if (S.getLangOpts().CUDA && Matches.size() > 1) +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 11988) EliminateSuboptimalCudaMatches(); +24d189484b443 (John McCall 2010-08-24 22:52:39 +0000 11989) } +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 11990) +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 11991) bool hasComplained() const { return HasComplained; } +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 11992) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 11993) private: +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 11994) bool candidateHasExactlyCorrectType(const FunctionDecl *FD) { +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 11995) QualType Discard; +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 11996) return Context.hasSameUnqualifiedType(TargetFunctionType, FD->getType()) || +3c4f8d2e96c4b (Richard Smith 2016-10-16 17:54:23 +0000 11997) S.IsFunctionConversion(FD->getType(), TargetFunctionType, Discard); +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 11998) } +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 11999) +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12000) /// \return true if A is considered a better overload candidate for the +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12001) /// desired type than B. +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12002) bool isBetterCandidate(const FunctionDecl *A, const FunctionDecl *B) { +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12003) // If A doesn't have exactly the correct type, we don't want to classify it +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12004) // as "better" than anything else. This way, the user is required to +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12005) // disambiguate for us if there are multiple candidates and no exact match. +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12006) return candidateHasExactlyCorrectType(A) && +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12007) (!candidateHasExactlyCorrectType(B) || +3dc16691339e0 (George Burgess IV 2016-05-10 01:59:34 +0000 12008) compareEnableIfAttrs(S, A, B) == Comparison::Better); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12009) } +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12010) +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12011) /// \return true if we were able to eliminate all but one overload candidate, +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12012) /// false otherwise. +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12013) bool eliminiateSuboptimalOverloadCandidates() { +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12014) // Same algorithm as overload resolution -- one pass to pick the "best", +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12015) // another pass to be sure that nothing is better than the best. +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12016) auto Best = Matches.begin(); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12017) for (auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12018) if (isBetterCandidate(I->second, Best->second)) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12019) Best = I; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12020) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12021) const FunctionDecl *BestFn = Best->second; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12022) auto IsBestOrInferiorToBest = [this, BestFn]( +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12023) const std::pair &Pair) { +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12024) return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12025) }; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12026) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12027) // Note: We explicitly leave Matches unmodified if there isn't a clear best +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12028) // option, so we can potentially give the user a better error +3117b17bc57c1 (Fangrui Song 2018-10-20 17:53:42 +0000 12029) if (!llvm::all_of(Matches, IsBestOrInferiorToBest)) +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12030) return false; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12031) Matches[0] = *Best; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12032) Matches.resize(1); +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12033) return true; +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12034) } +2a6150d93290b (George Burgess IV 2015-10-16 01:17:38 +0000 12035) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12036) bool isTargetTypeAFunction() const { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12037) return TargetFunctionType->isFunctionType(); +24d189484b443 (John McCall 2010-08-24 22:52:39 +0000 12038) } +24d189484b443 (John McCall 2010-08-24 22:52:39 +0000 12039) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12040) // [ToType] [Return] +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12041) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12042) // R (*)(A) --> R (A), IsNonStaticMemberFunction = false +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12043) // R (&)(A) --> R (A), IsNonStaticMemberFunction = false +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12044) // R (S::*)(A) --> R (A), IsNonStaticMemberFunction = true +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12045) void inline ExtractUnqualifiedFunctionTypeFromTargetType() { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12046) TargetFunctionType = S.ExtractUnqualifiedFunctionType(TargetType); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12047) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12048) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12049) // return true if any matching specializations were found +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12050) bool AddMatchingTemplateFunction(FunctionTemplateDecl* FunctionTemplate, +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12051) const DeclAccessPair& CurAccessFunPair) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12052) if (CXXMethodDecl *Method +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12053) = dyn_cast(FunctionTemplate->getTemplatedDecl())) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12054) // Skip non-static function templates when converting to pointer, and +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12055) // static when converting to member pointer. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12056) if (Method->isStatic() == TargetTypeIsNonStaticMemberFunction) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12057) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12058) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12059) else if (TargetTypeIsNonStaticMemberFunction) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12060) return false; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12061) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12062) // C++ [over.over]p2: +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12063) // If the name is a function template, template argument deduction is +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12064) // done (14.8.2.2), and if the argument deduction succeeds, the +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12065) // resulting template argument list is used to generate a single +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12066) // function template specialization, which is added to the set of +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12067) // overloaded functions considered. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12068) FunctionDecl *Specialization = nullptr; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12069) TemplateDeductionInfo Info(FailedCandidates.getLocation()); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12070) if (Sema::TemplateDeductionResult Result +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12071) = S.DeduceTemplateArguments(FunctionTemplate, +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12072) &OvlExplicitTemplateArgs, +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12073) TargetFunctionType, Specialization, +baa4783d310c7 (Richard Smith 2016-12-01 02:11:49 +0000 12074) Info, /*IsAddressOfFunction*/true)) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12075) // Make a note of the failed deduction for diagnostics. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12076) FailedCandidates.addCandidate() +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 12077) .set(CurAccessFunPair, FunctionTemplate->getTemplatedDecl(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12078) MakeDeductionFailureInfo(Context, Result, Info)); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12079) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12080) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12081) +19a41f161b87b (Douglas Gregor 2013-04-17 08:45:07 +0000 12082) // Template argument deduction ensures that we have an exact match or +19a41f161b87b (Douglas Gregor 2013-04-17 08:45:07 +0000 12083) // compatible pointer-to-function arguments that would be adjusted by ICS. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12084) // This function template specicalization works. +19a41f161b87b (Douglas Gregor 2013-04-17 08:45:07 +0000 12085) assert(S.isSameOrCompatibleFunctionType( +19a41f161b87b (Douglas Gregor 2013-04-17 08:45:07 +0000 12086) Context.getCanonicalType(Specialization->getType()), +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 12087) Context.getCanonicalType(TargetFunctionType))); +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12088) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 12089) if (!S.checkAddressOfFunctionIsAvailable(Specialization)) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12090) return false; +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12091) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12092) Matches.push_back(std::make_pair(CurAccessFunPair, Specialization)); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12093) return true; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12094) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12095) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12096) bool AddMatchingNonTemplateFunction(NamedDecl* Fn, +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12097) const DeclAccessPair& CurAccessFunPair) { +c25c6ee3dbf28 (Chandler Carruth 2009-12-29 06:17:27 +0000 12098) if (CXXMethodDecl *Method = dyn_cast(Fn)) { +18f8ff62a3adb (Sebastian Redl 2009-02-04 21:23:32 +0000 12099) // Skip non-static functions when converting to pointer, and static +18f8ff62a3adb (Sebastian Redl 2009-02-04 21:23:32 +0000 12100) // when converting to member pointer. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12101) if (Method->isStatic() == TargetTypeIsNonStaticMemberFunction) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12102) return false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12103) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12104) else if (TargetTypeIsNonStaticMemberFunction) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12105) return false; +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 12106) +c25c6ee3dbf28 (Chandler Carruth 2009-12-29 06:17:27 +0000 12107) if (FunctionDecl *FunDecl = dyn_cast(Fn)) { +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 12108) if (S.getLangOpts().CUDA) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 12109) if (FunctionDecl *Caller = dyn_cast(S.CurContext)) +b008003aa3f0d (Justin Lebar 2016-08-10 01:09:11 +0000 12110) if (!Caller->isImplicit() && !S.IsAllowedCUDACall(Caller, FunDecl)) +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 12111) return false; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 12112) if (FunDecl->isMultiVersion()) { +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 12113) const auto *TA = FunDecl->getAttr(); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 12114) if (TA && !TA->isDefaultVersion()) +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 12115) return false; +281d20b601c8a (Erich Keane 2018-01-08 21:34:17 +0000 12116) } +7277fe8aed6e1 (Peter Collingbourne 2011-10-02 23:49:40 +0000 12117) +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 12118) // If any candidate has a placeholder return type, trigger its deduction +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 12119) // now. +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12120) if (completeFunctionType(S, FunDecl, SourceExpr->getBeginLoc(), +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 12121) Complain)) { +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12122) HasComplained |= Complain; +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 12123) return false; +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12124) } +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 12125) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 12126) if (!S.checkAddressOfFunctionIsAvailable(FunDecl)) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12127) return false; +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12128) +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12129) // If we're in C, we need to support types that aren't exactly identical. +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12130) if (!S.getLangOpts().CPlusPlus || +6da4c20f7daa6 (George Burgess IV 2016-03-23 02:33:58 +0000 12131) candidateHasExactlyCorrectType(FunDecl)) { +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12132) Matches.push_back(std::make_pair( +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12133) CurAccessFunPair, cast(FunDecl->getCanonicalDecl()))); +b257e4fff8a94 (Douglas Gregor 2009-07-08 23:33:52 +0000 12134) FoundNonTemplateFunction = true; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12135) return true; +b257e4fff8a94 (Douglas Gregor 2009-07-08 23:33:52 +0000 12136) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12137) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12138) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12139) return false; +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 12140) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12141) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12142) bool FindAllFunctionsThatMatchTargetTypeExactly() { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12143) bool Ret = false; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12144) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12145) // If the overload expression doesn't have the form of a pointer to +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12146) // member, don't try to convert it to a pointer-to-member type. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12147) if (IsInvalidFormOfPointerToMemberFunction()) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12148) return false; +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 12149) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12150) for (UnresolvedSetIterator I = OvlExpr->decls_begin(), +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12151) E = OvlExpr->decls_end(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12152) I != E; ++I) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12153) // Look through any using declarations to find the underlying function. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12154) NamedDecl *Fn = (*I)->getUnderlyingDecl(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12155) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12156) // C++ [over.over]p3: +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12157) // Non-member functions and static member functions match +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12158) // targets of type "pointer-to-function" or "reference-to-function." +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12159) // Nonstatic member functions match targets of +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12160) // type "pointer-to-member-function." +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12161) // Note that according to DR 247, the containing class does not matter. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12162) if (FunctionTemplateDecl *FunctionTemplate +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12163) = dyn_cast(Fn)) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12164) if (AddMatchingTemplateFunction(FunctionTemplate, I.getPair())) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12165) Ret = true; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12166) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12167) // If we have explicit template arguments supplied, skip non-templates. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12168) else if (!OvlExpr->hasExplicitTemplateArgs() && +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12169) AddMatchingNonTemplateFunction(Fn, I.getPair())) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12170) Ret = true; +5bb5e4ad9d8ed (Douglas Gregor 2010-10-12 23:32:35 +0000 12171) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12172) assert(Ret || Matches.empty()); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12173) return Ret; +df4b80e7c0caf (Sebastian Redl 2009-10-17 21:12:09 +0000 12174) } +b257e4fff8a94 (Douglas Gregor 2009-07-08 23:33:52 +0000 12175) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12176) void EliminateAllExceptMostSpecializedTemplate() { +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12177) // [...] and any given function template specialization F1 is +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12178) // eliminated if the set contains a second function template +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12179) // specialization whose function template is more specialized +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12180) // than the function template of F1 according to the partial +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12181) // ordering rules of 14.5.5.2. +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12182) +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12183) // The algorithm specified above is quadratic. We instead use a +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12184) // two-pass algorithm (similar to the one used to identify the +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12185) // best viable function in an overload set) that identifies the +05155d8d7b215 (Douglas Gregor 2009-08-21 23:19:43 +0000 12186) // best function template (if it exists). +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12187) +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12188) UnresolvedSet<4> MatchesCopy; // TODO: avoid! +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12189) for (unsigned I = 0, E = Matches.size(); I != E; ++I) +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12190) MatchesCopy.addDecl(Matches[I].second, Matches[I].first.getAccess()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12191) +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12192) // TODO: It looks like FailedCandidates does not serve much purpose +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12193) // here, since the no_viable diagnostic has index 0. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12194) UnresolvedSetIterator Result = S.getMostSpecialized( +35e1da259fcfb (Richard Smith 2013-09-10 22:59:25 +0000 12195) MatchesCopy.begin(), MatchesCopy.end(), FailedCandidates, +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12196) SourceExpr->getBeginLoc(), S.PDiag(), +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 12197) S.PDiag(diag::err_addr_ovl_ambiguous) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 12198) << Matches[0].second->getDeclName(), +5179eb78210a2 (Richard Smith 2016-06-28 19:03:57 +0000 12199) S.PDiag(diag::note_ovl_candidate) +92e523bf55087 (Eric Fiselier 2018-05-30 01:00:41 +0000 12200) << (unsigned)oc_function << (unsigned)ocs_described_template, +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12201) Complain, TargetFunctionType); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12202) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12203) if (Result != MatchesCopy.end()) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12204) // Make it the first and only element +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12205) Matches[0].first = Matches[Result - MatchesCopy.begin()].first; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12206) Matches[0].second = cast(*Result); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12207) Matches.resize(1); +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12208) } else +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12209) HasComplained |= Complain; +b257e4fff8a94 (Douglas Gregor 2009-07-08 23:33:52 +0000 12210) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12211) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12212) void EliminateAllTemplateMatches() { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12213) // [...] any function template specializations in the set are +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12214) // eliminated if the set also contains a non-template function, [...] +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12215) for (unsigned I = 0, N = Matches.size(); I != N; ) { +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12216) if (Matches[I].second->getPrimaryTemplate() == nullptr) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12217) ++I; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12218) else { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12219) Matches[I] = Matches[--N]; +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 12220) Matches.resize(N); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12221) } +58cc69d4c1516 (John McCall 2010-01-27 01:50:18 +0000 12222) } +58cc69d4c1516 (John McCall 2010-01-27 01:50:18 +0000 12223) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12224) +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 12225) void EliminateSuboptimalCudaMatches() { +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 12226) S.EraseUnwantedCUDAMatches(dyn_cast(S.CurContext), Matches); +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 12227) } +94a55e8169a1e (Artem Belevich 2015-09-22 17:22:59 +0000 12228) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12229) public: +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12230) void ComplainNoMatchesFound() const { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12231) assert(Matches.empty()); +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12232) S.Diag(OvlExpr->getBeginLoc(), diag::err_addr_ovl_no_viable) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12233) << OvlExpr->getName() << TargetFunctionType +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12234) << OvlExpr->getSourceRange(); +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12235) if (FailedCandidates.empty()) +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12236) S.NoteAllOverloadCandidates(OvlExpr, TargetFunctionType, +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12237) /*TakingAddress=*/true); +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12238) else { +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12239) // We have some deduction failure messages. Use them to diagnose +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12240) // the function templates, and diagnose the non-template candidates +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12241) // normally. +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12242) for (UnresolvedSetIterator I = OvlExpr->decls_begin(), +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12243) IEnd = OvlExpr->decls_end(); +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12244) I != IEnd; ++I) +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12245) if (FunctionDecl *Fun = +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12246) dyn_cast((*I)->getUnderlyingDecl())) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 12247) if (!functionHasPassObjectSizeParams(Fun)) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 12248) S.NoteOverloadCandidate(*I, Fun, CRK_None, TargetFunctionType, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 12249) /*TakingAddress=*/true); +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12250) FailedCandidates.NoteCandidates(S, OvlExpr->getBeginLoc()); +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12251) } +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12252) } +0d905476f8316 (Richard Smith 2013-08-14 00:00:44 +0000 12253) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12254) bool IsInvalidFormOfPointerToMemberFunction() const { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12255) return TargetTypeIsNonStaticMemberFunction && +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12256) !OvlExprInfo.HasFormOfMemberPointer; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12257) } +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12258) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12259) void ComplainIsInvalidFormOfPointerToMemberFunction() const { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12260) // TODO: Should we condition this on whether any functions might +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12261) // have matched, or is it more appropriate to do that in callers? +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12262) // TODO: a fixit wouldn't hurt. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12263) S.Diag(OvlExpr->getNameLoc(), diag::err_addr_ovl_no_qualifier) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12264) << TargetType << OvlExpr->getSourceRange(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12265) } +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12266) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12267) bool IsStaticMemberFunctionFromBoundPointer() const { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12268) return StaticMemberFunctionFromBoundPointer; +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12269) } +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12270) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12271) void ComplainIsStaticMemberFunctionFromBoundPointer() const { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12272) S.Diag(OvlExpr->getBeginLoc(), +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12273) diag::err_invalid_form_pointer_member_function) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12274) << OvlExpr->getSourceRange(); +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12275) } +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12276) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12277) void ComplainOfInvalidConversion() const { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12278) S.Diag(OvlExpr->getBeginLoc(), diag::err_addr_ovl_not_func_ptrref) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12279) << OvlExpr->getName() << TargetType; +df4b80e7c0caf (Sebastian Redl 2009-10-17 21:12:09 +0000 12280) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12281) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12282) void ComplainMultipleMatchesFound() const { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12283) assert(Matches.size() > 1); +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12284) S.Diag(OvlExpr->getBeginLoc(), diag::err_addr_ovl_ambiguous) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12285) << OvlExpr->getName() << OvlExpr->getSourceRange(); +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12286) S.NoteAllOverloadCandidates(OvlExpr, TargetFunctionType, +5f21c718007fd (George Burgess IV 2015-10-12 19:57:04 +0000 12287) /*TakingAddress=*/true); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12288) } +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12289) +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12290) bool hadMultipleCandidates() const { return (OvlExpr->getNumDecls() > 1); } +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12291) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12292) int getNumMatches() const { return Matches.size(); } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12293) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12294) FunctionDecl* getMatchingFunctionDecl() const { +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12295) if (Matches.size() != 1) return nullptr; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12296) return Matches[0].second; +e81f58e180117 (Douglas Gregor 2010-11-08 03:40:48 +0000 12297) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12298) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12299) const DeclAccessPair* getMatchingFunctionAccessPair() const { +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12300) if (Matches.size() != 1) return nullptr; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12301) return &Matches[0].first; +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12302) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12303) }; +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 12304) } +17c00b43288dc (Richard Smith 2014-11-12 01:24:00 +0000 12305) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12306) /// ResolveAddressOfOverloadedFunction - Try to resolve the address of +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12307) /// an overloaded function (C++ [over.over]), where @p From is an +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12308) /// expression with overloaded function type and @p ToType is the type +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12309) /// we're trying to resolve to. For example: +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12310) /// +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12311) /// @code +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12312) /// int f(double); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12313) /// int f(int); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12314) /// +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12315) /// int (*pfd)(double) = f; // selects f(double) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12316) /// @endcode +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12317) /// +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12318) /// This routine returns the resulting FunctionDecl if it could be +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12319) /// resolved, and NULL otherwise. When @p Complain is true, this +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12320) /// routine will emit diagnostics if there is an error. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12321) FunctionDecl * +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12322) Sema::ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12323) QualType TargetType, +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12324) bool Complain, +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12325) DeclAccessPair &FoundResult, +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12326) bool *pHadMultipleCandidates) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12327) assert(AddressOfExpr->getType() == Context.OverloadTy); +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12328) +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12329) AddressOfFunctionResolver Resolver(*this, AddressOfExpr, TargetType, +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12330) Complain); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12331) int NumMatches = Resolver.getNumMatches(); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12332) FunctionDecl *Fn = nullptr; +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12333) bool ShouldComplain = Complain && !Resolver.hasComplained(); +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12334) if (NumMatches == 0 && ShouldComplain) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12335) if (Resolver.IsInvalidFormOfPointerToMemberFunction()) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12336) Resolver.ComplainIsInvalidFormOfPointerToMemberFunction(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12337) else +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12338) Resolver.ComplainNoMatchesFound(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12339) } +5f2ef457bfb1d (George Burgess IV 2015-10-12 18:40:58 +0000 12340) else if (NumMatches > 1 && ShouldComplain) +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12341) Resolver.ComplainMultipleMatchesFound(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12342) else if (NumMatches == 1) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12343) Fn = Resolver.getMatchingFunctionDecl(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12344) assert(Fn); +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 12345) if (auto *FPT = Fn->getType()->getAs()) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 12346) ResolveExceptionSpec(AddressOfExpr->getExprLoc(), FPT); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12347) FoundResult = *Resolver.getMatchingFunctionAccessPair(); +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12348) if (Complain) { +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12349) if (Resolver.IsStaticMemberFunctionFromBoundPointer()) +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12350) Resolver.ComplainIsStaticMemberFunctionFromBoundPointer(); +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12351) else +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12352) CheckAddressOfMemberAccess(AddressOfExpr, FoundResult); +a4f7c7a600c3e (David Majnemer 2013-08-01 06:13:59 +0000 12353) } +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12354) } +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12355) +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12356) if (pHadMultipleCandidates) +5001caa1b6320 (Abramo Bagnara 2011-11-19 11:44:21 +0000 12357) *pHadMultipleCandidates = Resolver.hadMultipleCandidates(); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12358) return Fn; +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 12359) } +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 12360) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12361) /// Given an expression that refers to an overloaded function, try to +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12362) /// resolve that function to a single function that can have its address taken. +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12363) /// This will modify `Pair` iff it returns non-null. +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12364) /// +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12365) /// This routine can only succeed if from all of the candidates in the overload +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12366) /// set for SrcExpr that can have their addresses taken, there is one candidate +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12367) /// that is more constrained than the rest. +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12368) FunctionDecl * +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12369) Sema::resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &Pair) { +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12370) OverloadExpr::FindResult R = OverloadExpr::find(E); +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12371) OverloadExpr *Ovl = R.Expression; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12372) bool IsResultAmbiguous = false; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12373) FunctionDecl *Result = nullptr; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12374) DeclAccessPair DAP; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12375) SmallVector AmbiguousDecls; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12376) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12377) auto CheckMoreConstrained = +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12378) [&] (FunctionDecl *FD1, FunctionDecl *FD2) -> Optional { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12379) SmallVector AC1, AC2; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12380) FD1->getAssociatedConstraints(AC1); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12381) FD2->getAssociatedConstraints(AC2); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12382) bool AtLeastAsConstrained1, AtLeastAsConstrained2; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12383) if (IsAtLeastAsConstrained(FD1, AC1, FD2, AC2, AtLeastAsConstrained1)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12384) return None; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12385) if (IsAtLeastAsConstrained(FD2, AC2, FD1, AC1, AtLeastAsConstrained2)) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12386) return None; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12387) if (AtLeastAsConstrained1 == AtLeastAsConstrained2) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12388) return None; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12389) return AtLeastAsConstrained1; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12390) }; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12391) +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12392) // Don't use the AddressOfResolver because we're specifically looking for +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12393) // cases where we have one overload candidate that lacks +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12394) // enable_if/pass_object_size/... +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12395) for (auto I = Ovl->decls_begin(), E = Ovl->decls_end(); I != E; ++I) { +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12396) auto *FD = dyn_cast(I->getUnderlyingDecl()); +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12397) if (!FD) +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12398) return nullptr; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12399) +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12400) if (!checkAddressOfFunctionIsAvailable(FD)) +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12401) continue; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12402) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12403) // We have more than one result - see if it is more constrained than the +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12404) // previous one. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12405) if (Result) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12406) Optional MoreConstrainedThanPrevious = CheckMoreConstrained(FD, +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12407) Result); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12408) if (!MoreConstrainedThanPrevious) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12409) IsResultAmbiguous = true; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12410) AmbiguousDecls.push_back(FD); +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12411) continue; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12412) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12413) if (!*MoreConstrainedThanPrevious) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12414) continue; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12415) // FD is more constrained - replace Result with it. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12416) } +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12417) IsResultAmbiguous = false; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12418) DAP = I.getPair(); +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12419) Result = FD; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12420) } +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12421) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12422) if (IsResultAmbiguous) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12423) return nullptr; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12424) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12425) if (Result) { +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12426) SmallVector ResultAC; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12427) // We skipped over some ambiguous declarations which might be ambiguous with +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12428) // the selected result. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12429) for (FunctionDecl *Skipped : AmbiguousDecls) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12430) if (!CheckMoreConstrained(Skipped, Result).hasValue()) +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12431) return nullptr; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12432) Pair = DAP; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12433) } +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12434) return Result; +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12435) } +3cde9bf9d5734 (George Burgess IV 2016-03-19 21:36:10 +0000 12436) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12437) /// Given an overloaded function, tries to turn it into a non-overloaded +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12438) /// function reference using resolveAddressOfSingleOverloadCandidate. This +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12439) /// will perform access checks, diagnose the use of the resultant decl, and, if +1dbfa856b1172 (George Burgess IV 2017-05-09 04:06:24 +0000 12440) /// requested, potentially perform a function-to-pointer decay. +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12441) /// +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12442) /// Returns false if resolveAddressOfSingleOverloadCandidate fails. +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12443) /// Otherwise, returns true. This may emit diagnostics and return true. +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12444) bool Sema::resolveAndFixAddressOfSingleOverloadCandidate( +1dbfa856b1172 (George Burgess IV 2017-05-09 04:06:24 +0000 12445) ExprResult &SrcExpr, bool DoFunctionPointerConverion) { +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12446) Expr *E = SrcExpr.get(); +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12447) assert(E->getType() == Context.OverloadTy && "SrcExpr must be an overload"); +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12448) +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12449) DeclAccessPair DAP; +b65b1f322bd88 (Saar Raz 2020-01-09 15:07:51 +0200 12450) FunctionDecl *Found = resolveAddressOfSingleOverloadCandidate(E, DAP); +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 12451) if (!Found || Found->isCPUDispatchMultiVersion() || +3efe00206f0f4 (Erich Keane 2018-07-20 14:13:28 +0000 12452) Found->isCPUSpecificMultiVersion()) +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12453) return false; +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12454) +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12455) // Emitting multiple diagnostics for a function that is both inaccessible and +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12456) // unavailable is consistent with our behavior elsewhere. So, always check +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12457) // for both. +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12458) DiagnoseUseOfDecl(Found, E->getExprLoc()); +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12459) CheckAddressOfMemberAccess(E, DAP); +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12460) Expr *Fixed = FixOverloadedFunctionReference(E, DAP, Found); +1dbfa856b1172 (George Burgess IV 2017-05-09 04:06:24 +0000 12461) if (DoFunctionPointerConverion && Fixed->getType()->isFunctionType()) +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12462) SrcExpr = DefaultFunctionArrayConversion(Fixed, /*Diagnose=*/false); +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12463) else +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12464) SrcExpr = Fixed; +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12465) return true; +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12466) } +beca4a3338ab3 (George Burgess IV 2016-06-08 00:34:22 +0000 12467) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12468) /// Given an expression that refers to an overloaded function, try to +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12469) /// resolve that overloaded function expression down to a single function. +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12470) /// +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12471) /// This routine can only resolve template-ids that refer to a single function +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12472) /// template, where that template-id refers to a single template whose template +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12473) /// arguments are either provided by the template-id or have defaults, +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12474) /// as described in C++0x [temp.arg.explicit]p3. +67b47ac0a76bd (Alp Toker 2013-10-20 18:48:56 +0000 12475) /// +67b47ac0a76bd (Alp Toker 2013-10-20 18:48:56 +0000 12476) /// If no template-ids are found, no diagnostics are emitted and NULL is +67b47ac0a76bd (Alp Toker 2013-10-20 18:48:56 +0000 12477) /// returned. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12478) FunctionDecl * +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12479) Sema::ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12480) bool Complain, +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12481) DeclAccessPair *FoundResult) { +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12482) // C++ [over.over]p1: +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12483) // [...] [Note: any redundant set of parentheses surrounding the +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12484) // overloaded function name is ignored (5.1). ] +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12485) // C++ [over.over]p1: +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12486) // [...] The overloaded function name can be preceded by the & +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12487) // operator. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12488) +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12489) // If we didn't actually find any template-ids, we're done. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12490) if (!ovl->hasExplicitTemplateArgs()) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12491) return nullptr; +1acbbb5a4c6e6 (John McCall 2010-02-02 06:20:04 +0000 12492) +1acbbb5a4c6e6 (John McCall 2010-02-02 06:20:04 +0000 12493) TemplateArgumentListInfo ExplicitTemplateArgs; +04ec5bfad8ff4 (James Y Knight 2015-12-24 02:59:37 +0000 12494) ovl->copyTemplateArgumentsInto(ExplicitTemplateArgs); +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12495) TemplateSpecCandidateSet FailedCandidates(ovl->getNameLoc()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12496) +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12497) // Look through all of the overloaded functions, searching for one +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12498) // whose type matches exactly. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12499) FunctionDecl *Matched = nullptr; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12500) for (UnresolvedSetIterator I = ovl->decls_begin(), +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12501) E = ovl->decls_end(); I != E; ++I) { +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12502) // C++0x [temp.arg.explicit]p3: +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12503) // [...] In contexts where deduction is done and fails, or in contexts +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12504) // where deduction is not done, if a template argument list is +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12505) // specified and it, along with any default template arguments, +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12506) // identifies a single function template specialization, then the +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12507) // template-id is an lvalue for the function template specialization. +eebe72199e186 (Douglas Gregor 2010-07-14 23:20:53 +0000 12508) FunctionTemplateDecl *FunctionTemplate +eebe72199e186 (Douglas Gregor 2010-07-14 23:20:53 +0000 12509) = cast((*I)->getUnderlyingDecl()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12510) +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12511) // C++ [over.over]p2: +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12512) // If the name is a function template, template argument deduction is +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12513) // done (14.8.2.2), and if the argument deduction succeeds, the +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12514) // resulting template argument list is used to generate a single +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12515) // function template specialization, which is added to the set of +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12516) // overloaded functions considered. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12517) FunctionDecl *Specialization = nullptr; +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12518) TemplateDeductionInfo Info(FailedCandidates.getLocation()); +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12519) if (TemplateDeductionResult Result +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12520) = DeduceTemplateArguments(FunctionTemplate, &ExplicitTemplateArgs, +19a41f161b87b (Douglas Gregor 2013-04-17 08:45:07 +0000 12521) Specialization, Info, +baa4783d310c7 (Richard Smith 2016-12-01 02:11:49 +0000 12522) /*IsAddressOfFunction*/true)) { +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12523) // Make a note of the failed deduction for diagnostics. +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12524) // TODO: Actually use the failed-deduction info? +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12525) FailedCandidates.addCandidate() +c2bebe9acab26 (Richard Smith 2016-05-11 20:37:46 +0000 12526) .set(I.getPair(), FunctionTemplate->getTemplatedDecl(), +98b20f1278e09 (Larisse Voufo 2013-07-19 23:00:19 +0000 12527) MakeDeductionFailureInfo(Context, Result, Info)); +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12528) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12529) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12530) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12531) assert(Specialization && "no specialization and no error?"); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12532) +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12533) // Multiple matches; we can't resolve to a single declaration. +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12534) if (Matched) { +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12535) if (Complain) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12536) Diag(ovl->getExprLoc(), diag::err_addr_ovl_ambiguous) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12537) << ovl->getName(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12538) NoteAllOverloadCandidates(ovl); +b491ed36b4ef9 (Douglas Gregor 2011-02-19 21:32:49 +0000 12539) } +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12540) return nullptr; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12541) } +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12542) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12543) Matched = Specialization; +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12544) if (FoundResult) *FoundResult = I.getPair(); +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12545) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12546) +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 12547) if (Matched && +9095e5bf7e4fc (Richard Smith 2016-11-01 01:31:23 +0000 12548) completeFunctionType(*this, Matched, ovl->getExprLoc(), Complain)) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12549) return nullptr; +2a7d481faf546 (Richard Smith 2013-05-04 07:00:32 +0000 12550) +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12551) return Matched; +8364e6b56856e (Douglas Gregor 2009-12-21 23:17:24 +0000 12552) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12553) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12554) // Resolve and fix an overloaded expression that can be resolved +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12555) // because it identifies a single function template specialization. +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12556) // +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12557) // Last three arguments should only be supplied if Complain = true +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12558) // +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12559) // Return true if it was logically possible to so resolve the +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12560) // expression, regardless of whether or not it succeeded. Always +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12561) // returns true if 'complain' is set. +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12562) bool Sema::ResolveAndFixSingleFunctionTemplateSpecialization( +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12563) ExprResult &SrcExpr, bool doFunctionPointerConverion, +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12564) bool complain, SourceRange OpRangeForComplaining, +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12565) QualType DestTypeForComplaining, +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12566) unsigned DiagIDForComplaining) { +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12567) assert(SrcExpr.get()->getType() == Context.OverloadTy); +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12568) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12569) OverloadExpr::FindResult ovl = OverloadExpr::find(SrcExpr.get()); +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12570) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12571) DeclAccessPair found; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12572) ExprResult SingleFunctionExpression; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12573) if (FunctionDecl *fn = ResolveSingleFunctionTemplateSpecialization( +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12574) ovl.Expression, /*complain*/ false, &found)) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 12575) if (DiagnoseUseOfDecl(fn, SrcExpr.get()->getBeginLoc())) { +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12576) SrcExpr = ExprError(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12577) return true; +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12578) } +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12579) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12580) // It is only correct to resolve to an instance method if we're +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12581) // resolving a form that's permitted to be a pointer to member. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12582) // Otherwise we'll end up making a bound member expression, which +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12583) // is illegal in all the contexts we resolve like this. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12584) if (!ovl.HasFormOfMemberPointer && +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12585) isa(fn) && +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12586) cast(fn)->isInstance()) { +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12587) if (!complain) return false; +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12588) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12589) Diag(ovl.Expression->getExprLoc(), +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12590) diag::err_bound_member_function) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12591) << 0 << ovl.Expression->getSourceRange(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12592) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12593) // TODO: I believe we only end up here if there's a mix of +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12594) // static and non-static candidates (otherwise the expression +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12595) // would have 'bound member' type, not 'overload' type). +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12596) // Ideally we would note which candidate was chosen and why +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12597) // the static candidates were rejected. +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12598) SrcExpr = ExprError(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12599) return true; +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12600) } +89f3cd5c15212 (Douglas Gregor 2011-03-16 19:16:25 +0000 12601) +a5202660fb2f2 (Sylvestre Ledru 2012-07-31 06:56:50 +0000 12602) // Fix the expression to refer to 'fn'. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12603) SingleFunctionExpression = +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 12604) FixOverloadedFunctionReference(SrcExpr.get(), found, fn); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12605) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12606) // If desired, do function-to-pointer decay. +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12607) if (doFunctionPointerConverion) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12608) SingleFunctionExpression = +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 12609) DefaultFunctionArrayLvalueConversion(SingleFunctionExpression.get()); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12610) if (SingleFunctionExpression.isInvalid()) { +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12611) SrcExpr = ExprError(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12612) return true; +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12613) } +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12614) } +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12615) } +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12616) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12617) if (!SingleFunctionExpression.isUsable()) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12618) if (complain) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12619) Diag(OpRangeForComplaining.getBegin(), DiagIDForComplaining) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12620) << ovl.Expression->getName() +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12621) << DestTypeForComplaining +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 12622) << OpRangeForComplaining +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12623) << ovl.Expression->getQualifierLoc().getSourceRange(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12624) NoteAllOverloadCandidates(SrcExpr.get()); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12625) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12626) SrcExpr = ExprError(); +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12627) return true; +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12628) } +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12629) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12630) return false; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12631) } +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 12632) +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12633) SrcExpr = SingleFunctionExpression; +50a2c2c19de5e (John McCall 2011-10-11 23:14:30 +0000 12634) return true; +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12635) } +1beec45a618b4 (Douglas Gregor 2011-03-12 01:48:56 +0000 12636) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12637) /// Add a single candidate to the overload set. +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12638) static void AddOverloadedCallCandidate(Sema &S, +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12639) DeclAccessPair FoundDecl, +739b107af8003 (Douglas Gregor 2011-03-03 02:41:12 +0000 12640) TemplateArgumentListInfo *ExplicitTemplateArgs, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 12641) ArrayRef Args, +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12642) OverloadCandidateSet &CandidateSet, +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12643) bool PartialOverloading, +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12644) bool KnownValid) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12645) NamedDecl *Callee = FoundDecl.getDecl(); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12646) if (isa(Callee)) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12647) Callee = cast(Callee)->getTargetDecl(); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12648) +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12649) if (FunctionDecl *Func = dyn_cast(Callee)) { +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12650) if (ExplicitTemplateArgs) { +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12651) assert(!KnownValid && "Explicit template arguments?"); +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12652) return; +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12653) } +370296302d037 (Bruno Cardoso Lopes 2017-04-26 20:13:45 +0000 12654) // Prevent ill-formed function decls to be added as overload candidates. +370296302d037 (Bruno Cardoso Lopes 2017-04-26 20:13:45 +0000 12655) if (!dyn_cast(Func->getType()->getAs())) +370296302d037 (Bruno Cardoso Lopes 2017-04-26 20:13:45 +0000 12656) return; +370296302d037 (Bruno Cardoso Lopes 2017-04-26 20:13:45 +0000 12657) +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 12658) S.AddOverloadCandidate(Func, FoundDecl, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 12659) /*SuppressUserConversions=*/false, +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 12660) PartialOverloading); +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12661) return; +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12662) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12663) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12664) if (FunctionTemplateDecl *FuncTemplate +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12665) = dyn_cast(Callee)) { +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 12666) S.AddTemplateOverloadCandidate(FuncTemplate, FoundDecl, +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 12667) ExplicitTemplateArgs, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 12668) /*SuppressUserConversions=*/false, +975a9f6ecea60 (Francisco Lopes da Silva 2015-01-21 16:24:11 +0000 12669) PartialOverloading); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12670) return; +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12671) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12672) +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12673) assert(!KnownValid && "unhandled case in overloaded call candidate"); +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12674) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 12675) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12676) /// Add the overload candidates named by callee and/or found by argument +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12677) /// dependent lookup to the given overload set. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12678) void Sema::AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 12679) ArrayRef Args, +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12680) OverloadCandidateSet &CandidateSet, +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12681) bool PartialOverloading) { +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12682) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12683) #ifndef NDEBUG +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12684) // Verify that ArgumentDependentLookup is consistent with the rules +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12685) // in C++0x [basic.lookup.argdep]p3: +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12686) // +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12687) // Let X be the lookup set produced by unqualified lookup (3.4.1) +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12688) // and let Y be the lookup set produced by argument dependent +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12689) // lookup (defined as follows). If X contains +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12690) // +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12691) // -- a declaration of a class member, or +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12692) // +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12693) // -- a block-scope function declaration that is not a +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12694) // using-declaration, or +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12695) // +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12696) // -- a declaration that is neither a function or a function +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12697) // template +b8a9a41dd6ea0 (Douglas Gregor 2009-02-04 15:01:18 +0000 12698) // +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 12699) // then Y is empty. +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12700) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12701) if (ULE->requiresADL()) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12702) for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12703) E = ULE->decls_end(); I != E; ++I) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12704) assert(!(*I)->getDeclContext()->isRecord()); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12705) assert(isa(*I) || +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12706) !(*I)->getDeclContext()->isFunctionOrMethod()); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12707) assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate()); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12708) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12709) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12710) #endif +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12711) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12712) // It would be nice to avoid this copy. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12713) TemplateArgumentListInfo TABuffer; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12714) TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr; +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12715) if (ULE->hasExplicitTemplateArgs()) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12716) ULE->copyTemplateArgumentsInto(TABuffer); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12717) ExplicitTemplateArgs = &TABuffer; +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12718) } +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12719) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12720) for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12721) E = ULE->decls_end(); I != E; ++I) +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 12722) AddOverloadedCallCandidate(*this, I.getPair(), ExplicitTemplateArgs, Args, +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 12723) CandidateSet, PartialOverloading, +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 12724) /*KnownValid*/ true); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 12725) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12726) if (ULE->requiresADL()) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 12727) AddArgumentDependentLookupCandidates(ULE->getName(), ULE->getExprLoc(), +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 12728) Args, ExplicitTemplateArgs, +b6626748c2e50 (Richard Smith 2012-10-18 17:56:02 +0000 12729) CandidateSet, PartialOverloading); +cabea40ea3c9b (Douglas Gregor 2009-09-22 15:41:20 +0000 12730) } +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12731) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12732) /// Add the call candidates from the given set of lookup results to the given +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12733) /// overload set. Non-function lookup results are ignored. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12734) void Sema::AddOverloadedCallCandidates( +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12735) LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12736) ArrayRef Args, OverloadCandidateSet &CandidateSet) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12737) for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12738) AddOverloadedCallCandidate(*this, I.getPair(), ExplicitTemplateArgs, Args, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12739) CandidateSet, false, /*KnownValid*/ false); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12740) } +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12741) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12742) /// Determine whether a declaration with the specified name could be moved into +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12743) /// a different namespace. +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12744) static bool canBeDeclaredInNamespace(const DeclarationName &Name) { +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12745) switch (Name.getCXXOverloadedOperator()) { +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12746) case OO_New: case OO_Array_New: +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12747) case OO_Delete: case OO_Array_Delete: +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12748) return false; +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12749) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12750) default: +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12751) return true; +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12752) } +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12753) } +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12754) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12755) /// Attempt to recover from an ill-formed use of a non-dependent name in a +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12756) /// template, where the non-dependent name was declared after the template +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12757) /// was defined. This is common in code written for a compilers which do not +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12758) /// correctly implement two-stage name lookup. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12759) /// +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12760) /// Returns true if a viable candidate was found and a diagnostic was issued. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12761) static bool DiagnoseTwoPhaseLookup( +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12762) Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12763) LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12764) TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef Args, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12765) CXXRecordDecl **FoundInClass = nullptr) { +51ec0cf4aa94f (Richard Smith 2017-02-21 01:17:38 +0000 12766) if (!SemaRef.inTemplateInstantiation() || !SS.isEmpty()) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12767) return false; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12768) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12769) for (DeclContext *DC = SemaRef.CurContext; DC; DC = DC->getParent()) { +fcd5e7a1602cd (Nick Lewycky 2012-03-14 20:41:00 +0000 12770) if (DC->isTransparentContext()) +fcd5e7a1602cd (Nick Lewycky 2012-03-14 20:41:00 +0000 12771) continue; +fcd5e7a1602cd (Nick Lewycky 2012-03-14 20:41:00 +0000 12772) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12773) SemaRef.LookupQualifiedName(R, DC); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12774) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12775) if (!R.empty()) { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12776) R.suppressDiagnostics(); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12777) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 12778) OverloadCandidateSet Candidates(FnLoc, CSK); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12779) SemaRef.AddOverloadedCallCandidates(R, ExplicitTemplateArgs, Args, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12780) Candidates); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12781) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12782) OverloadCandidateSet::iterator Best; +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12783) OverloadingResult OR = +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12784) Candidates.BestViableFunction(SemaRef, FnLoc, Best); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12785) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12786) if (auto *RD = dyn_cast(DC)) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12787) // We either found non-function declarations or a best viable function +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12788) // at class scope. A class-scope lookup result disables ADL. Don't +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12789) // look past this, but let the caller know that we found something that +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12790) // either is, or might be, usable in this class. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12791) if (FoundInClass) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12792) *FoundInClass = RD; +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12793) if (OR == OR_Success) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12794) R.clear(); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12795) R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess()); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12796) R.resolveKind(); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12797) } +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12798) } +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12799) return false; +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12800) } +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12801) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12802) if (OR != OR_Success) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12803) // There wasn't a unique best function or function template. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12804) return false; +95ce4f67a3369 (Richard Smith 2011-06-26 22:19:54 +0000 12805) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12806) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12807) // Find the namespaces where ADL would have looked, and suggest +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12808) // declaring the function there instead. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12809) Sema::AssociatedNamespaceSet AssociatedNamespaces; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12810) Sema::AssociatedClassSet AssociatedClasses; +7d8b041999de9 (John McCall 2012-08-24 20:38:34 +0000 12811) SemaRef.FindAssociatedClassesAndNamespaces(FnLoc, Args, +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12812) AssociatedNamespaces, +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12813) AssociatedClasses); +d50f1690986f0 (Chandler Carruth 2011-06-05 23:36:55 +0000 12814) Sema::AssociatedNamespaceSet SuggestedNamespaces; +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12815) if (canBeDeclaredInNamespace(R.getLookupName())) { +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12816) DeclContext *Std = SemaRef.getStdNamespace(); +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12817) for (Sema::AssociatedNamespaceSet::iterator +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12818) it = AssociatedNamespaces.begin(), +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12819) end = AssociatedNamespaces.end(); it != end; ++it) { +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12820) // Never suggest declaring a function within namespace 'std'. +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12821) if (Std && Std->Encloses(*it)) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12822) continue; +21bae43fab8fa (Richard Smith 2012-12-22 02:46:14 +0000 12823) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12824) // Never suggest declaring a function within a namespace with a +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12825) // reserved name, like __gnu_cxx. +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12826) NamespaceDecl *NS = dyn_cast(*it); +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12827) if (NS && +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12828) NS->getQualifiedNameAsString().find("__") != std::string::npos) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12829) continue; +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12830) +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12831) SuggestedNamespaces.insert(*it); +0603bbb53c53c (Richard Smith 2013-06-12 22:56:54 +0000 12832) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12833) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12834) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12835) SemaRef.Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12836) << R.getLookupName(); +d50f1690986f0 (Chandler Carruth 2011-06-05 23:36:55 +0000 12837) if (SuggestedNamespaces.empty()) { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12838) SemaRef.Diag(Best->Function->getLocation(), +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12839) diag::note_not_found_by_two_phase_lookup) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12840) << R.getLookupName() << 0; +d50f1690986f0 (Chandler Carruth 2011-06-05 23:36:55 +0000 12841) } else if (SuggestedNamespaces.size() == 1) { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12842) SemaRef.Diag(Best->Function->getLocation(), +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12843) diag::note_not_found_by_two_phase_lookup) +d50f1690986f0 (Chandler Carruth 2011-06-05 23:36:55 +0000 12844) << R.getLookupName() << 1 << *SuggestedNamespaces.begin(); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12845) } else { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12846) // FIXME: It would be useful to list the associated namespaces here, +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12847) // but the diagnostics infrastructure doesn't provide a way to produce +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12848) // a localized representation of a list of items. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12849) SemaRef.Diag(Best->Function->getLocation(), +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12850) diag::note_not_found_by_two_phase_lookup) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12851) << R.getLookupName() << 2; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12852) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12853) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12854) // Try to recover by calling this function. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12855) return true; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12856) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12857) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12858) R.clear(); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12859) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12860) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12861) return false; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12862) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12863) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12864) /// Attempt to recover from ill-formed use of a non-dependent operator in a +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12865) /// template, where the non-dependent operator was declared after the template +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12866) /// was defined. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12867) /// +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12868) /// Returns true if a viable candidate was found and a diagnostic was issued. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12869) static bool +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12870) DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op, +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12871) SourceLocation OpLoc, +f857950d391d0 (Dmitri Gribenko 2013-01-12 19:30:44 +0000 12872) ArrayRef Args) { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12873) DeclarationName OpName = +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12874) SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12875) LookupResult R(SemaRef, OpName, OpLoc, Sema::LookupOperatorName); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12876) return DiagnoseTwoPhaseLookup(SemaRef, OpLoc, CXXScopeSpec(), R, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 12877) OverloadCandidateSet::CSK_Operator, +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12878) /*ExplicitTemplateArgs=*/nullptr, Args); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12879) } +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12880) +8edb17d7538bf (Kaelyn Uhrain 2012-01-25 18:37:44 +0000 12881) namespace { +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12882) class BuildRecoveryCallExprRAII { +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12883) Sema &SemaRef; +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12884) public: +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12885) BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S) { +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12886) assert(SemaRef.IsBuildingRecoveryCallExpr == false); +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12887) SemaRef.IsBuildingRecoveryCallExpr = true; +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12888) } +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12889) +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12890) ~BuildRecoveryCallExprRAII() { +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12891) SemaRef.IsBuildingRecoveryCallExpr = false; +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12892) } +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12893) }; +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12894) +ab9db51042d1b (Alexander Kornienko 2015-06-22 23:07:51 +0000 12895) } +8edb17d7538bf (Kaelyn Uhrain 2012-01-25 18:37:44 +0000 12896) +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12897) /// Attempts to recover from a call where no functions were found. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12898) /// +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12899) /// This function will do one of three things: +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12900) /// * Diagnose, recover, and return a recovery expression. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12901) /// * Diagnose, fail to recover, and return ExprError(). +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12902) /// * Do not diagnose, do not recover, and return ExprResult(). The caller is +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12903) /// expected to diagnose as appropriate. +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 12904) static ExprResult +2fb18b746fdb2 (Douglas Gregor 2010-04-14 20:27:54 +0000 12905) BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12906) UnresolvedLookupExpr *ULE, +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12907) SourceLocation LParenLoc, +e3d2ecbe86eee (Craig Topper 2014-06-28 23:22:33 +0000 12908) MutableArrayRef Args, +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 12909) SourceLocation RParenLoc, +9afaf793b36dc (Kaelyn Uhrain 2012-01-25 21:11:35 +0000 12910) bool EmptyLookup, bool AllowTypoCorrection) { +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12911) // Do not try to recover if it is already building a recovery call. +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12912) // This stops infinite loops for template instantiations like +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12913) // +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12914) // template auto foo(T t) -> decltype(foo(t)) {} +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12915) // template auto foo(T t) -> decltype(foo(&t)) {} +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12916) if (SemaRef.IsBuildingRecoveryCallExpr) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12917) return ExprResult(); +88d67f341279d (Richard Smith 2012-09-25 04:46:05 +0000 12918) BuildRecoveryCallExprRAII RCE(SemaRef); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12919) +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12920) CXXScopeSpec SS; +0da1d43e1600a (Douglas Gregor 2011-02-28 20:01:57 +0000 12921) SS.Adopt(ULE->getQualifierLoc()); +7945c981b974f (Abramo Bagnara 2012-01-27 09:46:47 +0000 12922) SourceLocation TemplateKWLoc = ULE->getTemplateKeywordLoc(); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12923) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12924) TemplateArgumentListInfo TABuffer; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 12925) TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr; +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12926) if (ULE->hasExplicitTemplateArgs()) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12927) ULE->copyTemplateArgumentsInto(TABuffer); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12928) ExplicitTemplateArgs = &TABuffer; +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12929) } +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12930) +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12931) LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(), +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12932) Sema::LookupOrdinaryName); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12933) CXXRecordDecl *FoundInClass = nullptr; +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12934) if (DiagnoseTwoPhaseLookup(SemaRef, Fn->getExprLoc(), SS, R, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12935) OverloadCandidateSet::CSK_Normal, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12936) ExplicitTemplateArgs, Args, &FoundInClass)) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12937) // OK, diagnosed a two-phase lookup issue. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12938) } else if (EmptyLookup) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12939) // Try to recover from an empty lookup with typo correction. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12940) R.clear(); +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12941) NoTypoCorrectionCCC NoTypoValidator{}; +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12942) FunctionCallFilterCCC FunctionCallValidator(SemaRef, Args.size(), +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12943) ExplicitTemplateArgs != nullptr, +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12944) dyn_cast(Fn)); +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12945) CorrectionCandidateCallback &Validator = +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12946) AllowTypoCorrection +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12947) ? static_cast(FunctionCallValidator) +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12948) : static_cast(NoTypoValidator); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12949) if (SemaRef.DiagnoseEmptyLookup(S, SS, R, Validator, ExplicitTemplateArgs, +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12950) Args)) +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12951) return ExprError(); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12952) } else if (FoundInClass && SemaRef.getLangOpts().MSVCCompat) { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12953) // We found a usable declaration of the name in a dependent base of some +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12954) // enclosing class. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12955) // FIXME: We should also explain why the candidates found by name lookup +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12956) // were not viable. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12957) if (SemaRef.DiagnoseDependentMemberLookup(R)) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12958) return ExprError(); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12959) } else { +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12960) // We had viable candidates and couldn't recover; let the caller diagnose +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12961) // this. +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12962) return ExprResult(); +70ad396bc49a9 (Bruno Ricci 2019-03-25 17:08:51 +0000 12963) } +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12964) +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12965) // If we get here, we should have issued a diagnostic and formed a recovery +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 12966) // lookup result. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12967) assert(!R.empty() && "lookup results empty despite recovery"); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12968) +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12969) // If recovery created an ambiguity, just bail out. +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12970) if (R.isAmbiguous()) { +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12971) R.suppressDiagnostics(); +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12972) return ExprError(); +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12973) } +151c4568581f1 (Richard Smith 2016-12-20 21:35:28 +0000 12974) +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12975) // Build an implicit member call if appropriate. Just drop the +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12976) // casts and such from the call, we don't really care. +faf5fb4b78c79 (John McCall 2010-08-26 23:41:50 +0000 12977) ExprResult NewFn = ExprError(); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12978) if ((*R.begin())->isCXXClassMember()) +6924dcdf6f737 (Aaron Ballman 2015-09-01 14:49:24 +0000 12979) NewFn = SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, +6924dcdf6f737 (Aaron Ballman 2015-09-01 14:49:24 +0000 12980) ExplicitTemplateArgs, S); +65f7c3dba22f0 (Abramo Bagnara 2012-02-06 14:31:00 +0000 12981) else if (ExplicitTemplateArgs || TemplateKWLoc.isValid()) +7945c981b974f (Abramo Bagnara 2012-01-27 09:46:47 +0000 12982) NewFn = SemaRef.BuildTemplateIdExpr(SS, TemplateKWLoc, R, false, +65f7c3dba22f0 (Abramo Bagnara 2012-02-06 14:31:00 +0000 12983) ExplicitTemplateArgs); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12984) else +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12985) NewFn = SemaRef.BuildDeclarationNameExpr(SS, R, false); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12986) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12987) if (NewFn.isInvalid()) +faf5fb4b78c79 (John McCall 2010-08-26 23:41:50 +0000 12988) return ExprError(); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 12989) +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12990) // This shouldn't cause an infinite loop because we're giving it +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12991) // an expression with viable lookup results, which should never +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12992) // end up here. +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12993) return SemaRef.BuildCallExpr(/*Scope*/ nullptr, NewFn.get(), LParenLoc, +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12994) MultiExprArg(Args.data(), Args.size()), +d972d4c749048 (Haojian Wu 2021-01-22 12:15:05 +0100 12995) RParenLoc); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 12996) } +4038cf4b57da3 (Douglas Gregor 2010-06-08 17:35:15 +0000 12997) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 12998) /// Constructs and populates an OverloadedCandidateSet from +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 12999) /// the given function. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13000) /// \returns true when an the ExprResult output parameter has been set. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13001) bool Sema::buildOverloadedCallSet(Scope *S, Expr *Fn, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13002) UnresolvedLookupExpr *ULE, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13003) MultiExprArg Args, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13004) SourceLocation RParenLoc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13005) OverloadCandidateSet *CandidateSet, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13006) ExprResult *Result) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13007) #ifndef NDEBUG +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13008) if (ULE->requiresADL()) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13009) // To do ADL, we must have found an unqualified name. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13010) assert(!ULE->getQualifier() && "qualified name with ADL"); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13011) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13012) // We don't perform ADL for implicit declarations of builtins. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13013) // Verify that this was correctly set up. +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13014) FunctionDecl *F; +b23c5e8c3df85 (Richard Smith 2019-05-09 03:31:27 +0000 13015) if (ULE->decls_begin() != ULE->decls_end() && +b23c5e8c3df85 (Richard Smith 2019-05-09 03:31:27 +0000 13016) ULE->decls_begin() + 1 == ULE->decls_end() && +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13017) (F = dyn_cast(*ULE->decls_begin())) && +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13018) F->getBuiltinID() && F->isImplicit()) +83d382b1cad13 (David Blaikie 2011-09-23 05:06:16 +0000 13019) llvm_unreachable("performing ADL for builtin"); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13020) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13021) // We don't perform ADL in C. +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 13022) assert(getLangOpts().CPlusPlus && "ADL enabled in C"); +b6626748c2e50 (Richard Smith 2012-10-18 17:56:02 +0000 13023) } +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13024) #endif +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13025) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13026) UnbridgedCastsSet UnbridgedCasts; +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13027) if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts)) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13028) *Result = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13029) return true; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13030) } +e254f90d94e32 (Douglas Gregor 2009-02-04 00:32:51 +0000 13031) +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13032) // Add the functions denoted by the callee to the set of candidate +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13033) // functions, including those from argument-dependent lookup. +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13034) AddOverloadedCallCandidates(ULE, Args, *CandidateSet); +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 13035) +b274738725f2e (Hans Wennborg 2015-06-12 21:23:23 +0000 13036) if (getLangOpts().MSVCCompat && +b274738725f2e (Hans Wennborg 2015-06-12 21:23:23 +0000 13037) CurContext->isDependentContext() && !isSFINAEContext() && +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13038) (isa(CurContext) || isa(CurContext))) { +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13039) +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13040) OverloadCandidateSet::iterator Best; +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13041) if (CandidateSet->empty() || +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 13042) CandidateSet->BestViableFunction(*this, Fn->getBeginLoc(), Best) == +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13043) OR_No_Viable_Function) { +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13044) // In Microsoft mode, if we are inside a template class member function +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13045) // then create a type dependent CallExpr. The goal is to postpone name +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13046) // lookup to instantiation time to be able to search into type dependent +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13047) // base classes. +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 13048) CallExpr *CE = +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13049) CallExpr::Create(Context, Fn, Args, Context.DependentTy, VK_PRValue, +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 13050) RParenLoc, CurFPFeatureOverrides()); +b4f02d89e5d8d (Sam McCall 2020-03-18 23:38:08 +0100 13051) CE->markDependentForPostponedNameLookup(); +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 13052) *Result = CE; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13053) return true; +b49c46c25cdc6 (Sebastian Redl 2011-09-24 17:48:00 +0000 13054) } +bcf6471010a1c (Francois Pichet 2011-09-07 00:14:57 +0000 13055) } +d681c3959f85b (John McCall 2009-12-16 08:11:27 +0000 13056) +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13057) if (CandidateSet->empty()) +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13058) return false; +64937c6f97fc4 (Hans Wennborg 2015-06-11 21:21:57 +0000 13059) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13060) UnbridgedCasts.restore(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13061) return false; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13062) } +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13063) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13064) // Guess at what the return type for an unresolvable overload should be. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13065) static QualType chooseRecoveryType(OverloadCandidateSet &CS, +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13066) OverloadCandidateSet::iterator *Best) { +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13067) llvm::Optional Result; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13068) // Adjust Type after seeing a candidate. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13069) auto ConsiderCandidate = [&](const OverloadCandidate &Candidate) { +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13070) if (!Candidate.Function) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13071) return; +031738a561184 (Haojian Wu 2020-08-11 13:49:11 +0200 13072) if (Candidate.Function->isInvalidDecl()) +031738a561184 (Haojian Wu 2020-08-11 13:49:11 +0200 13073) return; +96a5cfff208d8 (Haojian Wu 2020-07-08 13:53:47 +0200 13074) QualType T = Candidate.Function->getReturnType(); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13075) if (T.isNull()) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13076) return; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13077) if (!Result) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13078) Result = T; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13079) else if (Result != T) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13080) Result = QualType(); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13081) }; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13082) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13083) // Look for an unambiguous type from a progressively larger subset. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13084) // e.g. if types disagree, but all *viable* overloads return int, choose int. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13085) // +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13086) // First, consider only the best candidate. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13087) if (Best && *Best != CS.end()) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13088) ConsiderCandidate(**Best); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13089) // Next, consider only viable candidates. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13090) if (!Result) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13091) for (const auto &C : CS) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13092) if (C.Viable) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13093) ConsiderCandidate(C); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13094) // Finally, consider all candidates. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13095) if (!Result) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13096) for (const auto &C : CS) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13097) ConsiderCandidate(C); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13098) +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13099) if (!Result) +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13100) return QualType(); +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13101) auto Value = Result.getValue(); +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13102) if (Value.isNull() || Value->isUndeducedType()) +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13103) return QualType(); +7f05fe1aeeb00 (Haojian Wu 2020-10-05 12:52:03 +0200 13104) return Value; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13105) } +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13106) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13107) /// FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13108) /// the completed call expression. If overload resolution fails, emits +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13109) /// diagnostics and returns ExprError() +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13110) static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13111) UnresolvedLookupExpr *ULE, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13112) SourceLocation LParenLoc, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13113) MultiExprArg Args, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13114) SourceLocation RParenLoc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13115) Expr *ExecConfig, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13116) OverloadCandidateSet *CandidateSet, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13117) OverloadCandidateSet::iterator *Best, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13118) OverloadingResult OverloadResult, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13119) bool AllowTypoCorrection) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13120) switch (OverloadResult) { +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13121) case OR_Success: { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13122) FunctionDecl *FDecl = (*Best)->Function; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13123) SemaRef.CheckUnresolvedLookupAccess(ULE, (*Best)->FoundDecl); +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 13124) if (SemaRef.DiagnoseUseOfDecl(FDecl, ULE->getNameLoc())) +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 13125) return ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13126) Fn = SemaRef.FixOverloadedFunctionReference(Fn, (*Best)->FoundDecl, FDecl); +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13127) return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 13128) ExecConfig, /*IsExecConfig=*/false, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 13129) (*Best)->IsADLCandidate); +5750077300414 (John McCall 2009-12-16 12:17:52 +0000 13130) } +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13131) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13132) case OR_No_Viable_Function: { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13133) // Try to recover by looking for viable functions which the user might +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13134) // have meant to call. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13135) ExprResult Recovery = BuildRecoveryCallExpr(SemaRef, S, Fn, ULE, LParenLoc, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13136) Args, RParenLoc, +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 13137) CandidateSet->empty(), +9afaf793b36dc (Kaelyn Uhrain 2012-01-25 21:11:35 +0000 13138) AllowTypoCorrection); +c4fb7720ceb30 (Richard Smith 2020-12-02 17:46:28 -0800 13139) if (Recovery.isInvalid() || Recovery.isUsable()) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13140) return Recovery; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13141) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13142) // If the user passes in a function that we can't take the address of, we +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13143) // generally end up emitting really bad error messages. Here, we attempt to +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13144) // emit better ones. +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13145) for (const Expr *Arg : Args) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13146) if (!Arg->getType()->isFunctionType()) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13147) continue; +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13148) if (auto *DRE = dyn_cast(Arg->IgnoreParenImpCasts())) { +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13149) auto *FD = dyn_cast(DRE->getDecl()); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13150) if (FD && +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13151) !SemaRef.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true, +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13152) Arg->getExprLoc())) +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13153) return ExprError(); +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13154) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13155) } +3e3bb95b6951c (George Burgess IV 2015-12-02 21:58:08 +0000 13156) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13157) CandidateSet->NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13158) PartialDiagnosticAt( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13159) Fn->getBeginLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13160) SemaRef.PDiag(diag::err_ovl_no_viable_function_in_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13161) << ULE->getName() << Fn->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13162) SemaRef, OCD_AllCandidates, Args); +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13163) break; +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13164) } +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13165) +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13166) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13167) CandidateSet->NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13168) PartialDiagnosticAt(Fn->getBeginLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13169) SemaRef.PDiag(diag::err_ovl_ambiguous_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13170) << ULE->getName() << Fn->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 13171) SemaRef, OCD_AmbiguousCandidates, Args); +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13172) break; +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 13173) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13174) case OR_Deleted: { +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13175) CandidateSet->NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13176) PartialDiagnosticAt(Fn->getBeginLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13177) SemaRef.PDiag(diag::err_ovl_deleted_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13178) << ULE->getName() << Fn->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13179) SemaRef, OCD_AllCandidates, Args); +3eaa22af57876 (Argyrios Kyrtzidis 2011-11-04 15:58:13 +0000 13180) +2a8c18d991188 (Alexander Kornienko 2018-04-06 15:14:32 +0000 13181) // We emitted an error for the unavailable/deleted function call but keep +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13182) // the call in the AST. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13183) FunctionDecl *FDecl = (*Best)->Function; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13184) Fn = SemaRef.FixOverloadedFunctionReference(Fn, (*Best)->FoundDecl, FDecl); +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13185) return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 13186) ExecConfig, /*IsExecConfig=*/false, +5cdc2cda28ac8 (Eric Fiselier 2018-12-12 21:50:55 +0000 13187) (*Best)->IsADLCandidate); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13188) } +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13189) } +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13190) +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13191) // Overload resolution failed, try to recover. +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13192) SmallVector SubExprs = {Fn}; +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13193) SubExprs.append(Args.begin(), Args.end()); +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13194) return SemaRef.CreateRecoveryExpr(Fn->getBeginLoc(), RParenLoc, SubExprs, +8222107aa9249 (Haojian Wu 2020-05-08 16:13:17 +0200 13195) chooseRecoveryType(*CandidateSet, Best)); +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13196) } +99dcbff1542f3 (Douglas Gregor 2008-11-26 05:54:23 +0000 13197) +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13198) static void markUnaddressableCandidatesUnviable(Sema &S, +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13199) OverloadCandidateSet &CS) { +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13200) for (auto I = CS.begin(), E = CS.end(); I != E; ++I) { +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13201) if (I->Viable && +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13202) !S.checkAddressOfFunctionIsAvailable(I->Function, /*Complain=*/false)) { +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13203) I->Viable = false; +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13204) I->FailureKind = ovl_fail_addr_not_available; +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13205) } +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13206) } +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13207) } +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13208) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13209) /// BuildOverloadedCallExpr - Given the call expression that calls Fn +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13210) /// (which eventually refers to the declaration Func) and the call +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13211) /// arguments Args/NumArgs, attempt to resolve the function call down +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13212) /// to a specific function. If overload resolution succeeds, returns +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13213) /// the call expression produced by overload resolution. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13214) /// Otherwise, emits diagnostics and returns ExprError. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13215) ExprResult Sema::BuildOverloadedCallExpr(Scope *S, Expr *Fn, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13216) UnresolvedLookupExpr *ULE, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13217) SourceLocation LParenLoc, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13218) MultiExprArg Args, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13219) SourceLocation RParenLoc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13220) Expr *ExecConfig, +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13221) bool AllowTypoCorrection, +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13222) bool CalleesAddressIsTaken) { +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 13223) OverloadCandidateSet CandidateSet(Fn->getExprLoc(), +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 13224) OverloadCandidateSet::CSK_Normal); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13225) ExprResult result; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13226) +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13227) if (buildOverloadedCallSet(S, Fn, ULE, Args, LParenLoc, &CandidateSet, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 13228) &result)) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13229) return result; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13230) +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13231) // If the user handed us something like `(&Foo)(Bar)`, we need to ensure that +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13232) // functions that aren't addressible are considered unviable. +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13233) if (CalleesAddressIsTaken) +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13234) markUnaddressableCandidatesUnviable(*this, CandidateSet); +7204ed97dd930 (George Burgess IV 2016-01-07 02:26:57 +0000 13235) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13236) OverloadCandidateSet::iterator Best; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13237) OverloadingResult OverloadResult = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 13238) CandidateSet.BestViableFunction(*this, Fn->getBeginLoc(), Best); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13239) +b23c5e8c3df85 (Richard Smith 2019-05-09 03:31:27 +0000 13240) return FinishOverloadedCallExpr(*this, S, Fn, ULE, LParenLoc, Args, RParenLoc, +b23c5e8c3df85 (Richard Smith 2019-05-09 03:31:27 +0000 13241) ExecConfig, &CandidateSet, &Best, +b23c5e8c3df85 (Richard Smith 2019-05-09 03:31:27 +0000 13242) OverloadResult, AllowTypoCorrection); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13243) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 13244) +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13245) static bool IsOverloaded(const UnresolvedSetImpl &Functions) { +283b901cf3542 (John McCall 2009-11-22 00:44:51 +0000 13246) return Functions.size() > 1 || +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13247) (Functions.size() == 1 && +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13248) isa((*Functions.begin())->getUnderlyingDecl())); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13249) } +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13250) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13251) ExprResult Sema::CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13252) NestedNameSpecifierLoc NNSLoc, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13253) DeclarationNameInfo DNI, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13254) const UnresolvedSetImpl &Fns, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13255) bool PerformADL) { +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13256) return UnresolvedLookupExpr::Create(Context, NamingClass, NNSLoc, DNI, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13257) PerformADL, IsOverloaded(Fns), +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13258) Fns.begin(), Fns.end()); +283b901cf3542 (John McCall 2009-11-22 00:44:51 +0000 13259) } +283b901cf3542 (John McCall 2009-11-22 00:44:51 +0000 13260) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 13261) /// Create a unary operation that may resolve to an overloaded +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13262) /// operator. +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13263) /// +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13264) /// \param OpLoc The location of the operator itself (e.g., '*'). +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13265) /// +a92ffb011eef7 (Craig Topper 2015-12-10 08:51:49 +0000 13266) /// \param Opc The UnaryOperatorKind that describes this operator. +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13267) /// +18348b6218e4c (James Dennett 2012-06-22 08:52:37 +0000 13268) /// \param Fns The set of non-member functions that will be +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13269) /// considered by overload resolution. The caller needs to build this +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13270) /// set based on the context using, e.g., +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13271) /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13272) /// set should not contain any member functions; those will be added +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13273) /// by CreateOverloadedUnaryOp(). +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13274) /// +91738ffda3fa5 (James Dennett 2012-06-22 10:32:46 +0000 13275) /// \param Input The input argument. +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 13276) ExprResult +a92ffb011eef7 (Craig Topper 2015-12-10 08:51:49 +0000 13277) Sema::CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13278) const UnresolvedSetImpl &Fns, +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13279) Expr *Input, bool PerformADL) { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13280) OverloadedOperatorKind Op = UnaryOperator::getOverloadedOperator(Opc); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13281) assert(Op != OO_None && "Invalid opcode for overloaded unary operator"); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13282) DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op); +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 13283) // TODO: provide better source location info. +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 13284) DeclarationNameInfo OpNameInfo(OpName, OpLoc); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13285) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13286) if (checkPlaceholderForOverload(*this, Input)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13287) return ExprError(); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13288) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13289) Expr *Args[2] = { Input, nullptr }; +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13290) unsigned NumArgs = 1; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 13291) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13292) // For post-increment and post-decrement, add the implicit '0' as +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13293) // the second argument, so that we know this is a post-increment or +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13294) // post-decrement. +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 13295) if (Opc == UO_PostInc || Opc == UO_PostDec) { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13296) llvm::APSInt Zero(Context.getTypeSize(Context.IntTy), false); +43b205796f4ab (Argyrios Kyrtzidis 2010-08-28 09:06:06 +0000 13297) Args[1] = IntegerLiteral::Create(Context, Zero, Context.IntTy, +43b205796f4ab (Argyrios Kyrtzidis 2010-08-28 09:06:06 +0000 13298) SourceLocation()); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13299) NumArgs = 2; +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13300) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13301) +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 13302) ArrayRef ArgsArray(Args, NumArgs); +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 13303) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13304) if (Input->isTypeDependent()) { +630dec57a2af3 (Douglas Gregor 2010-06-17 15:46:20 +0000 13305) if (Fns.empty()) +f5360d4bb3376 (Melanie Blower 2020-05-01 10:32:06 -0700 13306) return UnaryOperator::Create(Context, Input, Opc, Context.DependentTy, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13307) VK_PRValue, OK_Ordinary, OpLoc, false, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 13308) CurFPFeatureOverrides()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13309) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13310) CXXRecordDecl *NamingClass = nullptr; // lookup ignores member operators +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13311) ExprResult Fn = CreateUnresolvedLookupExpr( +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13312) NamingClass, NestedNameSpecifierLoc(), OpNameInfo, Fns); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13313) if (Fn.isInvalid()) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13314) return ExprError(); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13315) return CXXOperatorCallExpr::Create(Context, Op, Fn.get(), ArgsArray, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13316) Context.DependentTy, VK_PRValue, OpLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 13317) CurFPFeatureOverrides()); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13318) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13319) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13320) // Build an empty overload set. +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 13321) OverloadCandidateSet CandidateSet(OpLoc, OverloadCandidateSet::CSK_Operator); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13322) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13323) // Add the candidates from the given function set. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13324) AddNonMemberOperatorCandidates(Fns, ArgsArray, CandidateSet); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13325) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13326) // Add operator candidates that are member functions. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 13327) AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13328) +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13329) // Add candidates from ADL. +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13330) if (PerformADL) { +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13331) AddArgumentDependentLookupCandidates(OpName, OpLoc, ArgsArray, +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13332) /*ExplicitTemplateArgs*/nullptr, +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13333) CandidateSet); +91fc7d89d0d5a (Richard Smith 2017-10-05 19:35:51 +0000 13334) } +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13335) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13336) // Add builtin operator candidates. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 13337) AddBuiltinOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13338) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13339) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13340) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13341) // Perform overload resolution. +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13342) OverloadCandidateSet::iterator Best; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 13343) switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13344) case OR_Success: { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13345) // We found a built-in operator or an overloaded operator. +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13346) FunctionDecl *FnDecl = Best->Function; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 13347) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13348) if (FnDecl) { +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13349) Expr *Base = nullptr; +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13350) // We matched an overloaded operator. Build a call to that +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13351) // operator. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 13352) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13353) // Convert the arguments. +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13354) if (CXXMethodDecl *Method = dyn_cast(FnDecl)) { +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13355) CheckMemberOperatorAccess(OpLoc, Args[0], nullptr, Best->FoundDecl); +b3a4400554925 (John McCall 2010-01-28 01:42:12 +0000 13356) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13357) ExprResult InputRes = +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13358) PerformObjectArgumentInitialization(Input, /*Qualifier=*/nullptr, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13359) Best->FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13360) if (InputRes.isInvalid()) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13361) return ExprError(); +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13362) Base = Input = InputRes.get(); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13363) } else { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13364) // Convert the arguments. +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 13365) ExprResult InputInit +e6600379b1c6f (Douglas Gregor 2009-12-23 17:40:29 +0000 13366) = PerformCopyInitialization(InitializedEntity::InitializeParameter( +8fb87aec78b52 (Fariborz Jahanian 2010-09-24 17:30:16 +0000 13367) Context, +8d48e9a26e5e2 (Douglas Gregor 2009-12-23 00:02:00 +0000 13368) FnDecl->getParamDecl(0)), +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13369) SourceLocation(), +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 13370) Input); +e6600379b1c6f (Douglas Gregor 2009-12-23 17:40:29 +0000 13371) if (InputInit.isInvalid()) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13372) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13373) Input = InputInit.get(); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13374) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13375) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13376) // Build the actual expression node. +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 13377) ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, Best->FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13378) Base, HadMultipleCandidates, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13379) OpLoc); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13380) if (FnExpr.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13381) return ExprError(); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 13382) +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13383) // Determine the result type. +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 13384) QualType ResultTy = FnDecl->getReturnType(); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13385) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13386) ResultTy = ResultTy.getNonLValueExprType(Context); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13387) +030eee4e5c369 (Eli Friedman 2009-11-18 03:58:17 +0000 13388) Args[0] = Input; +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13389) CallExpr *TheCall = CXXOperatorCallExpr::Create( +8812b0cc5cc09 (Melanie Blower 2020-04-16 08:45:26 -0700 13390) Context, Op, FnExpr.get(), ArgsArray, ResultTy, VK, OpLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 13391) CurFPFeatureOverrides(), Best->IsADLCandidate); +4fa0d5f2bd849 (John McCall 2010-05-06 18:15:07 +0000 13392) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 13393) if (CheckCallReturnType(FnDecl->getReturnType(), OpLoc, TheCall, FnDecl)) +f64a3dae047f5 (Anders Carlsson 2009-10-13 21:19:37 +0000 13394) return ExprError(); +f64a3dae047f5 (Anders Carlsson 2009-10-13 21:19:37 +0000 13395) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13396) if (CheckFunctionCall(FnDecl, TheCall, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13397) FnDecl->getType()->castAs())) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13398) return ExprError(); +008e7bf92343b (Tyker 2020-02-04 19:23:33 +0100 13399) return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), FnDecl); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13400) } else { +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13401) // We matched a built-in operator. Convert the arguments, then +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13402) // break out so that we will build the appropriate built-in +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13403) // operator node. +5f6ab9a8bf307 (George Burgess IV 2017-06-08 20:55:21 +0000 13404) ExprResult InputRes = PerformImplicitConversion( +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13405) Input, Best->BuiltinParamTypes[0], Best->Conversions[0], AA_Passing, +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13406) CCK_ForBuiltinOverloadedOp); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13407) if (InputRes.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13408) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13409) Input = InputRes.get(); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13410) break; +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13411) } +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13412) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13413) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13414) case OR_No_Viable_Function: +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13415) // This is an erroneous use of an operator which can be overloaded by +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13416) // a non-member function. Check for non-member operators which were +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13417) // defined too late to be candidates. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 13418) if (DiagnoseTwoPhaseOperatorLookup(*this, Op, OpLoc, ArgsArray)) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13419) // FIXME: Recover by calling the found function. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13420) return ExprError(); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13421) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13422) // No viable function; fall through to handling this as a +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13423) // built-in operator, which will produce an error message for us. +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13424) break; +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13425) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13426) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13427) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13428) PartialDiagnosticAt(OpLoc, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13429) PDiag(diag::err_ovl_ambiguous_oper_unary) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13430) << UnaryOperator::getOpcodeStr(Opc) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13431) << Input->getType() << Input->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 13432) *this, OCD_AmbiguousCandidates, ArgsArray, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13433) UnaryOperator::getOpcodeStr(Opc), OpLoc); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13434) return ExprError(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13435) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13436) case OR_Deleted: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13437) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13438) PartialDiagnosticAt(OpLoc, PDiag(diag::err_ovl_deleted_oper) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13439) << UnaryOperator::getOpcodeStr(Opc) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13440) << Input->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13441) *this, OCD_AllCandidates, ArgsArray, UnaryOperator::getOpcodeStr(Opc), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13442) OpLoc); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13443) return ExprError(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13444) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13445) +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13446) // Either we found no viable overloaded operator or we matched a +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13447) // built-in operator. In either case, fall through to trying to +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13448) // build a built-in operation. +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 13449) return CreateBuiltinUnaryOp(OpLoc, Opc, Input); +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13450) } +084d855a17f27 (Douglas Gregor 2009-03-13 23:49:33 +0000 13451) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13452) /// Perform lookup for an overloaded binary operator. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13453) void Sema::LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13454) OverloadedOperatorKind Op, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13455) const UnresolvedSetImpl &Fns, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13456) ArrayRef Args, bool PerformADL) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13457) SourceLocation OpLoc = CandidateSet.getLocation(); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13458) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13459) OverloadedOperatorKind ExtraOp = +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13460) CandidateSet.getRewriteInfo().AllowRewrittenCandidates +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13461) ? getRewrittenOverloadedOperator(Op) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13462) : OO_None; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13463) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13464) // Add the candidates from the given function set. This also adds the +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13465) // rewritten candidates using these functions if necessary. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13466) AddNonMemberOperatorCandidates(Fns, Args, CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13467) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13468) // Add operator candidates that are member functions. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13469) AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13470) if (CandidateSet.getRewriteInfo().shouldAddReversed(Op)) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13471) AddMemberOperatorCandidates(Op, OpLoc, {Args[1], Args[0]}, CandidateSet, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13472) OverloadCandidateParamOrder::Reversed); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13473) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13474) // In C++20, also add any rewritten member candidates. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13475) if (ExtraOp) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13476) AddMemberOperatorCandidates(ExtraOp, OpLoc, Args, CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13477) if (CandidateSet.getRewriteInfo().shouldAddReversed(ExtraOp)) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13478) AddMemberOperatorCandidates(ExtraOp, OpLoc, {Args[1], Args[0]}, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13479) CandidateSet, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13480) OverloadCandidateParamOrder::Reversed); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13481) } +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13482) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13483) // Add candidates from ADL. Per [over.match.oper]p2, this lookup is not +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13484) // performed for an assignment operator (nor for operator[] nor operator->, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13485) // which don't get here). +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13486) if (Op != OO_Equal && PerformADL) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13487) DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13488) AddArgumentDependentLookupCandidates(OpName, OpLoc, Args, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13489) /*ExplicitTemplateArgs*/ nullptr, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13490) CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13491) if (ExtraOp) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13492) DeclarationName ExtraOpName = +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13493) Context.DeclarationNames.getCXXOperatorName(ExtraOp); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13494) AddArgumentDependentLookupCandidates(ExtraOpName, OpLoc, Args, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13495) /*ExplicitTemplateArgs*/ nullptr, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13496) CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13497) } +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13498) } +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13499) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13500) // Add builtin operator candidates. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13501) // +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13502) // FIXME: We don't add any rewritten candidates here. This is strictly +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13503) // incorrect; a builtin candidate could be hidden by a non-viable candidate, +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13504) // resulting in our selecting a rewritten builtin candidate. For example: +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13505) // +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13506) // enum class E { e }; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13507) // bool operator!=(E, E) requires false; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13508) // bool k = E::e != E::e; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13509) // +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13510) // ... should select the rewritten builtin candidate 'operator==(E, E)'. But +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13511) // it seems unreasonable to consider rewritten builtin candidates. A core +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13512) // issue has been filed proposing to removed this requirement. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13513) AddBuiltinOperatorCandidates(Op, OpLoc, Args, CandidateSet); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13514) } +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13515) +9fc8faf9e6197 (Adrian Prantl 2018-05-09 01:00:01 +0000 13516) /// Create a binary operation that may resolve to an overloaded +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13517) /// operator. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13518) /// +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13519) /// \param OpLoc The location of the operator itself (e.g., '+'). +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13520) /// +a92ffb011eef7 (Craig Topper 2015-12-10 08:51:49 +0000 13521) /// \param Opc The BinaryOperatorKind that describes this operator. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13522) /// +18348b6218e4c (James Dennett 2012-06-22 08:52:37 +0000 13523) /// \param Fns The set of non-member functions that will be +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13524) /// considered by overload resolution. The caller needs to build this +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13525) /// set based on the context using, e.g., +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13526) /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13527) /// set should not contain any member functions; those will be added +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13528) /// by CreateOverloadedBinOp(). +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13529) /// +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13530) /// \param LHS Left-hand argument. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13531) /// \param RHS Right-hand argument. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13532) /// \param PerformADL Whether to consider operator candidates found by ADL. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13533) /// \param AllowRewrittenCandidates Whether to consider candidates found by +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13534) /// C++20 operator rewrites. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13535) /// \param DefaultedFn If we are synthesizing a defaulted operator function, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13536) /// the function in question. Such a function is never a candidate in +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13537) /// our overload resolution. This also enables synthesizing a three-way +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13538) /// comparison from < and == as described in C++20 [class.spaceship]p1. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13539) ExprResult Sema::CreateOverloadedBinOp(SourceLocation OpLoc, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13540) BinaryOperatorKind Opc, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13541) const UnresolvedSetImpl &Fns, Expr *LHS, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13542) Expr *RHS, bool PerformADL, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13543) bool AllowRewrittenCandidates, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13544) FunctionDecl *DefaultedFn) { +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13545) Expr *Args[2] = { LHS, RHS }; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13546) LHS=RHS=nullptr; // Please use only Args instead of LHS/RHS couple +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13547) +6a30894391ca6 (Aaron Ballman 2020-04-21 15:37:19 -0400 13548) if (!getLangOpts().CPlusPlus20) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13549) AllowRewrittenCandidates = false; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13550) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13551) OverloadedOperatorKind Op = BinaryOperator::getOverloadedOperator(Opc); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13552) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13553) // If either side is type-dependent, create an appropriate dependent +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13554) // expression. +e9899d9769661 (Douglas Gregor 2009-08-26 17:08:25 +0000 13555) if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) { +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13556) if (Fns.empty()) { +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13557) // If there are no functions to store, just build a dependent +5287f091b269e (Douglas Gregor 2009-11-05 00:51:44 +0000 13558) // BinaryOperator or CompoundAssignment. +31dc90801746e (Haojian Wu 2020-10-07 09:50:43 +0200 13559) if (BinaryOperator::isCompoundAssignmentOp(Opc)) +31dc90801746e (Haojian Wu 2020-10-07 09:50:43 +0200 13560) return CompoundAssignOperator::Create( +31dc90801746e (Haojian Wu 2020-10-07 09:50:43 +0200 13561) Context, Args[0], Args[1], Opc, Context.DependentTy, VK_LValue, +31dc90801746e (Haojian Wu 2020-10-07 09:50:43 +0200 13562) OK_Ordinary, OpLoc, CurFPFeatureOverrides(), Context.DependentTy, +31dc90801746e (Haojian Wu 2020-10-07 09:50:43 +0200 13563) Context.DependentTy); +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13564) return BinaryOperator::Create( +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13565) Context, Args[0], Args[1], Opc, Context.DependentTy, VK_PRValue, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13566) OK_Ordinary, OpLoc, CurFPFeatureOverrides()); +5287f091b269e (Douglas Gregor 2009-11-05 00:51:44 +0000 13567) } +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13568) +4c4c1dfc2b768 (John McCall 2010-01-26 03:27:55 +0000 13569) // FIXME: save results of ADL from here? +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13570) CXXRecordDecl *NamingClass = nullptr; // lookup ignores member operators +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 13571) // TODO: provide better source location info in DNLoc component. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13572) DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(Op); +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 13573) DeclarationNameInfo OpNameInfo(OpName, OpLoc); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13574) ExprResult Fn = CreateUnresolvedLookupExpr( +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13575) NamingClass, NestedNameSpecifierLoc(), OpNameInfo, Fns, PerformADL); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13576) if (Fn.isInvalid()) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13577) return ExprError(); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 13578) return CXXOperatorCallExpr::Create(Context, Op, Fn.get(), Args, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 13579) Context.DependentTy, VK_PRValue, OpLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 13580) CurFPFeatureOverrides()); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13581) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13582) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13583) // Always do placeholder-like conversions on the RHS. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13584) if (checkPlaceholderForOverload(*this, Args[1])) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13585) return ExprError(); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13586) +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 13587) // Do placeholder-like conversion on the LHS; note that we should +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 13588) // not get here with a PseudoObject LHS. +526ab47a55734 (John McCall 2011-10-25 17:37:35 +0000 13589) assert(Args[0]->getObjectKind() != OK_ObjCProperty); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13590) if (checkPlaceholderForOverload(*this, Args[0])) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13591) return ExprError(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 13592) +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13593) // If this is the assignment operator, we only perform overload resolution +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13594) // if the left-hand side is a class or enumeration type. This is actually +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13595) // a hack. The standard requires that we do overload resolution between the +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13596) // various built-in candidates, but as DR507 points out, this can lead to +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13597) // problems. So we do it this way, which pretty much follows what GCC does. +6a96bf7d6e33d (Sebastian Redl 2009-11-18 23:10:33 +0000 13598) // Note that we go the traditional code path for compound assignment forms. +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 13599) if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType()) +e9899d9769661 (Douglas Gregor 2009-08-26 17:08:25 +0000 13600) return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13601) +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13602) // If this is the .* operator, which is not overloadable, just +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13603) // create a built-in binary operator. +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13604) if (Opc == BO_PtrMemD) +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13605) return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 13606) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13607) // Build the overload set. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13608) OverloadCandidateSet CandidateSet( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13609) OpLoc, OverloadCandidateSet::CSK_Operator, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13610) OverloadCandidateSet::OperatorRewriteInfo(Op, AllowRewrittenCandidates)); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13611) if (DefaultedFn) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13612) CandidateSet.exclude(DefaultedFn); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13613) LookupOverloadedBinOp(CandidateSet, Op, Fns, Args, PerformADL); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13614) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13615) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13616) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13617) // Perform overload resolution. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13618) OverloadCandidateSet::iterator Best; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 13619) switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) { +1a99f441e64c8 (Sebastian Redl 2009-04-16 17:51:27 +0000 13620) case OR_Success: { +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13621) // We found a built-in operator or an overloaded operator. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13622) FunctionDecl *FnDecl = Best->Function; +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13623) +fcea7fbdba1bd (Richard Smith 2020-02-10 06:05:59 -0800 13624) bool IsReversed = Best->isReversed(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13625) if (IsReversed) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13626) std::swap(Args[0], Args[1]); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13627) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13628) if (FnDecl) { +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13629) Expr *Base = nullptr; +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13630) // We matched an overloaded operator. Build a call to that +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13631) // operator. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13632) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13633) OverloadedOperatorKind ChosenOp = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13634) FnDecl->getDeclName().getCXXOverloadedOperator(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13635) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13636) // C++2a [over.match.oper]p9: +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13637) // If a rewritten operator== candidate is selected by overload +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13638) // resolution for an operator@, its return type shall be cv bool +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13639) if (Best->RewriteKind && ChosenOp == OO_EqualEqual && +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13640) !FnDecl->getReturnType()->isBooleanType()) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13641) bool IsExtension = +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13642) FnDecl->getReturnType()->isIntegralOrUnscopedEnumerationType(); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13643) Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13644) : diag::err_ovl_rewrite_equalequal_not_bool) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13645) << FnDecl->getReturnType() << BinaryOperator::getOpcodeStr(Opc) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13646) << Args[0]->getSourceRange() << Args[1]->getSourceRange(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13647) Diag(FnDecl->getLocation(), diag::note_declared_at); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13648) if (!IsExtension) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13649) return ExprError(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13650) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13651) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13652) if (AllowRewrittenCandidates && !IsReversed && +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13653) CandidateSet.getRewriteInfo().isReversible()) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13654) // We could have reversed this operator, but didn't. Check if some +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13655) // reversed form was a viable candidate, and if so, if it had a +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13656) // better conversion for either parameter. If so, this call is +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13657) // formally ambiguous, and allowing it is an extension. +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13658) llvm::SmallVector AmbiguousWith; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13659) for (OverloadCandidate &Cand : CandidateSet) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13660) if (Cand.Viable && Cand.Function && Cand.isReversed() && +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13661) haveSameParameterTypes(Context, Cand.Function, FnDecl, 2)) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13662) for (unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13663) if (CompareImplicitConversionSequences( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13664) *this, OpLoc, Cand.Conversions[ArgIdx], +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13665) Best->Conversions[ArgIdx]) == +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13666) ImplicitConversionSequence::Better) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13667) AmbiguousWith.push_back(Cand.Function); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13668) break; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13669) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13670) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13671) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13672) } +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13673) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13674) if (!AmbiguousWith.empty()) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13675) bool AmbiguousWithSelf = +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13676) AmbiguousWith.size() == 1 && +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13677) declaresSameEntity(AmbiguousWith.front(), FnDecl); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13678) Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13679) << BinaryOperator::getOpcodeStr(Opc) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13680) << Args[0]->getType() << Args[1]->getType() << AmbiguousWithSelf +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13681) << Args[0]->getSourceRange() << Args[1]->getSourceRange(); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13682) if (AmbiguousWithSelf) { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13683) Diag(FnDecl->getLocation(), +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13684) diag::note_ovl_ambiguous_oper_binary_reversed_self); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13685) } else { +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13686) Diag(FnDecl->getLocation(), +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13687) diag::note_ovl_ambiguous_oper_binary_selected_candidate); +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13688) for (auto *F : AmbiguousWith) +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13689) Diag(F->getLocation(), +dc4259d5a3840 (Richard Smith 2020-03-20 13:19:26 -0700 13690) diag::note_ovl_ambiguous_oper_binary_reversed_candidate); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13691) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13692) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13693) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13694) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13695) // Convert the arguments. +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13696) if (CXXMethodDecl *Method = dyn_cast(FnDecl)) { +b3a4400554925 (John McCall 2010-01-28 01:42:12 +0000 13697) // Best->Access is only meaningful for class members. +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 13698) CheckMemberOperatorAccess(OpLoc, Args[0], Args[1], Best->FoundDecl); +b3a4400554925 (John McCall 2010-01-28 01:42:12 +0000 13699) +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13700) ExprResult Arg1 = +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13701) PerformCopyInitialization( +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13702) InitializedEntity::InitializeParameter(Context, +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13703) FnDecl->getParamDecl(0)), +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 13704) SourceLocation(), Args[1]); +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13705) if (Arg1.isInvalid()) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13706) return ExprError(); +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13707) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13708) ExprResult Arg0 = +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 13709) PerformObjectArgumentInitialization(Args[0], /*Qualifier=*/nullptr, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13710) Best->FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13711) if (Arg0.isInvalid()) +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13712) return ExprError(); +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13713) Base = Args[0] = Arg0.getAs(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13714) Args[1] = RHS = Arg1.getAs(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13715) } else { +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13716) // Convert the arguments. +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13717) ExprResult Arg0 = PerformCopyInitialization( +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13718) InitializedEntity::InitializeParameter(Context, +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13719) FnDecl->getParamDecl(0)), +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 13720) SourceLocation(), Args[0]); +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13721) if (Arg0.isInvalid()) +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13722) return ExprError(); +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13723) +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13724) ExprResult Arg1 = +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13725) PerformCopyInitialization( +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13726) InitializedEntity::InitializeParameter(Context, +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13727) FnDecl->getParamDecl(1)), +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 13728) SourceLocation(), Args[1]); +0a70c4d9a2e5f (Douglas Gregor 2009-12-22 21:44:34 +0000 13729) if (Arg1.isInvalid()) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13730) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13731) Args[0] = LHS = Arg0.getAs(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13732) Args[1] = RHS = Arg1.getAs(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13733) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13734) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13735) // Build the actual expression node. +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13736) ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 13737) Best->FoundDecl, Base, +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 13738) HadMultipleCandidates, OpLoc); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13739) if (FnExpr.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13740) return ExprError(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13741) +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13742) // Determine the result type. +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 13743) QualType ResultTy = FnDecl->getReturnType(); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13744) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13745) ResultTy = ResultTy.getNonLValueExprType(Context); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 13746) +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 13747) CXXOperatorCallExpr *TheCall = CXXOperatorCallExpr::Create( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13748) Context, ChosenOp, FnExpr.get(), Args, ResultTy, VK, OpLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 13749) CurFPFeatureOverrides(), Best->IsADLCandidate); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13750) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 13751) if (CheckCallReturnType(FnDecl->getReturnType(), OpLoc, TheCall, +e4f4b5e919adc (Anders Carlsson 2009-10-13 22:43:21 +0000 13752) FnDecl)) +e4f4b5e919adc (Anders Carlsson 2009-10-13 22:43:21 +0000 13753) return ExprError(); +e4f4b5e919adc (Anders Carlsson 2009-10-13 22:43:21 +0000 13754) +d24d5f2b79790 (Nick Lewycky 2013-01-24 02:03:08 +0000 13755) ArrayRef ArgsArray(Args, 2); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13756) const Expr *ImplicitThis = nullptr; +d24d5f2b79790 (Nick Lewycky 2013-01-24 02:03:08 +0000 13757) // Cut off the implicit 'this'. +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13758) if (isa(FnDecl)) { +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13759) ImplicitThis = ArgsArray[0]; +d24d5f2b79790 (Nick Lewycky 2013-01-24 02:03:08 +0000 13760) ArgsArray = ArgsArray.slice(1); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13761) } +36d0b2b49f7c8 (Richard Trieu 2015-01-13 02:32:02 +0000 13762) +36d0b2b49f7c8 (Richard Trieu 2015-01-13 02:32:02 +0000 13763) // Check for a self move. +36d0b2b49f7c8 (Richard Trieu 2015-01-13 02:32:02 +0000 13764) if (Op == OO_Equal) +36d0b2b49f7c8 (Richard Trieu 2015-01-13 02:32:02 +0000 13765) DiagnoseSelfMove(Args[0], Args[1], OpLoc); +36d0b2b49f7c8 (Richard Trieu 2015-01-13 02:32:02 +0000 13766) +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13767) if (ImplicitThis) { +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13768) QualType ThisType = Context.getPointerType(ImplicitThis->getType()); +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13769) QualType ThisTypeFromDecl = Context.getPointerType( +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13770) cast(FnDecl)->getThisObjectType()); +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13771) +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13772) CheckArgAlignment(OpLoc, FnDecl, "'this'", ThisType, +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13773) ThisTypeFromDecl); +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13774) } +7e5cea5b509f5 (Tomas Matheson 2021-02-19 17:33:56 +0000 13775) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13776) checkCall(FnDecl, nullptr, ImplicitThis, ArgsArray, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13777) isa(FnDecl), OpLoc, TheCall->getSourceRange(), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 13778) VariadicDoesNotApply); +d24d5f2b79790 (Nick Lewycky 2013-01-24 02:03:08 +0000 13779) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13780) ExprResult R = MaybeBindToTemporary(TheCall); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13781) if (R.isInvalid()) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13782) return ExprError(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13783) +5a5f5350e1cbe (Richard Smith 2020-06-29 19:02:47 -0700 13784) R = CheckForImmediateInvocation(R, FnDecl); +5a5f5350e1cbe (Richard Smith 2020-06-29 19:02:47 -0700 13785) if (R.isInvalid()) +5a5f5350e1cbe (Richard Smith 2020-06-29 19:02:47 -0700 13786) return ExprError(); +5a5f5350e1cbe (Richard Smith 2020-06-29 19:02:47 -0700 13787) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13788) // For a rewritten candidate, we've already reversed the arguments +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13789) // if needed. Perform the rest of the rewrite now. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13790) if ((Best->RewriteKind & CRK_DifferentOperator) || +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13791) (Op == OO_Spaceship && IsReversed)) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13792) if (Op == OO_ExclaimEqual) { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13793) assert(ChosenOp == OO_EqualEqual && "unexpected operator name"); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13794) R = CreateBuiltinUnaryOp(OpLoc, UO_LNot, R.get()); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13795) } else { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13796) assert(ChosenOp == OO_Spaceship && "unexpected operator name"); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13797) llvm::APSInt Zero(Context.getTypeSize(Context.IntTy), false); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13798) Expr *ZeroLiteral = +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13799) IntegerLiteral::Create(Context, Zero, Context.IntTy, OpLoc); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13800) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13801) Sema::CodeSynthesisContext Ctx; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13802) Ctx.Kind = Sema::CodeSynthesisContext::RewritingOperatorAsSpaceship; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13803) Ctx.Entity = FnDecl; +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13804) pushCodeSynthesisContext(Ctx); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13805) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13806) R = CreateOverloadedBinOp( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13807) OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(), +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13808) IsReversed ? R.get() : ZeroLiteral, PerformADL, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13809) /*AllowRewrittenCandidates=*/false); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13810) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13811) popCodeSynthesisContext(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13812) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13813) if (R.isInvalid()) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13814) return ExprError(); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13815) } else { +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13816) assert(ChosenOp == Op && "unexpected operator name"); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13817) } +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13818) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13819) // Make a note in the AST if we did any rewriting. +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13820) if (Best->RewriteKind != CRK_None) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13821) R = new (Context) CXXRewrittenBinaryOperator(R.get(), IsReversed); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13822) +5a5f5350e1cbe (Richard Smith 2020-06-29 19:02:47 -0700 13823) return R; +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13824) } else { +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13825) // We matched a built-in operator. Convert the arguments, then +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13826) // break out so that we will build the appropriate built-in +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13827) // operator node. +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13828) ExprResult ArgsRes0 = PerformImplicitConversion( +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13829) Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0], +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13830) AA_Passing, CCK_ForBuiltinOverloadedOp); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13831) if (ArgsRes0.isInvalid()) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13832) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13833) Args[0] = ArgsRes0.get(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13834) +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13835) ExprResult ArgsRes1 = PerformImplicitConversion( +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13836) Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1], +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 13837) AA_Passing, CCK_ForBuiltinOverloadedOp); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13838) if (ArgsRes1.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 13839) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 13840) Args[1] = ArgsRes1.get(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13841) break; +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13842) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13843) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13844) +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13845) case OR_No_Viable_Function: { +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13846) // C++ [over.match.oper]p9: +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13847) // If the operator is the operator , [...] and there are no +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13848) // viable functions, then the operator is assumed to be the +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13849) // built-in operator and interpreted according to clause 5. +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 13850) if (Opc == BO_Comma) +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13851) break; +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13852) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13853) // When defaulting an 'operator<=>', we can try to synthesize a three-way +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13854) // compare result using '==' and '<'. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13855) if (DefaultedFn && Opc == BO_Cmp) { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13856) ExprResult E = BuildSynthesizedThreeWayComparison(OpLoc, Fns, Args[0], +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13857) Args[1], DefaultedFn); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13858) if (E.isInvalid() || E.isUsable()) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13859) return E; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13860) } +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13861) +2a8c18d991188 (Alexander Kornienko 2018-04-06 15:14:32 +0000 13862) // For class as left operand for assignment or compound assignment +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13863) // operator do not fall through to handling in built-in, but report that +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 13864) // no overloaded assignment operator found +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 13865) ExprResult Result = ExprError(); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13866) StringRef OpcStr = BinaryOperator::getOpcodeStr(Opc); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13867) auto Cands = CandidateSet.CompleteCandidates(*this, OCD_AllCandidates, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13868) Args, OpLoc); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13869) if (Args[0]->getType()->isRecordType() && +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 13870) Opc >= BO_Assign && Opc <= BO_OrAssign) { +027de2adcd43f (Sebastian Redl 2009-05-21 11:50:50 +0000 13871) Diag(OpLoc, diag::err_ovl_no_viable_oper) +027de2adcd43f (Sebastian Redl 2009-05-21 11:50:50 +0000 13872) << BinaryOperator::getOpcodeStr(Opc) +e9899d9769661 (Douglas Gregor 2009-08-26 17:08:25 +0000 13873) << Args[0]->getSourceRange() << Args[1]->getSourceRange(); +a31efa07ff703 (Eli Friedman 2013-08-28 20:35:35 +0000 13874) if (Args[0]->getType()->isIncompleteType()) { +a31efa07ff703 (Eli Friedman 2013-08-28 20:35:35 +0000 13875) Diag(OpLoc, diag::note_assign_lhs_incomplete) +a31efa07ff703 (Eli Friedman 2013-08-28 20:35:35 +0000 13876) << Args[0]->getType() +a31efa07ff703 (Eli Friedman 2013-08-28 20:35:35 +0000 13877) << Args[0]->getSourceRange() << Args[1]->getSourceRange(); +a31efa07ff703 (Eli Friedman 2013-08-28 20:35:35 +0000 13878) } +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13879) } else { +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13880) // This is an erroneous use of an operator which can be overloaded by +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13881) // a non-member function. Check for non-member operators which were +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13882) // defined too late to be candidates. +b24b9aa298311 (Ahmed Charles 2012-02-25 11:00:22 +0000 13883) if (DiagnoseTwoPhaseOperatorLookup(*this, Op, OpLoc, Args)) +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13884) // FIXME: Recover by calling the found function. +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13885) return ExprError(); +998a591e32613 (Richard Smith 2011-06-05 22:42:48 +0000 13886) +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13887) // No viable function; try to create a built-in operation, which will +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13888) // produce an error. Then, show the non-viable candidates. +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13889) Result = CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]); +027de2adcd43f (Sebastian Redl 2009-05-21 11:50:50 +0000 13890) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 13891) assert(Result.isInvalid() && +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13892) "C++ binary operator overloading is missing candidates!"); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13893) CandidateSet.NoteCandidates(*this, Args, Cands, OpcStr, OpLoc); +62b95d88dc14f (Benjamin Kramer 2012-08-23 21:35:17 +0000 13894) return Result; +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13895) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13896) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13897) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13898) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13899) PartialDiagnosticAt(OpLoc, PDiag(diag::err_ovl_ambiguous_oper_binary) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13900) << BinaryOperator::getOpcodeStr(Opc) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13901) << Args[0]->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13902) << Args[1]->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13903) << Args[0]->getSourceRange() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13904) << Args[1]->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 13905) *this, OCD_AmbiguousCandidates, Args, BinaryOperator::getOpcodeStr(Opc), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13906) OpLoc); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13907) return ExprError(); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13908) +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13909) case OR_Deleted: +74f7d50f6a5b2 (Douglas Gregor 2012-02-15 19:33:52 +0000 13910) if (isImplicitlyDeleted(Best->Function)) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13911) FunctionDecl *DeletedFD = Best->Function; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13912) DefaultedFunctionKind DFK = getDefaultedFunctionKind(DeletedFD); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13913) if (DFK.isSpecialMember()) { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13914) Diag(OpLoc, diag::err_ovl_deleted_special_oper) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13915) << Args[0]->getType() << DFK.asSpecialMember(); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13916) } else { +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13917) assert(DFK.isComparison()); +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13918) Diag(OpLoc, diag::err_ovl_deleted_comparison) +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13919) << Args[0]->getType() << DeletedFD; +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13920) } +6f1e2c6d19a7f (Richard Smith 2012-04-02 20:59:25 +0000 13921) +de1a487402585 (Richard Smith 2012-12-28 12:23:24 +0000 13922) // The user probably meant to call this special member. Just +de1a487402585 (Richard Smith 2012-12-28 12:23:24 +0000 13923) // explain why it's deleted. +5253d9138eb31 (Richard Smith 2019-11-06 12:03:12 -0800 13924) NoteDeletedFunction(DeletedFD); +de1a487402585 (Richard Smith 2012-12-28 12:23:24 +0000 13925) return ExprError(); +74f7d50f6a5b2 (Douglas Gregor 2012-02-15 19:33:52 +0000 13926) } +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13927) CandidateSet.NoteCandidates( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13928) PartialDiagnosticAt( +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13929) OpLoc, PDiag(diag::err_ovl_deleted_oper) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13930) << getOperatorSpelling(Best->Function->getDeclName() +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13931) .getCXXOverloadedOperator()) +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13932) << Args[0]->getSourceRange() +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 13933) << Args[1]->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13934) *this, OCD_AllCandidates, Args, BinaryOperator::getOpcodeStr(Opc), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 13935) OpLoc); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13936) return ExprError(); +0d1da2298aaa8 (John McCall 2010-01-12 00:44:57 +0000 13937) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13938) +66950a32d9083 (Douglas Gregor 2009-09-30 21:46:01 +0000 13939) // We matched a built-in operator; build it. +e9899d9769661 (Douglas Gregor 2009-08-26 17:08:25 +0000 13940) return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]); +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13941) } +1baf54e1aa8a1 (Douglas Gregor 2009-03-13 18:40:31 +0000 13942) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13943) ExprResult Sema::BuildSynthesizedThreeWayComparison( +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13944) SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13945) FunctionDecl *DefaultedFn) { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13946) const ComparisonCategoryInfo *Info = +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13947) Context.CompCategories.lookupInfoForType(DefaultedFn->getReturnType()); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13948) // If we're not producing a known comparison category type, we can't +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13949) // synthesize a three-way comparison. Let the caller diagnose this. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13950) if (!Info) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13951) return ExprResult((Expr*)nullptr); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13952) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13953) // If we ever want to perform this synthesis more generally, we will need to +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13954) // apply the temporary materialization conversion to the operands. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13955) assert(LHS->isGLValue() && RHS->isGLValue() && +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13956) "cannot use prvalue expressions more than once"); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13957) Expr *OrigLHS = LHS; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13958) Expr *OrigRHS = RHS; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13959) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13960) // Replace the LHS and RHS with OpaqueValueExprs; we're going to refer to +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13961) // each of them multiple times below. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13962) LHS = new (Context) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13963) OpaqueValueExpr(LHS->getExprLoc(), LHS->getType(), LHS->getValueKind(), +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13964) LHS->getObjectKind(), LHS); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13965) RHS = new (Context) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13966) OpaqueValueExpr(RHS->getExprLoc(), RHS->getType(), RHS->getValueKind(), +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13967) RHS->getObjectKind(), RHS); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13968) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13969) ExprResult Eq = CreateOverloadedBinOp(OpLoc, BO_EQ, Fns, LHS, RHS, true, true, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13970) DefaultedFn); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13971) if (Eq.isInvalid()) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13972) return ExprError(); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13973) +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13974) ExprResult Less = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, LHS, RHS, true, +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13975) true, DefaultedFn); +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13976) if (Less.isInvalid()) +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13977) return ExprError(); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13978) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13979) ExprResult Greater; +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13980) if (Info->isPartial()) { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13981) Greater = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, RHS, LHS, true, true, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13982) DefaultedFn); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13983) if (Greater.isInvalid()) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13984) return ExprError(); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13985) } +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13986) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13987) // Form the list of comparisons we're going to perform. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13988) struct Comparison { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13989) ExprResult Cmp; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13990) ComparisonCategoryResult Result; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13991) } Comparisons[4] = +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13992) { {Eq, Info->isStrong() ? ComparisonCategoryResult::Equal +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13993) : ComparisonCategoryResult::Equivalent}, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13994) {Less, ComparisonCategoryResult::Less}, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13995) {Greater, ComparisonCategoryResult::Greater}, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13996) {ExprResult(), ComparisonCategoryResult::Unordered}, +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13997) }; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 13998) +f495de43bd5da (Richard Smith 2019-12-16 17:40:03 -0800 13999) int I = Info->isPartial() ? 3 : 2; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14000) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14001) // Combine the comparisons with suitable conditional expressions. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14002) ExprResult Result; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14003) for (; I >= 0; --I) { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14004) // Build a reference to the comparison category constant. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14005) auto *VI = Info->lookupValueInfo(Comparisons[I].Result); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14006) // FIXME: Missing a constant for a comparison category. Diagnose this? +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14007) if (!VI) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14008) return ExprResult((Expr*)nullptr); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14009) ExprResult ThisResult = +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14010) BuildDeclarationNameExpr(CXXScopeSpec(), DeclarationNameInfo(), VI->VD); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14011) if (ThisResult.isInvalid()) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14012) return ExprError(); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14013) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14014) // Build a conditional unless this is the final case. +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14015) if (Result.get()) { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14016) Result = ActOnConditionalOp(OpLoc, OpLoc, Comparisons[I].Cmp.get(), +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14017) ThisResult.get(), Result.get()); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14018) if (Result.isInvalid()) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14019) return ExprError(); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14020) } else { +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14021) Result = ThisResult; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14022) } +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14023) } +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14024) +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14025) // Build a PseudoObjectExpr to model the rewriting of an <=> operator, and to +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14026) // bind the OpaqueValueExprs before they're (repeatedly) used. +2ba4e3a4598b1 (Melanie Blower 2020-04-10 13:34:46 -0700 14027) Expr *SyntacticForm = BinaryOperator::Create( +2ba4e3a4598b1 (Melanie Blower 2020-04-10 13:34:46 -0700 14028) Context, OrigLHS, OrigRHS, BO_Cmp, Result.get()->getType(), +2ba4e3a4598b1 (Melanie Blower 2020-04-10 13:34:46 -0700 14029) Result.get()->getValueKind(), Result.get()->getObjectKind(), OpLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14030) CurFPFeatureOverrides()); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14031) Expr *SemanticForm[] = {LHS, RHS, Result.get()}; +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14032) return PseudoObjectExpr::Create(Context, SyntacticForm, SemanticForm, 2); +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14033) } +cafc7416baf7e (Richard Smith 2019-12-04 15:25:27 -0800 14034) +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 14035) ExprResult +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14036) Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14037) SourceLocation RLoc, +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14038) Expr *Base, Expr *Idx) { +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14039) Expr *Args[2] = { Base, Idx }; +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14040) DeclarationName OpName = +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14041) Context.DeclarationNames.getCXXOperatorName(OO_Subscript); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14042) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14043) // If either side is type-dependent, create an appropriate dependent +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14044) // expression. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14045) if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) { +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14046) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14047) CXXRecordDecl *NamingClass = nullptr; // lookup ignores member operators +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 14048) // CHECKME: no 'operator' keyword? +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 14049) DeclarationNameInfo OpNameInfo(OpName, LLoc); +d6d2f18905433 (Abramo Bagnara 2010-08-11 22:01:17 +0000 14050) OpNameInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc)); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 14051) ExprResult Fn = CreateUnresolvedLookupExpr( +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 14052) NamingClass, NestedNameSpecifierLoc(), OpNameInfo, UnresolvedSet<0>()); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 14053) if (Fn.isInvalid()) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 14054) return ExprError(); +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 14055) // Can't add any actual overloads yet +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14056) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 14057) return CXXOperatorCallExpr::Create(Context, OO_Subscript, Fn.get(), Args, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 14058) Context.DependentTy, VK_PRValue, RLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14059) CurFPFeatureOverrides()); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14060) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14061) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14062) // Handle placeholders on both operands. +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14063) if (checkPlaceholderForOverload(*this, Args[0])) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14064) return ExprError(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14065) if (checkPlaceholderForOverload(*this, Args[1])) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14066) return ExprError(); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 14067) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14068) // Build an empty overload set. +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14069) OverloadCandidateSet CandidateSet(LLoc, OverloadCandidateSet::CSK_Operator); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14070) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14071) // Subscript can only be overloaded as a member function. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14072) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14073) // Add operator candidates that are member functions. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 14074) AddMemberOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14075) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14076) // Add builtin operator candidates. +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 14077) AddBuiltinOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14078) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14079) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14080) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14081) // Perform overload resolution. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14082) OverloadCandidateSet::iterator Best; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 14083) switch (CandidateSet.BestViableFunction(*this, LLoc, Best)) { +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14084) case OR_Success: { +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14085) // We found a built-in operator or an overloaded operator. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14086) FunctionDecl *FnDecl = Best->Function; +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14087) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14088) if (FnDecl) { +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14089) // We matched an overloaded operator. Build a call to that +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14090) // operator. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14091) +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 14092) CheckMemberOperatorAccess(LLoc, Args[0], Args[1], Best->FoundDecl); +58cc69d4c1516 (John McCall 2010-01-27 01:50:18 +0000 14093) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14094) // Convert the arguments. +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14095) CXXMethodDecl *Method = cast(FnDecl); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14096) ExprResult Arg0 = +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14097) PerformObjectArgumentInitialization(Args[0], /*Qualifier=*/nullptr, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14098) Best->FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14099) if (Arg0.isInvalid()) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14100) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14101) Args[0] = Arg0.get(); +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14102) +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14103) // Convert the arguments. +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 14104) ExprResult InputInit +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14105) = PerformCopyInitialization(InitializedEntity::InitializeParameter( +8fb87aec78b52 (Fariborz Jahanian 2010-09-24 17:30:16 +0000 14106) Context, +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14107) FnDecl->getParamDecl(0)), +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14108) SourceLocation(), +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 14109) Args[1]); +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14110) if (InputInit.isInvalid()) +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14111) return ExprError(); +a68e51e3a1803 (Anders Carlsson 2010-01-29 18:37:50 +0000 14112) +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14113) Args[1] = InputInit.getAs(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14114) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14115) // Build the actual expression node. +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14116) DeclarationNameInfo OpLocInfo(OpName, LLoc); +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14117) OpLocInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc)); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14118) ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl, +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 14119) Best->FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 14120) Base, +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14121) HadMultipleCandidates, +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14122) OpLocInfo.getLoc(), +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14123) OpLocInfo.getInfo()); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14124) if (FnExpr.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14125) return ExprError(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14126) +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 14127) // Determine the result type +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14128) QualType ResultTy = FnDecl->getReturnType(); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 14129) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 14130) ResultTy = ResultTy.getNonLValueExprType(Context); +c156470be5123 (Richard Smith 2013-11-15 02:58:23 +0000 14131) +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14132) CXXOperatorCallExpr *TheCall = CXXOperatorCallExpr::Create( +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14133) Context, OO_Subscript, FnExpr.get(), Args, ResultTy, VK, RLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14134) CurFPFeatureOverrides()); +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14135) if (CheckCallReturnType(FnDecl->getReturnType(), LLoc, TheCall, FnDecl)) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14136) return ExprError(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14137) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14138) if (CheckFunctionCall(Method, TheCall, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14139) Method->getType()->castAs())) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14140) return ExprError(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14141) +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14142) return MaybeBindToTemporary(TheCall); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14143) } else { +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14144) // We matched a built-in operator. Convert the arguments, then +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14145) // break out so that we will build the appropriate built-in +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14146) // operator node. +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14147) ExprResult ArgsRes0 = PerformImplicitConversion( +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14148) Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0], +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14149) AA_Passing, CCK_ForBuiltinOverloadedOp); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14150) if (ArgsRes0.isInvalid()) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14151) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14152) Args[0] = ArgsRes0.get(); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14153) +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14154) ExprResult ArgsRes1 = PerformImplicitConversion( +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14155) Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1], +1ef7554efd1ad (Richard Smith 2018-06-27 20:30:34 +0000 14156) AA_Passing, CCK_ForBuiltinOverloadedOp); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14157) if (ArgsRes1.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14158) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14159) Args[1] = ArgsRes1.get(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14160) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14161) break; +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14162) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14163) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14164) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14165) case OR_No_Viable_Function: { +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14166) PartialDiagnostic PD = CandidateSet.empty() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14167) ? (PDiag(diag::err_ovl_no_oper) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14168) << Args[0]->getType() << /*subscript*/ 0 +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14169) << Args[0]->getSourceRange() << Args[1]->getSourceRange()) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14170) : (PDiag(diag::err_ovl_no_viable_subscript) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14171) << Args[0]->getType() << Args[0]->getSourceRange() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14172) << Args[1]->getSourceRange()); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14173) CandidateSet.NoteCandidates(PartialDiagnosticAt(LLoc, PD), *this, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14174) OCD_AllCandidates, Args, "[]", LLoc); +0237485287e9b (John McCall 2010-01-07 02:04:15 +0000 14175) return ExprError(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14176) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14177) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14178) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14179) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14180) PartialDiagnosticAt(LLoc, PDiag(diag::err_ovl_ambiguous_oper_binary) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14181) << "[]" << Args[0]->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14182) << Args[1]->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14183) << Args[0]->getSourceRange() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14184) << Args[1]->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 14185) *this, OCD_AmbiguousCandidates, Args, "[]", LLoc); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14186) return ExprError(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14187) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14188) case OR_Deleted: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14189) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14190) PartialDiagnosticAt(LLoc, PDiag(diag::err_ovl_deleted_oper) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14191) << "[]" << Args[0]->getSourceRange() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14192) << Args[1]->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14193) *this, OCD_AllCandidates, Args, "[]", LLoc); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14194) return ExprError(); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14195) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14196) +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14197) // We matched a built-in operator; build it. +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14198) return CreateBuiltinArraySubscriptExpr(Args[0], LLoc, Args[1], RLoc); +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14199) } +adba46edc224c (Sebastian Redl 2009-10-29 20:17:01 +0000 14200) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14201) /// BuildCallToMemberFunction - Build a call to a member +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14202) /// function. MemExpr is the expression that refers to the member +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14203) /// function (and includes the object parameter), Args/NumArgs are the +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14204) /// arguments to the function call (not including the object +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14205) /// parameter). The caller needs to validate that the member +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14206) /// expression refers to a non-static member function or an overloaded +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14207) /// member function. +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14208) ExprResult Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE, +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14209) SourceLocation LParenLoc, +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14210) MultiExprArg Args, +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14211) SourceLocation RParenLoc, +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14212) bool AllowRecovery) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14213) assert(MemExprE->getType() == Context.BoundMemberTy || +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14214) MemExprE->getType() == Context.OverloadTy); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14215) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14216) // Dig out the member expression. This holds both the object +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14217) // argument and the member function we're referring to. +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14218) Expr *NakedMemExpr = MemExprE->IgnoreParens(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14219) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14220) // Determine whether this is a call to a pointer-to-member function. +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14221) if (BinaryOperator *op = dyn_cast(NakedMemExpr)) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14222) assert(op->getType() == Context.BoundMemberTy); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14223) assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14224) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14225) QualType fnType = +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14226) op->getRHS()->getType()->castAs()->getPointeeType(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14227) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14228) const FunctionProtoType *proto = fnType->castAs(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14229) QualType resultType = proto->getCallResultType(Context); +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14230) ExprValueKind valueKind = Expr::getValueKindForType(proto->getReturnType()); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14231) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14232) // Check that the object type isn't more qualified than the +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14233) // member function we're calling. +c61eaa5920161 (Anastasia Stulova 2019-01-28 11:37:49 +0000 14234) Qualifiers funcQuals = proto->getMethodQuals(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14235) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14236) QualType objectType = op->getLHS()->getType(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14237) if (op->getOpcode() == BO_PtrMemI) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14238) objectType = objectType->castAs()->getPointeeType(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14239) Qualifiers objectQuals = objectType.getQualifiers(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14240) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14241) Qualifiers difference = objectQuals - funcQuals; +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14242) difference.removeObjCGCAttr(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14243) difference.removeAddressSpace(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14244) if (difference) { +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14245) std::string qualsString = difference.getAsString(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14246) Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14247) << fnType.getUnqualifiedType() +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14248) << qualsString +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14249) << (qualsString.find(' ') == std::string::npos ? 1 : 2); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14250) } +35a6ef4c35cca (Nick Lewycky 2014-01-11 02:50:57 +0000 14251) +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14252) CXXMemberCallExpr *call = CXXMemberCallExpr::Create( +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14253) Context, MemExprE, Args, resultType, valueKind, RParenLoc, +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14254) CurFPFeatureOverrides(), proto->getNumParams()); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14255) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14256) if (CheckCallReturnType(proto->getReturnType(), op->getRHS()->getBeginLoc(), +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14257) call, nullptr)) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14258) return ExprError(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14259) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14260) if (ConvertArgumentsForCall(call, op, nullptr, proto, Args, RParenLoc)) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14261) return ExprError(); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14262) +9be9c6804f514 (Richard Trieu 2013-06-22 02:30:38 +0000 14263) if (CheckOtherCall(call, proto)) +9be9c6804f514 (Richard Trieu 2013-06-22 02:30:38 +0000 14264) return ExprError(); +9be9c6804f514 (Richard Trieu 2013-06-22 02:30:38 +0000 14265) +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14266) return MaybeBindToTemporary(call); +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14267) } +0009fcc39e19e (John McCall 2011-04-26 20:42:42 +0000 14268) +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14269) // We only try to build a recovery expr at this level if we can preserve +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14270) // the return type, otherwise we return ExprError() and let the caller +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14271) // recover. +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14272) auto BuildRecoveryExpr = [&](QualType Type) { +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14273) if (!AllowRecovery) +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14274) return ExprError(); +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14275) std::vector SubExprs = {MemExprE}; +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14276) llvm::for_each(Args, [&SubExprs](Expr *E) { SubExprs.push_back(E); }); +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14277) return CreateRecoveryExpr(MemExprE->getBeginLoc(), RParenLoc, SubExprs, +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14278) Type); +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14279) }; +ced8bdf74a4f2 (David Majnemer 2015-02-25 17:36:15 +0000 14280) if (isa(NakedMemExpr)) +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 14281) return CallExpr::Create(Context, MemExprE, Args, Context.VoidTy, VK_PRValue, +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14282) RParenLoc, CurFPFeatureOverrides()); +ced8bdf74a4f2 (David Majnemer 2015-02-25 17:36:15 +0000 14283) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14284) UnbridgedCastsSet UnbridgedCasts; +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 14285) if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14286) return ExprError(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14287) +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14288) MemberExpr *MemExpr; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14289) CXXMethodDecl *Method = nullptr; +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14290) DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_public); +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14291) NestedNameSpecifier *Qualifier = nullptr; +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14292) if (isa(NakedMemExpr)) { +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14293) MemExpr = cast(NakedMemExpr); +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14294) Method = cast(MemExpr->getMemberDecl()); +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 14295) FoundDecl = MemExpr->getFoundDecl(); +cc3f325fa69e7 (Douglas Gregor 2010-03-03 23:55:11 +0000 14296) Qualifier = MemExpr->getQualifier(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14297) UnbridgedCasts.restore(); +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14298) } else { +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14299) UnresolvedMemberExpr *UnresExpr = cast(NakedMemExpr); +cc3f325fa69e7 (Douglas Gregor 2010-03-03 23:55:11 +0000 14300) Qualifier = UnresExpr->getQualifier(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14301) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14302) QualType ObjectType = UnresExpr->getBaseType(); +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14303) Expr::Classification ObjectClassification +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14304) = UnresExpr->isArrow()? Expr::Classification::makeSimpleLValue() +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14305) : UnresExpr->getBase()->Classify(Context); +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14306) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14307) // Add overload candidates +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14308) OverloadCandidateSet CandidateSet(UnresExpr->getMemberLoc(), +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14309) OverloadCandidateSet::CSK_Normal); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14310) +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14311) // FIXME: avoid copy. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14312) TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14313) if (UnresExpr->hasExplicitTemplateArgs()) { +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14314) UnresExpr->copyTemplateArgumentsInto(TemplateArgsBuffer); +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14315) TemplateArgs = &TemplateArgsBuffer; +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14316) } +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14317) +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14318) for (UnresolvedMemberExpr::decls_iterator I = UnresExpr->decls_begin(), +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14319) E = UnresExpr->decls_end(); I != E; ++I) { +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14320) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14321) NamedDecl *Func = *I; +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14322) CXXRecordDecl *ActingDC = cast(Func->getDeclContext()); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14323) if (isa(Func)) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14324) Func = cast(Func)->getTargetDecl(); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14325) +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14326) +64225794119ee (Francois Pichet 2011-01-18 05:04:39 +0000 14327) // Microsoft supports direct constructor calls. +bbafb8a745736 (David Blaikie 2012-03-11 07:00:24 +0000 14328) if (getLangOpts().MicrosoftExt && isa(Func)) { +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 14329) AddOverloadCandidate(cast(Func), I.getPair(), Args, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 14330) CandidateSet, +76b9027f352a8 (Richard Smith 2019-05-09 03:59:21 +0000 14331) /*SuppressUserConversions*/ false); +64225794119ee (Francois Pichet 2011-01-18 05:04:39 +0000 14332) } else if ((Method = dyn_cast(Func))) { +d33198420ddad (Douglas Gregor 2009-10-24 04:59:53 +0000 14333) // If explicit template arguments were provided, we can't call a +d33198420ddad (Douglas Gregor 2009-10-24 04:59:53 +0000 14334) // non-template member function. +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14335) if (TemplateArgs) +d33198420ddad (Douglas Gregor 2009-10-24 04:59:53 +0000 14336) continue; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14337) +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 14338) AddMethodCandidate(Method, I.getPair(), ActingDC, ObjectType, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14339) ObjectClassification, Args, CandidateSet, +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14340) /*SuppressUserConversions=*/false); +6b51f28e82646 (John McCall 2009-11-23 01:53:49 +0000 14341) } else { +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 14342) AddMethodTemplateCandidate( +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 14343) cast(Func), I.getPair(), ActingDC, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14344) TemplateArgs, ObjectType, ObjectClassification, Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 14345) /*SuppressUserConversions=*/false); +6b51f28e82646 (John McCall 2009-11-23 01:53:49 +0000 14346) } +5ed5ae476e5c7 (Douglas Gregor 2009-08-21 18:42:58 +0000 14347) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14348) +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14349) DeclarationName DeclName = UnresExpr->getMemberName(); +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14350) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14351) UnbridgedCasts.restore(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14352) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14353) OverloadCandidateSet::iterator Best; +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14354) bool Succeeded = false; +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14355) switch (CandidateSet.BestViableFunction(*this, UnresExpr->getBeginLoc(), +9331ed89f8d34 (Nick Lewycky 2010-11-20 01:29:55 +0000 14356) Best)) { +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14357) case OR_Success: +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14358) Method = cast(Best->Function); +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 14359) FoundDecl = Best->FoundDecl; +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 14360) CheckUnresolvedMemberAccess(UnresExpr, Best->FoundDecl); +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 14361) if (DiagnoseUseOfDecl(Best->FoundDecl, UnresExpr->getNameLoc())) +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14362) break; +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14363) // If FoundDecl is different from Method (such as if one is a template +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14364) // and the other a specialization), make sure DiagnoseUseOfDecl is +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14365) // called on both. +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14366) // FIXME: This would be more comprehensively addressed by modifying +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14367) // DiagnoseUseOfDecl to accept both the FoundDecl and the decl +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14368) // being used. +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14369) if (Method != FoundDecl.getDecl() && +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14370) DiagnoseUseOfDecl(Method, UnresExpr->getNameLoc())) +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14371) break; +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14372) Succeeded = true; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14373) break; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14374) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14375) case OR_No_Viable_Function: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14376) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14377) PartialDiagnosticAt( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14378) UnresExpr->getMemberLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14379) PDiag(diag::err_ovl_no_viable_member_function_in_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14380) << DeclName << MemExprE->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14381) *this, OCD_AllCandidates, Args); +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14382) break; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14383) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14384) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14385) PartialDiagnosticAt(UnresExpr->getMemberLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14386) PDiag(diag::err_ovl_ambiguous_member_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14387) << DeclName << MemExprE->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 14388) *this, OCD_AmbiguousCandidates, Args); +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14389) break; +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14390) case OR_Deleted: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14391) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14392) PartialDiagnosticAt(UnresExpr->getMemberLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14393) PDiag(diag::err_ovl_deleted_member_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14394) << DeclName << MemExprE->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14395) *this, OCD_AllCandidates, Args); +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14396) break; +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14397) } +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14398) // Overload resolution fails, try to recover. +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14399) if (!Succeeded) +6326b098852be (Haojian Wu 2020-12-14 08:45:13 +0100 14400) return BuildRecoveryExpr(chooseRecoveryType(CandidateSet, &Best)); +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14401) +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 14402) MemExprE = FixOverloadedFunctionReference(MemExprE, FoundDecl, Method); +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14403) +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14404) // If overload resolution picked a static member, build a +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14405) // non-member call based on that function. +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14406) if (Method->isStatic()) { +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 14407) return BuildResolvedCallExpr(MemExprE, Method, LParenLoc, Args, +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 14408) RParenLoc); +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14409) } +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14410) +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 14411) MemExpr = cast(MemExprE->IgnoreParens()); +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14412) } +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14413) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14414) QualType ResultType = Method->getReturnType(); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 14415) ExprValueKind VK = Expr::getValueKindForType(ResultType); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 14416) ResultType = ResultType.getNonLValueExprType(Context); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 14417) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14418) assert(Method && "Member call to something that isn't a method?"); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 14419) const auto *Proto = Method->getType()->castAs(); +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14420) CXXMemberCallExpr *TheCall = CXXMemberCallExpr::Create( +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14421) Context, MemExprE, Args, ResultType, VK, RParenLoc, +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14422) CurFPFeatureOverrides(), Proto->getNumParams()); +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14423) +c4859baea4af6 (Anders Carlsson 2009-10-10 00:06:20 +0000 14424) // Check for a valid return type. +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14425) if (CheckCallReturnType(Method->getReturnType(), MemExpr->getMemberLoc(), +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14426) TheCall, Method)) +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14427) return BuildRecoveryExpr(ResultType); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14428) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14429) // Convert the object argument (for a non-static member function call). +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 14430) // We only need to do this if there was actually an overload; otherwise +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 14431) // it was done at lookup. +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14432) if (!Method->isStatic()) { +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14433) ExprResult ObjectArg = +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14434) PerformObjectArgumentInitialization(MemExpr->getBase(), Qualifier, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14435) FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14436) if (ObjectArg.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14437) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14438) MemExpr->setBase(ObjectArg.get()); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14439) } +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14440) +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14441) // Convert the rest of the arguments +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 14442) if (ConvertArgumentsForCall(TheCall, MemExpr, Method, Proto, Args, +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14443) RParenLoc)) +556e4eba4404a (Haojian Wu 2020-11-29 22:31:42 +0100 14444) return BuildRecoveryExpr(ResultType); +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14445) +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 14446) DiagnoseSentinelCalls(Method, LParenLoc, Args); +ff4b407009962 (Eli Friedman 2012-02-18 04:48:30 +0000 14447) +55ce352d4d011 (Richard Smith 2012-06-25 20:30:08 +0000 14448) if (CheckFunctionCall(Method, TheCall, Proto)) +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 14449) return ExprError(); +8c84c206d95e8 (Anders Carlsson 2009-08-16 03:42:12 +0000 14450) +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14451) // In the case the method to call was not selected by the overloading +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14452) // resolution process, we still need to handle the enable_if attribute. Do +0d546534d3e7e (George Burgess IV 2016-11-10 21:47:12 +0000 14453) // that here, so it will not hide previous -- and more relevant -- errors. +add6ab5084903 (George Burgess IV 2016-11-16 21:31:25 +0000 14454) if (auto *MemE = dyn_cast(NakedMemExpr)) { +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 14455) if (const EnableIfAttr *Attr = +0dfb43deb6d55 (Richard Smith 2020-05-28 15:02:18 -0700 14456) CheckEnableIf(Method, LParenLoc, Args, true)) { +add6ab5084903 (George Burgess IV 2016-11-16 21:31:25 +0000 14457) Diag(MemE->getMemberLoc(), +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14458) diag::err_ovl_no_viable_member_function_in_call) +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14459) << Method << Method->getSourceRange(); +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14460) Diag(Method->getLocation(), +177399e2277c3 (George Burgess IV 2017-01-09 04:12:14 +0000 14461) diag::note_ovl_candidate_disabled_by_function_cond_attr) +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14462) << Attr->getCond()->getSourceRange() << Attr->getMessage(); +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14463) return ExprError(); +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14464) } +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14465) } +aea6ade63a5e8 (George Burgess IV 2015-09-25 17:53:16 +0000 14466) +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14467) if ((isa(CurContext) || +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14468) isa(CurContext)) && +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14469) TheCall->getMethodDecl()->isPure()) { +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14470) const CXXMethodDecl *MD = TheCall->getMethodDecl(); +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14471) +ccb3738527581 (Davide Italiano 2015-07-14 23:36:10 +0000 14472) if (isa(MemExpr->getBase()->IgnoreParenCasts()) && +ccb3738527581 (Davide Italiano 2015-07-14 23:36:10 +0000 14473) MemExpr->performsVirtualDispatch(getLangOpts())) { +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14474) Diag(MemExpr->getBeginLoc(), +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14475) diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14476) << MD->getDeclName() << isa(CurContext) +eb10b065f2a87 (Bruno Ricci 2020-07-27 23:22:21 +0100 14477) << MD->getParent(); +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14478) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14479) Diag(MD->getBeginLoc(), diag::note_previous_decl) << MD->getDeclName(); +ccb3738527581 (Davide Italiano 2015-07-14 23:36:10 +0000 14480) if (getLangOpts().AppleKext) +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14481) Diag(MemExpr->getBeginLoc(), diag::note_pure_qualified_call_kext) +eb10b065f2a87 (Bruno Ricci 2020-07-27 23:22:21 +0100 14482) << MD->getParent() << MD->getDeclName(); +5925926a2fc0f (Chandler Carruth 2011-06-27 08:31:58 +0000 14483) } +47061ee5bc64f (Anders Carlsson 2011-05-06 14:25:31 +0000 14484) } +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14485) +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14486) if (CXXDestructorDecl *DD = +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14487) dyn_cast(TheCall->getMethodDecl())) { +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14488) // a->A::f() doesn't go through the vtable, except in AppleKext mode. +d35f706cc2849 (Justin Lebar 2016-07-12 23:23:01 +0000 14489) bool CallCanBeVirtual = !MemExpr->hasQualifier() || getLangOpts().AppleKext; +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14490) CheckVirtualDtorCall(DD, MemExpr->getBeginLoc(), /*IsDelete=*/false, +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14491) CallCanBeVirtual, /*WarnOnNonAbstractTypes=*/true, +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14492) MemExpr->getMemberLoc()); +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14493) } +5a9259caa9b78 (Nico Weber 2016-01-15 21:45:31 +0000 14494) +008e7bf92343b (Tyker 2020-02-04 19:23:33 +0100 14495) return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), +008e7bf92343b (Tyker 2020-02-04 19:23:33 +0100 14496) TheCall->getMethodDecl()); +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14497) } +97fd6e24c4e09 (Douglas Gregor 2008-12-22 05:46:06 +0000 14498) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14499) /// BuildCallToObjectOfClassType - Build a call to an object of class +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14500) /// type (C++ [over.call.object]), which can end up invoking an +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14501) /// overloaded function call operator (@c operator()) or performing a +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14502) /// user-defined conversion on the object argument. +faf5fb4b78c79 (John McCall 2010-08-26 23:41:50 +0000 14503) ExprResult +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14504) Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, +b0846b0f5101c (Douglas Gregor 2008-12-06 00:22:45 +0000 14505) SourceLocation LParenLoc, +d3b75560aa07b (Dmitri Gribenko 2013-05-09 23:32:58 +0000 14506) MultiExprArg Args, +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14507) SourceLocation RParenLoc) { +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14508) if (checkPlaceholderForOverload(*this, Obj)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14509) return ExprError(); +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 14510) ExprResult Object = Obj; +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14511) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14512) UnbridgedCastsSet UnbridgedCasts; +d3b75560aa07b (Dmitri Gribenko 2013-05-09 23:32:58 +0000 14513) if (checkArgPlaceholdersForOverload(*this, Args, UnbridgedCasts)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14514) return ExprError(); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 14515) +b58e51c304112 (Nico Weber 2014-11-19 05:21:39 +0000 14516) assert(Object.get()->getType()->isRecordType() && +b58e51c304112 (Nico Weber 2014-11-19 05:21:39 +0000 14517) "Requires object type argument"); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14518) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14519) // C++ [over.call.object]p1: +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14520) // If the primary-expression E in the function call syntax +44b83eea308ef (Eli Friedman 2009-08-05 19:21:58 +0000 14521) // evaluates to a class object of type "cv T", then the set of +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14522) // candidate functions includes at least the function call +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14523) // operators of T. The function call operators of T are obtained by +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14524) // ordinary lookup of the name operator() in the context of +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14525) // (E).operator(). +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14526) OverloadCandidateSet CandidateSet(LParenLoc, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14527) OverloadCandidateSet::CSK_Operator); +91f84216f78f5 (Douglas Gregor 2008-12-11 16:49:14 +0000 14528) DeclarationName OpName = Context.DeclarationNames.getCXXOperatorName(OO_Call); +c473cbb3b2316 (Douglas Gregor 2009-11-15 07:48:03 +0000 14529) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14530) if (RequireCompleteType(LParenLoc, Object.get()->getType(), +7bfb2d026ec99 (Douglas Gregor 2012-05-04 16:32:21 +0000 14531) diag::err_incomplete_object_call, Object.get())) +c473cbb3b2316 (Douglas Gregor 2009-11-15 07:48:03 +0000 14532) return true; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14533) +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 14534) const auto *Record = Object.get()->getType()->castAs(); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14535) LookupResult R(*this, OpName, LParenLoc, LookupOrdinaryName); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14536) LookupQualifiedName(R, Record->getDecl()); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14537) R.suppressDiagnostics(); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14538) +c473cbb3b2316 (Douglas Gregor 2009-11-15 07:48:03 +0000 14539) for (LookupResult::iterator Oper = R.begin(), OperEnd = R.end(); +358e7745ed8fd (Douglas Gregor 2009-11-07 17:23:56 +0000 14540) Oper != OperEnd; ++Oper) { +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14541) AddMethodCandidate(Oper.getPair(), Object.get()->getType(), +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14542) Object.get()->Classify(Context), Args, CandidateSet, +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 14543) /*SuppressUserConversion=*/false); +358e7745ed8fd (Douglas Gregor 2009-11-07 17:23:56 +0000 14544) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14545) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14546) // C++ [over.call.object]p2: +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14547) // In addition, for each (non-explicit in C++0x) conversion function +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14548) // declared in T of the form +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14549) // +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14550) // operator conversion-type-id () cv-qualifier; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14551) // +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14552) // where cv-qualifier is the same cv-qualification as, or a +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14553) // greater cv-qualification than, cv, and where conversion-type-id +f49fdf8337440 (Douglas Gregor 2008-11-20 13:33:37 +0000 14554) // denotes the type "pointer to function of (P1,...,Pn) returning +f49fdf8337440 (Douglas Gregor 2008-11-20 13:33:37 +0000 14555) // R", or the type "reference to pointer to function of +f49fdf8337440 (Douglas Gregor 2008-11-20 13:33:37 +0000 14556) // (P1,...,Pn) returning R", or the type "reference to function +f49fdf8337440 (Douglas Gregor 2008-11-20 13:33:37 +0000 14557) // of (P1,...,Pn) returning R", a surrogate call function [...] +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14558) // is also considered as a candidate function. Similarly, +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14559) // surrogate call functions are added to the set of candidate +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14560) // functions for each conversion function declared in an +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14561) // accessible base class provided the function is not hidden +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14562) // within T by another intervening declaration. +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 14563) const auto &Conversions = +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 14564) cast(Record->getDecl())->getVisibleConversionFunctions(); +b4ef66832dee0 (Benjamin Kramer 2015-02-06 17:25:10 +0000 14565) for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) { +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14566) NamedDecl *D = *I; +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14567) CXXRecordDecl *ActingContext = cast(D->getDeclContext()); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14568) if (isa(D)) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14569) D = cast(D)->getTargetDecl(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14570) +74ba25ca5a34e (Douglas Gregor 2009-10-21 06:18:39 +0000 14571) // Skip over templated conversion functions; they aren't +74ba25ca5a34e (Douglas Gregor 2009-10-21 06:18:39 +0000 14572) // surrogates. +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14573) if (isa(D)) +74ba25ca5a34e (Douglas Gregor 2009-10-21 06:18:39 +0000 14574) continue; +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14575) +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14576) CXXConversionDecl *Conv = cast(D); +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14577) if (!Conv->isExplicit()) { +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14578) // Strip the reference type (if any) and then the pointer type (if +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14579) // any) to get down to what might be a function type. +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14580) QualType ConvType = Conv->getConversionType().getNonReferenceType(); +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14581) if (const PointerType *ConvPtrType = ConvType->getAs()) +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14582) ConvType = ConvPtrType->getPointeeType(); +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14583) +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14584) if (const FunctionProtoType *Proto = ConvType->getAs()) +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14585) { +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14586) AddSurrogateCandidate(Conv, I.getPair(), ActingContext, Proto, +d3b75560aa07b (Dmitri Gribenko 2013-05-09 23:32:58 +0000 14587) Object.get(), Args, CandidateSet); +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14588) } +38b2d3fa3e49a (Douglas Gregor 2011-07-23 18:59:35 +0000 14589) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14590) } +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14591) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14592) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14593) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14594) // Perform overload resolution. +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14595) OverloadCandidateSet::iterator Best; +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 14596) switch (CandidateSet.BestViableFunction(*this, Object.get()->getBeginLoc(), +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 14597) Best)) { +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14598) case OR_Success: +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14599) // Overload resolution succeeded; we'll build the appropriate call +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14600) // below. +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14601) break; +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14602) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14603) case OR_No_Viable_Function: { +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14604) PartialDiagnostic PD = +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14605) CandidateSet.empty() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14606) ? (PDiag(diag::err_ovl_no_oper) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14607) << Object.get()->getType() << /*call*/ 1 +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14608) << Object.get()->getSourceRange()) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14609) : (PDiag(diag::err_ovl_no_viable_object_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14610) << Object.get()->getType() << Object.get()->getSourceRange()); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14611) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14612) PartialDiagnosticAt(Object.get()->getBeginLoc(), PD), *this, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14613) OCD_AllCandidates, Args); +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14614) break; +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14615) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14616) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14617) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14618) PartialDiagnosticAt(Object.get()->getBeginLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14619) PDiag(diag::err_ovl_ambiguous_object_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14620) << Object.get()->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14621) << Object.get()->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 14622) *this, OCD_AmbiguousCandidates, Args); +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14623) break; +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14624) +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14625) case OR_Deleted: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14626) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14627) PartialDiagnosticAt(Object.get()->getBeginLoc(), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14628) PDiag(diag::err_ovl_deleted_object_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14629) << Object.get()->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14630) << Object.get()->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14631) *this, OCD_AllCandidates, Args); +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14632) break; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14633) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14634) +b412e174db384 (Douglas Gregor 2010-07-25 18:17:45 +0000 14635) if (Best == CandidateSet.end()) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14636) return true; +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14637) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14638) UnbridgedCasts.restore(); +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14639) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14640) if (Best->Function == nullptr) { +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14641) // Since there is no function declaration, this is one of the +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14642) // surrogate candidates. Dig out the conversion function. +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14643) CXXConversionDecl *Conv +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14644) = cast( +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14645) Best->Conversions[0].UserDefined.ConversionFunction); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14646) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14647) CheckMemberOperatorAccess(LParenLoc, Object.get(), nullptr, +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14648) Best->FoundDecl); +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 14649) if (DiagnoseUseOfDecl(Best->FoundDecl, LParenLoc)) +22262abd78af0 (Richard Smith 2013-05-04 06:44:46 +0000 14650) return ExprError(); +fb9662ae71a2d (Simon Pilgrim 2017-06-01 18:17:18 +0000 14651) assert(Conv == Best->FoundDecl.getDecl() && +d667641542527 (Faisal Vali 2013-06-15 11:54:37 +0000 14652) "Found Decl & conversion-to-functionptr should be same, right?!"); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14653) // We selected one of the surrogate functions that converts the +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14654) // object parameter to a function pointer. Perform the conversion +255b85f03c5db (Richard Smith 2019-05-08 01:36:36 +0000 14655) // on the object argument, then let BuildCallExpr finish the job. +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14656) +774cf79987ccd (Fariborz Jahanian 2009-09-28 18:35:46 +0000 14657) // Create an implicit member expr to refer to the conversion operator. +78cfcb56a10e7 (Fariborz Jahanian 2009-09-28 23:23:40 +0000 14658) // and then call it. +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14659) ExprResult Call = BuildCXXMemberCallExpr(Object.get(), Best->FoundDecl, +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14660) Conv, HadMultipleCandidates); +668443efb1db5 (Douglas Gregor 2011-01-20 00:18:04 +0000 14661) if (Call.isInvalid()) +668443efb1db5 (Douglas Gregor 2011-01-20 00:18:04 +0000 14662) return ExprError(); +b0cf297654585 (Abramo Bagnara 2011-11-16 22:46:05 +0000 14663) // Record usage of conversion in an implicit cast. +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 14664) Call = ImplicitCastExpr::Create( +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 14665) Context, Call.get()->getType(), CK_UserDefinedConversion, Call.get(), +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 14666) nullptr, VK_PRValue, CurFPFeatureOverrides()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14667) +255b85f03c5db (Richard Smith 2019-05-08 01:36:36 +0000 14668) return BuildCallExpr(S, Call.get(), LParenLoc, Args, RParenLoc); +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14669) } +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14670) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14671) CheckMemberOperatorAccess(LParenLoc, Object.get(), nullptr, Best->FoundDecl); +49ec2e694c6e4 (John McCall 2010-01-28 01:54:34 +0000 14672) +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14673) // We found an overloaded operator(). Build a CXXOperatorCallExpr +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14674) // that calls this method, using Object for the implicit object +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14675) // parameter and passing along the remaining arguments. +ab7897ac44769 (Douglas Gregor 2008-11-19 22:57:39 +0000 14676) CXXMethodDecl *Method = cast(Best->Function); +1fefe417f0ffd (Nico Weber 2012-11-09 06:06:14 +0000 14677) +1fefe417f0ffd (Nico Weber 2012-11-09 06:06:14 +0000 14678) // An error diagnostic has already been printed when parsing the declaration. +9512d3f161860 (Nico Weber 2012-11-09 08:38:04 +0000 14679) if (Method->isInvalidDecl()) +1fefe417f0ffd (Nico Weber 2012-11-09 06:06:14 +0000 14680) return ExprError(); +1fefe417f0ffd (Nico Weber 2012-11-09 06:06:14 +0000 14681) +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 14682) const auto *Proto = Method->getType()->castAs(); +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 14683) unsigned NumParams = Proto->getNumParams(); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14684) +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14685) DeclarationNameInfo OpLocInfo( +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14686) Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc); +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14687) OpLocInfo.setCXXOperatorNameRange(SourceRange(LParenLoc, RParenLoc)); +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 14688) ExprResult NewFn = CreateFunctionRefExpr(*this, Method, Best->FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 14689) Obj, HadMultipleCandidates, +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14690) OpLocInfo.getLoc(), +a2a299e586bf3 (Argyrios Kyrtzidis 2012-02-08 01:21:13 +0000 14691) OpLocInfo.getInfo()); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14692) if (NewFn.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14693) return true; +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14694) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14695) // The number of argument slots to allocate in the call. If we have default +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14696) // arguments we need to allocate space for them as well. We additionally +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14697) // need one more slot for the object parameter. +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14698) unsigned NumArgsSlots = 1 + std::max(Args.size(), NumParams); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14699) +8b1a6bd8d05c3 (Benjamin Kramer 2013-09-25 13:10:11 +0000 14700) // Build the full argument list for the method call (the implicit object +8b1a6bd8d05c3 (Benjamin Kramer 2013-09-25 13:10:11 +0000 14701) // parameter is placed at the beginning of the list). +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14702) SmallVector MethodArgs(NumArgsSlots); +02a0acd0bc3e2 (Douglas Gregor 2009-01-13 05:10:00 +0000 14703) +a8a7d0f371619 (Chris Lattner 2009-04-12 08:11:20 +0000 14704) bool IsError = false; +a8a7d0f371619 (Chris Lattner 2009-04-12 08:11:20 +0000 14705) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14706) // Initialize the implicit object parameter. +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14707) ExprResult ObjRes = +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14708) PerformObjectArgumentInitialization(Object.get(), /*Qualifier=*/nullptr, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14709) Best->FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14710) if (ObjRes.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14711) IsError = true; +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14712) else +62b95d88dc14f (Benjamin Kramer 2012-08-23 21:35:17 +0000 14713) Object = ObjRes; +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14714) MethodArgs[0] = Object.get(); +a8a7d0f371619 (Chris Lattner 2009-04-12 08:11:20 +0000 14715) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14716) // Check the argument types. +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 14717) for (unsigned i = 0; i != NumParams; i++) { +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14718) Expr *Arg; +d3b75560aa07b (Dmitri Gribenko 2013-05-09 23:32:58 +0000 14719) if (i < Args.size()) { +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14720) Arg = Args[i]; +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14721) +02a0acd0bc3e2 (Douglas Gregor 2009-01-13 05:10:00 +0000 14722) // Pass the argument. +7c5fe48060c0d (Anders Carlsson 2010-01-29 18:43:53 +0000 14723) +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 14724) ExprResult InputInit +7c5fe48060c0d (Anders Carlsson 2010-01-29 18:43:53 +0000 14725) = PerformCopyInitialization(InitializedEntity::InitializeParameter( +8fb87aec78b52 (Fariborz Jahanian 2010-09-24 17:30:16 +0000 14726) Context, +7c5fe48060c0d (Anders Carlsson 2010-01-29 18:43:53 +0000 14727) Method->getParamDecl(i)), +b268a282a4f19 (John McCall 2010-08-23 23:25:46 +0000 14728) SourceLocation(), Arg); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14729) +7c5fe48060c0d (Anders Carlsson 2010-01-29 18:43:53 +0000 14730) IsError |= InputInit.isInvalid(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14731) Arg = InputInit.getAs(); +02a0acd0bc3e2 (Douglas Gregor 2009-01-13 05:10:00 +0000 14732) } else { +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 14733) ExprResult DefArg +1bc688dc6029f (Douglas Gregor 2009-11-09 19:27:57 +0000 14734) = BuildCXXDefaultArgExpr(LParenLoc, Method, Method->getParamDecl(i)); +1bc688dc6029f (Douglas Gregor 2009-11-09 19:27:57 +0000 14735) if (DefArg.isInvalid()) { +1bc688dc6029f (Douglas Gregor 2009-11-09 19:27:57 +0000 14736) IsError = true; +1bc688dc6029f (Douglas Gregor 2009-11-09 19:27:57 +0000 14737) break; +1bc688dc6029f (Douglas Gregor 2009-11-09 19:27:57 +0000 14738) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14739) +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14740) Arg = DefArg.getAs(); +02a0acd0bc3e2 (Douglas Gregor 2009-01-13 05:10:00 +0000 14741) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14742) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14743) MethodArgs[i + 1] = Arg; +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14744) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14745) +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14746) // If this is a variadic call, handle args passed through "...". +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14747) if (Proto->isVariadic()) { +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14748) // Promote the arguments (C99 6.5.2.2p7). +b3fd5cfa81b83 (Alp Toker 2014-01-21 00:32:38 +0000 14749) for (unsigned i = NumParams, e = Args.size(); i < e; i++) { +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14750) ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14751) nullptr); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14752) IsError |= Arg.isInvalid(); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14753) MethodArgs[i + 1] = Arg.get(); +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14754) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14755) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14756) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14757) if (IsError) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14758) return true; +a8a7d0f371619 (Chris Lattner 2009-04-12 08:11:20 +0000 14759) +d3b75560aa07b (Dmitri Gribenko 2013-05-09 23:32:58 +0000 14760) DiagnoseSentinelCalls(Method, LParenLoc, Args); +ff4b407009962 (Eli Friedman 2012-02-18 04:48:30 +0000 14761) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14762) // Once we've built TheCall, all of the expressions are properly owned. +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14763) QualType ResultTy = Method->getReturnType(); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14764) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14765) ResultTy = ResultTy.getNonLValueExprType(Context); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14766) +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14767) CXXOperatorCallExpr *TheCall = CXXOperatorCallExpr::Create( +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14768) Context, OO_Call, NewFn.get(), MethodArgs, ResultTy, VK, RParenLoc, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14769) CurFPFeatureOverrides()); +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14770) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14771) if (CheckCallReturnType(Method->getReturnType(), LParenLoc, TheCall, Method)) +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14772) return true; +6ef089d21c885 (Bruno Ricci 2018-12-03 13:23:56 +0000 14773) +55ce352d4d011 (Richard Smith 2012-06-25 20:30:08 +0000 14774) if (CheckFunctionCall(Method, TheCall, Proto)) +bc4c1078365b6 (Anders Carlsson 2009-08-16 01:56:34 +0000 14775) return true; +bc4c1078365b6 (Anders Carlsson 2009-08-16 01:56:34 +0000 14776) +008e7bf92343b (Tyker 2020-02-04 19:23:33 +0100 14777) return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), Method); +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14778) } +91cea0ad1e4cd (Douglas Gregor 2008-11-19 21:05:33 +0000 14779) +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14780) /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator-> +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14781) /// (if one exists), where @c Base is an expression of class type and +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14782) /// @c Member is the name of the member we're trying to find. +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 14783) ExprResult +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14784) Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14785) bool *NoArrowOperatorFound) { +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 14786) assert(Base->getType()->isRecordType() && +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 14787) "left-hand side must have class type"); +11289f4280768 (Mike Stump 2009-09-09 15:08:12 +0000 14788) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14789) if (checkPlaceholderForOverload(*this, Base)) +4124c4924d634 (John McCall 2011-10-17 18:40:02 +0000 14790) return ExprError(); +e26a872b02740 (John McCall 2010-12-04 08:14:53 +0000 14791) +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 14792) SourceLocation Loc = Base->getExprLoc(); +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 14793) +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14794) // C++ [over.ref]p1: +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14795) // +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14796) // [...] An expression x->m is interpreted as (x.operator->())->m +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14797) // for a class object x of type T if T::operator->() exists and if +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14798) // the operator is selected as the best match function by the +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14799) // overload resolution mechanism (13.3). +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 14800) DeclarationName OpName = +8e543b3d46932 (Chandler Carruth 2010-12-12 08:17:55 +0000 14801) Context.DeclarationNames.getCXXOperatorName(OO_Arrow); +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14802) OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Operator); +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14803) +bc077cf5897af (John McCall 2010-02-08 23:07:23 +0000 14804) if (RequireCompleteType(Loc, Base->getType(), +7bfb2d026ec99 (Douglas Gregor 2012-05-04 16:32:21 +0000 14805) diag::err_typecheck_incomplete_tag, Base)) +132e70bfa4352 (Eli Friedman 2009-11-18 01:28:03 +0000 14806) return ExprError(); +132e70bfa4352 (Eli Friedman 2009-11-18 01:28:03 +0000 14807) +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14808) LookupResult R(*this, OpName, OpLoc, LookupOrdinaryName); +ab9dbc1d124cd (Simon Pilgrim 2020-01-14 14:15:51 +0000 14809) LookupQualifiedName(R, Base->getType()->castAs()->getDecl()); +27b18f8144b7c (John McCall 2009-11-17 02:14:36 +0000 14810) R.suppressDiagnostics(); +78b549399413c (Anders Carlsson 2009-09-10 23:18:36 +0000 14811) +78b549399413c (Anders Carlsson 2009-09-10 23:18:36 +0000 14812) for (LookupResult::iterator Oper = R.begin(), OperEnd = R.end(); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14813) Oper != OperEnd; ++Oper) { +0282432039ab9 (Douglas Gregor 2011-01-26 19:30:28 +0000 14814) AddMethodCandidate(Oper.getPair(), Base->getType(), Base->Classify(Context), +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 14815) None, CandidateSet, /*SuppressUserConversion=*/false); +6e9f8f6374349 (John McCall 2009-12-03 04:06:58 +0000 14816) } +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14817) +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14818) bool HadMultipleCandidates = (CandidateSet.size() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 14819) +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14820) // Perform overload resolution. +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14821) OverloadCandidateSet::iterator Best; +5c32be0053403 (John McCall 2010-08-24 20:38:10 +0000 14822) switch (CandidateSet.BestViableFunction(*this, OpLoc, Best)) { +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14823) case OR_Success: +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14824) // Overload resolution succeeded; we'll build the call below. +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14825) break; +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14826) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14827) case OR_No_Viable_Function: { +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14828) auto Cands = CandidateSet.CompleteCandidates(*this, OCD_AllCandidates, Base); +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14829) if (CandidateSet.empty()) { +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14830) QualType BaseType = Base->getType(); +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14831) if (NoArrowOperatorFound) { +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14832) // Report this specific error to the caller instead of emitting a +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14833) // diagnostic, as requested. +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14834) *NoArrowOperatorFound = true; +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14835) return ExprError(); +0c51de4ab1ae1 (Kaelyn Uhrain 2013-07-31 17:38:24 +0000 14836) } +bad7fb09b2d16 (Kaelyn Uhrain 2013-07-15 19:54:54 +0000 14837) Diag(OpLoc, diag::err_typecheck_member_reference_arrow) +bad7fb09b2d16 (Kaelyn Uhrain 2013-07-15 19:54:54 +0000 14838) << BaseType << Base->getSourceRange(); +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14839) if (BaseType->isRecordType() && !BaseType->isPointerType()) { +bad7fb09b2d16 (Kaelyn Uhrain 2013-07-15 19:54:54 +0000 14840) Diag(OpLoc, diag::note_typecheck_member_reference_suggestion) +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14841) << FixItHint::CreateReplacement(OpLoc, "."); +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14842) } +1bb5dbf628889 (Kaelyn Uhrain 2013-07-11 22:38:30 +0000 14843) } else +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14844) Diag(OpLoc, diag::err_ovl_no_viable_oper) +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14845) << "operator->" << Base->getSourceRange(); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14846) CandidateSet.NoteCandidates(*this, Base, Cands); +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14847) return ExprError(); +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14848) } +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14849) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14850) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14851) PartialDiagnosticAt(OpLoc, PDiag(diag::err_ovl_ambiguous_oper_unary) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14852) << "->" << Base->getType() +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14853) << Base->getSourceRange()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 14854) *this, OCD_AmbiguousCandidates, Base); +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14855) return ExprError(); +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14856) +171c45ab0c19b (Douglas Gregor 2009-02-18 21:56:37 +0000 14857) case OR_Deleted: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14858) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14859) PartialDiagnosticAt(OpLoc, PDiag(diag::err_ovl_deleted_oper) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14860) << "->" << Base->getSourceRange()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14861) *this, OCD_AllCandidates, Base); +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14862) return ExprError(); +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14863) } +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14864) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14865) CheckMemberOperatorAccess(OpLoc, Base, nullptr, Best->FoundDecl); +a0296f7987c0a (John McCall 2010-03-19 07:35:19 +0000 14866) +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14867) // Convert the object parameter. +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14868) CXXMethodDecl *Method = cast(Best->Function); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14869) ExprResult BaseResult = +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14870) PerformObjectArgumentInitialization(Base, /*Qualifier=*/nullptr, +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14871) Best->FoundDecl, Method); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14872) if (BaseResult.isInvalid()) +d806156d54595 (Douglas Gregor 2009-08-06 03:17:00 +0000 14873) return ExprError(); +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14874) Base = BaseResult.get(); +9ecea26443d3f (Douglas Gregor 2008-11-21 03:04:22 +0000 14875) +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14876) // Build the operator call. +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 14877) ExprResult FnExpr = CreateFunctionRefExpr(*this, Method, Best->FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 14878) Base, HadMultipleCandidates, OpLoc); +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14879) if (FnExpr.isInvalid()) +0129629fd34a8 (John Wiegley 2011-04-08 18:41:53 +0000 14880) return ExprError(); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 14881) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14882) QualType ResultTy = Method->getReturnType(); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 14883) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 14884) ResultTy = ResultTy.getNonLValueExprType(Context); +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14885) CXXOperatorCallExpr *TheCall = +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14886) CXXOperatorCallExpr::Create(Context, OO_Arrow, FnExpr.get(), Base, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 14887) ResultTy, VK, OpLoc, CurFPFeatureOverrides()); +e4f4b5e919adc (Anders Carlsson 2009-10-13 22:43:21 +0000 14888) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14889) if (CheckCallReturnType(Method->getReturnType(), OpLoc, TheCall, Method)) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14890) return ExprError(); +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14891) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14892) if (CheckFunctionCall(Method, TheCall, +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14893) Method->getType()->castAs())) +ce6284b17984a (George Burgess IV 2017-01-28 02:19:40 +0000 14894) return ExprError(); +2d9c47ea6cd3a (Eli Friedman 2011-04-04 01:18:25 +0000 14895) +2d9c47ea6cd3a (Eli Friedman 2011-04-04 01:18:25 +0000 14896) return MaybeBindToTemporary(TheCall); +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14897) } +e0e79bdef62a5 (Douglas Gregor 2008-11-20 16:27:02 +0000 14898) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14899) /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14900) /// a literal operator described by the provided lookup results. +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14901) ExprResult Sema::BuildLiteralOperatorCall(LookupResult &R, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14902) DeclarationNameInfo &SuffixInfo, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14903) ArrayRef Args, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14904) SourceLocation LitEndLoc, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14905) TemplateArgumentListInfo *TemplateArgs) { +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14906) SourceLocation UDSuffixLoc = SuffixInfo.getCXXLiteralOperatorNameLoc(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14907) +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14908) OverloadCandidateSet CandidateSet(UDSuffixLoc, +100b24abc5a08 (Richard Smith 2014-04-17 01:52:14 +0000 14909) OverloadCandidateSet::CSK_Normal); +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 14910) AddNonMemberOperatorCandidates(R.asUnresolvedSet(), Args, CandidateSet, +974c8b7e2fde5 (Richard Smith 2019-10-19 00:04:43 +0000 14911) TemplateArgs); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14912) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14913) bool HadMultipleCandidates = (CandidateSet.size() > 1); +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14914) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14915) // Perform overload resolution. This will usually be trivial, but might need +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14916) // to perform substitutions for a literal operator template. +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14917) OverloadCandidateSet::iterator Best; +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14918) switch (CandidateSet.BestViableFunction(*this, UDSuffixLoc, Best)) { +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14919) case OR_Success: +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14920) case OR_Deleted: +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14921) break; +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14922) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14923) case OR_No_Viable_Function: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14924) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14925) PartialDiagnosticAt(UDSuffixLoc, +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14926) PDiag(diag::err_ovl_no_viable_function_in_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14927) << R.getLookupName()), +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14928) *this, OCD_AllCandidates, Args); +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14929) return ExprError(); +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14930) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14931) case OR_Ambiguous: +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14932) CandidateSet.NoteCandidates( +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14933) PartialDiagnosticAt(R.getNameLoc(), PDiag(diag::err_ovl_ambiguous_call) +5e328050503c5 (David Blaikie 2019-05-03 00:44:50 +0000 14934) << R.getLookupName()), +70f59b5bbc84d (Richard Smith 2019-10-23 17:54:10 -0700 14935) *this, OCD_AmbiguousCandidates, Args); +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14936) return ExprError(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14937) } +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14938) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14939) FunctionDecl *FD = Best->Function; +134af91b06493 (Nick Lewycky 2013-02-07 05:08:22 +0000 14940) ExprResult Fn = CreateFunctionRefExpr(*this, FD, Best->FoundDecl, +2246167362bf3 (Akira Hatanaka 2017-07-13 06:08:27 +0000 14941) nullptr, HadMultipleCandidates, +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14942) SuffixInfo.getLoc(), +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14943) SuffixInfo.getInfo()); +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14944) if (Fn.isInvalid()) +bcc22fc4e1b2c (Richard Smith 2012-03-09 08:00:36 +0000 14945) return true; +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14946) +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14947) // Check the argument types. This should almost always be a no-op, except +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14948) // that array-to-pointer decay is applied to string literals. +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14949) Expr *ConvArgs[2]; +e54c307bb4ed9 (Richard Smith 2013-05-05 15:51:06 +0000 14950) for (unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) { +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14951) ExprResult InputInit = PerformCopyInitialization( +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14952) InitializedEntity::InitializeParameter(Context, FD->getParamDecl(ArgIdx)), +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14953) SourceLocation(), Args[ArgIdx]); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14954) if (InputInit.isInvalid()) +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14955) return true; +01a7598561561 (Nikola Smiljanic 2014-05-29 10:55:11 +0000 14956) ConvArgs[ArgIdx] = InputInit.get(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14957) } +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14958) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14959) QualType ResultTy = FD->getReturnType(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14960) ExprValueKind VK = Expr::getValueKindForType(ResultTy); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14961) ResultTy = ResultTy.getNonLValueExprType(Context); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14962) +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 14963) UserDefinedLiteral *UDL = UserDefinedLiteral::Create( +c5885cffc5206 (Bruno Ricci 2018-12-21 15:20:32 +0000 14964) Context, Fn.get(), llvm::makeArrayRef(ConvArgs, Args.size()), ResultTy, +70e7aa4a4ed36 (Serge Pavlov 2020-07-24 12:04:19 +0700 14965) VK, LitEndLoc, UDSuffixLoc, CurFPFeatureOverrides()); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14966) +314cc81b8caac (Alp Toker 2014-01-25 16:55:45 +0000 14967) if (CheckCallReturnType(FD->getReturnType(), UDSuffixLoc, UDL, FD)) +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14968) return ExprError(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14969) +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14970) if (CheckFunctionCall(FD, UDL, nullptr)) +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14971) return ExprError(); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14972) +008e7bf92343b (Tyker 2020-02-04 19:23:33 +0100 14973) return CheckForImmediateInvocation(MaybeBindToTemporary(UDL), FD); +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14974) } +c67fdd4eb95f1 (Richard Smith 2012-03-07 08:35:16 +0000 14975) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14976) /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14977) /// given LookupResult is non-empty, it is assumed to describe a member which +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14978) /// will be invoked. Otherwise, the function will be found via argument +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14979) /// dependent lookup. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14980) /// CallExpr is set to a valid expression and FRS_Success returned on success, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14981) /// otherwise CallExpr is set to ExprError() and some non-success value +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14982) /// is returned. +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14983) Sema::ForRangeStatus +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 14984) Sema::BuildForRangeBeginEndCall(SourceLocation Loc, +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 14985) SourceLocation RangeLoc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14986) const DeclarationNameInfo &NameInfo, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14987) LookupResult &MemberLookup, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14988) OverloadCandidateSet *CandidateSet, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14989) Expr *Range, ExprResult *CallExpr) { +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 14990) Scope *S = nullptr; +9f690bd80bb67 (Richard Smith 2015-10-27 06:02:45 +0000 14991) +67ef14fe486e1 (Richard Smith 2017-09-26 18:37:55 +0000 14992) CandidateSet->clear(OverloadCandidateSet::CSK_Normal); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14993) if (!MemberLookup.empty()) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14994) ExprResult MemberRef = +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14995) BuildMemberReferenceExpr(Range, Range->getType(), Loc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14996) /*IsPtr=*/false, CXXScopeSpec(), +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14997) /*TemplateKWLoc=*/SourceLocation(), +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 14998) /*FirstQualifierInScope=*/nullptr, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 14999) MemberLookup, +6924dcdf6f737 (Aaron Ballman 2015-09-01 14:49:24 +0000 15000) /*TemplateArgs=*/nullptr, S); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15001) if (MemberRef.isInvalid()) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15002) *CallExpr = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15003) return FRS_DiagnosticIssued; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15004) } +255b85f03c5db (Richard Smith 2019-05-08 01:36:36 +0000 15005) *CallExpr = BuildCallExpr(S, MemberRef.get(), Loc, None, Loc, nullptr); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15006) if (CallExpr->isInvalid()) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15007) *CallExpr = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15008) return FRS_DiagnosticIssued; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15009) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15010) } else { +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15011) ExprResult FnR = CreateUnresolvedLookupExpr(/*NamingClass=*/nullptr, +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15012) NestedNameSpecifierLoc(), +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15013) NameInfo, UnresolvedSet<0>()); +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15014) if (FnR.isInvalid()) +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15015) return FRS_DiagnosticIssued; +ed5a18fc0399d (Richard Smith 2020-08-06 15:57:35 -0700 15016) UnresolvedLookupExpr *Fn = cast(FnR.get()); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15017) +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 15018) bool CandidateSetError = buildOverloadedCallSet(S, Fn, Fn, Range, Loc, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15019) CandidateSet, CallExpr); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15020) if (CandidateSet->empty() || CandidateSetError) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15021) *CallExpr = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15022) return FRS_NoViableFunction; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15023) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15024) OverloadCandidateSet::iterator Best; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15025) OverloadingResult OverloadResult = +f2ceec4811c35 (Stephen Kelly 2018-08-09 21:08:08 +0000 15026) CandidateSet->BestViableFunction(*this, Fn->getBeginLoc(), Best); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15027) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15028) if (OverloadResult == OR_No_Viable_Function) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15029) *CallExpr = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15030) return FRS_NoViableFunction; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15031) } +9c785c217b3f9 (Dmitri Gribenko 2013-05-09 21:02:07 +0000 15032) *CallExpr = FinishOverloadedCallExpr(*this, S, Fn, Fn, Loc, Range, +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 15033) Loc, nullptr, CandidateSet, &Best, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15034) OverloadResult, +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15035) /*AllowTypoCorrection=*/false); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15036) if (CallExpr->isInvalid() || OverloadResult != OR_Success) { +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15037) *CallExpr = ExprError(); +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15038) return FRS_DiagnosticIssued; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15039) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15040) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15041) return FRS_Success; +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15042) } +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15043) +0f38443616f50 (Sam Panzer 2012-08-21 00:52:01 +0000 15044) +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15045) /// FixOverloadedFunctionReference - E is an expression that refers to +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15046) /// a C++ overloaded function (possibly with some parentheses and +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15047) /// perhaps a '&' around it). We have resolved the overloaded function +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15048) /// to the function declaration Fn, so patch up the expression E to +fcb4ab4420793 (Anders Carlsson 2009-10-21 17:16:23 +0000 15049) /// refer (possibly indirectly) to Fn. Returns the new expr. +a8ae222d0e8ba (John McCall 2010-04-06 21:38:20 +0000 15050) Expr *Sema::FixOverloadedFunctionReference(Expr *E, DeclAccessPair Found, +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15051) FunctionDecl *Fn) { +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15052) if (ParenExpr *PE = dyn_cast(E)) { +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15053) Expr *SubExpr = FixOverloadedFunctionReference(PE->getSubExpr(), +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15054) Found, Fn); +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15055) if (SubExpr == PE->getSubExpr()) +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15056) return PE; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15057) +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15058) return new (Context) ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15059) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15060) +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15061) if (ImplicitCastExpr *ICE = dyn_cast(E)) { +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15062) Expr *SubExpr = FixOverloadedFunctionReference(ICE->getSubExpr(), +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15063) Found, Fn); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15064) assert(Context.hasSameType(ICE->getSubExpr()->getType(), +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15065) SubExpr->getType()) && +091f04256a60c (Douglas Gregor 2009-10-23 22:18:25 +0000 15066) "Implicit cast type cannot be determined from overload"); +cf1421650953d (John McCall 2010-08-07 06:22:56 +0000 15067) assert(ICE->path_empty() && "fixing up hierarchy conversion?"); +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15068) if (SubExpr == ICE->getSubExpr()) +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15069) return ICE; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15070) +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 15071) return ImplicitCastExpr::Create(Context, ICE->getType(), ICE->getCastKind(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 15072) SubExpr, nullptr, ICE->getValueKind(), +f1cd6593da3ad (Serge Pavlov 2020-09-12 21:54:14 +0700 15073) CurFPFeatureOverrides()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15074) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15075) +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15076) if (auto *GSE = dyn_cast(E)) { +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15077) if (!GSE->isResultDependent()) { +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15078) Expr *SubExpr = +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15079) FixOverloadedFunctionReference(GSE->getResultExpr(), Found, Fn); +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15080) if (SubExpr == GSE->getResultExpr()) +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15081) return GSE; +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15082) +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15083) // Replace the resulting type information before rebuilding the generic +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15084) // selection expression. +8b871d96d780b (Aaron Ballman 2016-09-02 18:31:31 +0000 15085) ArrayRef A = GSE->getAssocExprs(); +8b871d96d780b (Aaron Ballman 2016-09-02 18:31:31 +0000 15086) SmallVector AssocExprs(A.begin(), A.end()); +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15087) unsigned ResultIdx = GSE->getResultIndex(); +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15088) AssocExprs[ResultIdx] = SubExpr; +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15089) +db07683d866bd (Bruno Ricci 2019-01-26 14:15:10 +0000 15090) return GenericSelectionExpr::Create( +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15091) Context, GSE->getGenericLoc(), GSE->getControllingExpr(), +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15092) GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(), +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15093) GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(), +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15094) ResultIdx); +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15095) } +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15096) // Rather than fall through to the unreachable, return the original generic +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15097) // selection expression. +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15098) return GSE; +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15099) } +ff7bd8bacd130 (Aaron Ballman 2016-09-02 13:45:40 +0000 15100) +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15101) if (UnaryOperator *UnOp = dyn_cast(E)) { +e302792b6155b (John McCall 2010-08-25 11:45:40 +0000 15102) assert(UnOp->getOpcode() == UO_AddrOf && +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15103) "Can only take the address of an overloaded function"); +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15104) if (CXXMethodDecl *Method = dyn_cast(Fn)) { +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15105) if (Method->isStatic()) { +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15106) // Do nothing: static member functions aren't any different +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15107) // from non-member functions. +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15108) } else { +028ed91127254 (Alp Toker 2013-12-06 17:56:43 +0000 15109) // Fix the subexpression, which really has to be an +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 15110) // UnresolvedLookupExpr holding an overloaded member function +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 15111) // or template. +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15112) Expr *SubExpr = FixOverloadedFunctionReference(UnOp->getSubExpr(), +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15113) Found, Fn); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15114) if (SubExpr == UnOp->getSubExpr()) +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15115) return UnOp; +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15116) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15117) assert(isa(SubExpr) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15118) && "fixed to something other than a decl ref"); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15119) assert(cast(SubExpr)->getQualifier() +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15120) && "fixed to a member ref with no nested name qualifier"); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15121) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15122) // We have taken the address of a pointer to member +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15123) // function. Perform the computation here so that we get the +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15124) // appropriate pointer to member type. +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15125) QualType ClassType +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15126) = Context.getTypeDeclType(cast(Method->getDeclContext())); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15127) QualType MemPtrType +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15128) = Context.getMemberPointerType(Fn->getType(), ClassType.getTypePtr()); +02d57cc92cb82 (David Majnemer 2016-06-30 03:02:03 +0000 15129) // Under the MS ABI, lock down the inheritance model now. +02d57cc92cb82 (David Majnemer 2016-06-30 03:02:03 +0000 15130) if (Context.getTargetInfo().getCXXABI().isMicrosoft()) +02d57cc92cb82 (David Majnemer 2016-06-30 03:02:03 +0000 15131) (void)isCompleteType(UnOp->getOperatorLoc(), MemPtrType); +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15132) +f5360d4bb3376 (Melanie Blower 2020-05-01 10:32:06 -0700 15133) return UnaryOperator::Create( +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15134) Context, SubExpr, UO_AddrOf, MemPtrType, VK_PRValue, OK_Ordinary, +f4aaed3bf16b3 (Melanie Blower 2020-06-26 09:23:45 -0700 15135) UnOp->getOperatorLoc(), false, CurFPFeatureOverrides()); +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15136) } +6f233ef1d893d (Douglas Gregor 2009-02-11 01:18:59 +0000 15137) } +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15138) Expr *SubExpr = FixOverloadedFunctionReference(UnOp->getSubExpr(), +16df1e59f2bb7 (John McCall 2010-03-30 21:47:33 +0000 15139) Found, Fn); +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15140) if (SubExpr == UnOp->getSubExpr()) +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15141) return UnOp; +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15142) +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15143) return UnaryOperator::Create( +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15144) Context, SubExpr, UO_AddrOf, Context.getPointerType(SubExpr->getType()), +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15145) VK_PRValue, OK_Ordinary, UnOp->getOperatorLoc(), false, +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15146) CurFPFeatureOverrides()); +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15147) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15148) +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15149) if (UnresolvedLookupExpr *ULE = dyn_cast(E)) { +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15150) // FIXME: avoid copy. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 15151) TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 15152) if (ULE->hasExplicitTemplateArgs()) { +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15153) ULE->copyTemplateArgumentsInto(TemplateArgsBuffer); +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15154) TemplateArgs = &TemplateArgsBuffer; +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 15155) } +e66edc18ae0fc (John McCall 2009-11-24 19:00:30 +0000 15156) +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15157) DeclRefExpr *DRE = +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15158) BuildDeclRefExpr(Fn, Fn->getType(), VK_LValue, ULE->getNameInfo(), +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15159) ULE->getQualifierLoc(), Found.getDecl(), +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15160) ULE->getTemplateKeywordLoc(), TemplateArgs); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 15161) DRE->setHadMultipleCandidates(ULE->getNumDecls() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 15162) return DRE; +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15163) } +d14a86427f9cd (John McCall 2009-11-21 08:51:07 +0000 15164) +10eae1851d3f6 (John McCall 2009-11-30 22:42:35 +0000 15165) if (UnresolvedMemberExpr *MemExpr = dyn_cast(E)) { +6b51f28e82646 (John McCall 2009-11-23 01:53:49 +0000 15166) // FIXME: avoid copy. +c3ec149bb238c (Craig Topper 2014-05-26 06:22:03 +0000 15167) TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15168) if (MemExpr->hasExplicitTemplateArgs()) { +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15169) MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer); +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15170) TemplateArgs = &TemplateArgsBuffer; +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15171) } +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15172) +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15173) Expr *Base; +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15174) +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 15175) // If we're filling in a static method where we used to have an +7decc9e4ea6c5 (John McCall 2010-11-18 06:31:45 +0000 15176) // implicit member access, rewrite to a simple decl ref. +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15177) if (MemExpr->isImplicitAccess()) { +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15178) if (cast(Fn)->isStatic()) { +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15179) DeclRefExpr *DRE = BuildDeclRefExpr( +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15180) Fn, Fn->getType(), VK_LValue, MemExpr->getNameInfo(), +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15181) MemExpr->getQualifierLoc(), Found.getDecl(), +7dcd73340ba51 (Richard Smith 2019-06-04 18:30:46 +0000 15182) MemExpr->getTemplateKeywordLoc(), TemplateArgs); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 15183) DRE->setHadMultipleCandidates(MemExpr->getNumDecls() > 1); +635ed24e1dad8 (Abramo Bagnara 2011-10-05 07:56:41 +0000 15184) return DRE; +b15af899fb4b4 (Douglas Gregor 2010-01-07 23:12:05 +0000 15185) } else { +b15af899fb4b4 (Douglas Gregor 2010-01-07 23:12:05 +0000 15186) SourceLocation Loc = MemExpr->getMemberLoc(); +b15af899fb4b4 (Douglas Gregor 2010-01-07 23:12:05 +0000 15187) if (MemExpr->getQualifier()) +0da1d43e1600a (Douglas Gregor 2011-02-28 20:01:57 +0000 15188) Loc = MemExpr->getQualifierLoc().getBeginLoc(); +8458c9ef42390 (Richard Smith 2019-05-24 01:35:07 +0000 15189) Base = +49a3ad21d6034 (Rui Ueyama 2019-07-16 04:46:31 +0000 15190) BuildCXXThisExpr(Loc, MemExpr->getBaseType(), /*IsImplicit=*/true); +b15af899fb4b4 (Douglas Gregor 2010-01-07 23:12:05 +0000 15191) } +2d74de96325e4 (John McCall 2009-12-01 22:10:20 +0000 15192) } else +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15193) Base = MemExpr->getBase(); +6b51f28e82646 (John McCall 2009-11-23 01:53:49 +0000 15194) +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15195) ExprValueKind valueKind; +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15196) QualType type; +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15197) if (cast(Fn)->isStatic()) { +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15198) valueKind = VK_LValue; +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15199) type = Fn->getType(); +4adb38cdf4004 (John McCall 2011-04-27 00:36:17 +0000 15200) } else { +aef5d8fdc7d0d (Matheus Izvekov 2021-06-04 23:15:23 +0200 15201) valueKind = VK_PRValue; +eba323ab4453b (Yunzhong Gao 2015-05-01 02:04:32 +0000 15202) type = Context.BoundMemberTy; +eba323ab4453b (Yunzhong Gao 2015-05-01 02:04:32 +0000 15203) } +eba323ab4453b (Yunzhong Gao 2015-05-01 02:04:32 +0000 15204) +84be998497669 (Richard Smith 2019-06-06 23:24:18 +0000 15205) return BuildMemberExpr( +84be998497669 (Richard Smith 2019-06-06 23:24:18 +0000 15206) Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(), +eba323ab4453b (Yunzhong Gao 2015-05-01 02:04:32 +0000 15207) MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn, Found, +84be998497669 (Richard Smith 2019-06-06 23:24:18 +0000 15208) /*HadMultipleCandidates=*/true, MemExpr->getMemberNameInfo(), +84be998497669 (Richard Smith 2019-06-06 23:24:18 +0000 15209) type, valueKind, OK_Ordinary, TemplateArgs); +51c538bee4d75 (Douglas Gregor 2009-11-20 19:42:02 +0000 15210) } +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15211) +c3007a21450f4 (John McCall 2010-10-26 07:05:15 +0000 15212) llvm_unreachable("Invalid reference to overloaded function"); +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15213) } +cd695e500de7e (Douglas Gregor 2008-11-10 20:40:00 +0000 15214) +f9cbcc4cc2e26 (NAKAMURA Takumi 2011-01-27 07:10:08 +0000 15215) ExprResult Sema::FixOverloadedFunctionReference(ExprResult E, +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 15216) DeclAccessPair Found, +dadc575b1e878 (John McCall 2010-08-24 06:29:42 +0000 15217) FunctionDecl *Fn) { +03ff2596cb161 (Nikola Smiljanic 2014-05-29 14:05:12 +0000 15218) return FixOverloadedFunctionReference(E.get(), Found, Fn); +3e1e527826048 (Douglas Gregor 2009-12-09 23:02:17 +0000 15219) } Index: clang/test/CXX/class/class.compare/class.compare.default/p1.cpp =================================================================== --- clang/test/CXX/class/class.compare/class.compare.default/p1.cpp +++ clang/test/CXX/class/class.compare/class.compare.default/p1.cpp @@ -1,15 +1,13 @@ // RUN: %clang_cc1 -std=c++2a -verify %s struct B {}; -bool operator==(const B&, const B&) = default; // expected-error {{equality comparison operator can only be defaulted in a class definition}} expected-note {{candidate}} -bool operator<=>(const B&, const B&) = default; // expected-error {{three-way comparison operator can only be defaulted in a class definition}} template bool operator<(const B&, const B&) = default; // expected-error {{comparison operator template cannot be defaulted}} struct A { friend bool operator==(const A&, const A&) = default; - friend bool operator!=(const A&, const B&) = default; // expected-error {{invalid parameter type for defaulted equality comparison operator; found 'const B &', expected 'A' or 'const A &'}} + friend bool operator!=(const A&, const B&) = default; // expected-error {{parameters for defaulted equality comparison operator must have the same type (found 'const A &' vs 'const B &')}} friend bool operator!=(const B&, const B&) = default; // expected-error {{invalid parameter type for defaulted equality comparison}} friend bool operator<(const A&, const A&); friend bool operator<(const B&, const B&) = default; // expected-error {{invalid parameter type for defaulted relational comparison}} @@ -29,11 +27,6 @@ bool operator==(const A&) const = default; // expected-error {{comparison operator template cannot be defaulted}} }; -// FIXME: The wording is not clear as to whether these are valid, but the -// intention is that they are not. -bool operator<(const A&, const A&) = default; // expected-error {{relational comparison operator can only be defaulted in a class definition}} -bool A::operator<(const A&) const = default; // expected-error {{can only be defaulted in a class definition}} - template struct Dependent { using U = typename T::type; bool operator==(U) const = default; // expected-error {{found 'Dependent::U'}} @@ -132,3 +125,41 @@ friend bool operator==(const B&, const B&) = default; // expected-warning {{deleted}} }; } + +namespace p2085 { +// out-of-class defaulting + +struct S1 { + bool operator==(S1 const &) const; +}; + +bool S1::operator==(S1 const &) const = default; + +bool F1(S1 &s) { + return s != s; +} + +struct S2 { + friend bool operator==(S2 const &, S2 const &); +}; + +bool operator==(S2 const &, S2 const &) = default; +bool F2(S2 &s) { + return s != s; +} + +struct S3 {}; // expected-note{{here}} +bool operator==(S3 const &, S3 const &) = default; // expected-error{{not a friend}} + +struct S4; // expected-note{{forward declaration}} +bool operator==(S4 const &, S4 const &) = default; // expected-error{{not a friend}} + +struct S5; // expected-note 3{{forward declaration}} +bool operator==(S5, S5) = default; // expected-error{{not a friend}} expected-error 2{{has incomplete type}} + +enum e {}; +bool operator==(e, int) = default; // expected-error{{expected class or reference to a constant class}} + +bool operator==(e *, int *) = default; // expected-error{{must have at least one}} + +} // namespace p2085 Index: clang/test/CodeGenCXX/p2085.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/p2085.cpp @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 --std=c++20 %s -emit-llvm -o - -triple x86_64-linux | FileCheck %s + +namespace std { +struct strong_ordering { + int n; + constexpr operator int() const { return n; } + static const strong_ordering equal, greater, less; +}; +constexpr inline strong_ordering strong_ordering::equal = {0}; +constexpr inline strong_ordering strong_ordering::greater = {1}; +constexpr inline strong_ordering strong_ordering::less = {-1}; +} // namespace std + +struct Space { + int i, j; + + std::strong_ordering operator<=>(Space const &other) const; + bool operator==(Space const &other) const; +}; + +// Make sure these cause emission +std::strong_ordering Space::operator<=>(Space const &other) const = default; +// CHECK-LABEL: define{{.*}} @_ZNK5SpacessERKS_ +bool Space::operator==(Space const &) const = default; +// CHECK-LABEL: define{{.*}} @_ZNK5SpaceeqERKS_ + +struct Water { + int i, j; + + std::strong_ordering operator<=>(Water const &other) const; + bool operator==(Water const &other) const; +}; + +// Make sure these do not cause emission +inline std::strong_ordering Water::operator<=>(Water const &other) const = default; +// CHECK-NOT: define{{.*}} @_ZNK5WaterssERKS_ +inline bool Water::operator==(Water const &) const = default; +// CHECK-NOT: define{{.*}} @_ZNK5WatereqERKS_ Index: clang/www/cxx_status.html =================================================================== --- clang/www/cxx_status.html +++ clang/www/cxx_status.html @@ -1006,7 +1006,7 @@ P2085R0 - No + Clang 14 Access checking on specializations