https://github.com/vortex73 updated https://github.com/llvm/llvm-project/pull/98965
>From 60a51d9150fa3f31c3eab89e1f1da3b30d190b48 Mon Sep 17 00:00:00 2001 From: Vortex <nsreekum...@gmail.com> Date: Tue, 16 Jul 2024 03:01:14 +0530 Subject: [PATCH 1/5] [Clang] Refactor uses of in SemaOverload.cpp --- clang/lib/Sema/SemaOverload.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 074062ebbb594..1275d311b21a8 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -46,6 +46,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Casting.h" #include <algorithm> +#include <cassert> #include <cstddef> #include <cstdlib> #include <optional> @@ -9994,8 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name, CandEnd = CandidateSet.end(); Cand != CandEnd; ++Cand) if (Cand->Function) { - Fns.erase(Cand->Function); - if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate()) + FunctionDecl *CandFunc = Cand->Function; + Fns.erase(CandFunc); + if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate()) Fns.erase(FunTmpl); } @@ -11349,8 +11351,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, } } - if (TakingCandidateAddress && - !checkAddressOfCandidateIsAvailable(S, Cand->Function)) + if (TakingCandidateAddress && !checkAddressOfCandidateIsAvailable(S, Fn)) return; // Emit the generic diagnostic and, optionally, add the hints to it. @@ -11376,6 +11377,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, /// over a candidate in any candidate set. static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf = false) { + assert(Cand->Function && "Candidate is required to be a function."); FunctionDecl *Fn = Cand->Function; unsigned MinParams = Fn->getMinRequiredExplicitArguments() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0); @@ -11780,6 +11782,7 @@ static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand, /// CUDA: diagnose an invalid call across targets. static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) { FunctionDecl *Caller = S.getCurFunctionDecl(/*AllowLambda=*/true); + assert(Cand->Function && "Candidate must be a Function."); FunctionDecl *Callee = Cand->Function; CUDAFunctionTarget CallerTarget = S.CUDA().IdentifyTarget(Caller), @@ -11837,6 +11840,7 @@ static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) { } static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { + assert(Cand->Function && "Candidate must be a function"); FunctionDecl *Callee = Cand->Function; EnableIfAttr *Attr = static_cast<EnableIfAttr*>(Cand->DeductionFailure.Data); @@ -11846,11 +11850,13 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { } static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { - ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Cand->Function); + assert(Cand->Function && "Candidate must be a function"); + Function *CandFunc = Cand->Function; + ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc); assert(ES.isExplicit() && "not an explicit candidate"); unsigned Kind; - switch (Cand->Function->getDeclKind()) { + switch (CandFunc->getDeclKind()) { case Decl::Kind::CXXConstructor: Kind = 0; break; @@ -11858,7 +11864,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { Kind = 1; break; case Decl::Kind::CXXDeductionGuide: - Kind = Cand->Function->isImplicit() ? 0 : 2; + Kind = CandFunc->isImplicit() ? 0 : 2; break; default: llvm_unreachable("invalid Decl"); @@ -11868,7 +11874,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { // (particularly an out-of-class definition) will typically lack the // 'explicit' specifier. // FIXME: This is probably a good thing to do for all 'candidate' notes. - FunctionDecl *First = Cand->Function->getFirstDecl(); + FunctionDecl *First = CandFunc->getFirstDecl(); if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern()) First = Pattern->getFirstDecl(); @@ -11937,6 +11943,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS = LangAS::Default) { + assert(Cand->Function && "Candidate must be a function"); FunctionDecl *Fn = Cand->Function; if (shouldSkipNotingLambdaConversionDecl(Fn)) return; @@ -11951,8 +11958,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, // Skip implicit member functions when trying to resolve // the address of a an overload set for a function pointer. if (Cand->TookAddressOfOverload && - !Cand->Function->hasCXXExplicitFunctionObjectParameter() && - !Cand->Function->isStatic()) + !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic()) return; // Note deleted candidates, but only if they're viable. @@ -12050,7 +12056,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, return; case ovl_fail_addr_not_available: { - bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function); + bool Available = checkAddressOfCandidateIsAvailable(S, Fn); (void)Available; assert(!Available); break; >From 8a4cea6d6237e242c6c11a36b2124a955a7939d7 Mon Sep 17 00:00:00 2001 From: Vortex <nsreekum...@gmail.com> Date: Tue, 16 Jul 2024 03:01:14 +0530 Subject: [PATCH 2/5] [Clang] Refactor uses of Cand->Function in SemaOverload.cpp --- clang/lib/Sema/SemaOverload.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 074062ebbb594..1275d311b21a8 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -46,6 +46,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Casting.h" #include <algorithm> +#include <cassert> #include <cstddef> #include <cstdlib> #include <optional> @@ -9994,8 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name, CandEnd = CandidateSet.end(); Cand != CandEnd; ++Cand) if (Cand->Function) { - Fns.erase(Cand->Function); - if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate()) + FunctionDecl *CandFunc = Cand->Function; + Fns.erase(CandFunc); + if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate()) Fns.erase(FunTmpl); } @@ -11349,8 +11351,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, } } - if (TakingCandidateAddress && - !checkAddressOfCandidateIsAvailable(S, Cand->Function)) + if (TakingCandidateAddress && !checkAddressOfCandidateIsAvailable(S, Fn)) return; // Emit the generic diagnostic and, optionally, add the hints to it. @@ -11376,6 +11377,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, /// over a candidate in any candidate set. static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf = false) { + assert(Cand->Function && "Candidate is required to be a function."); FunctionDecl *Fn = Cand->Function; unsigned MinParams = Fn->getMinRequiredExplicitArguments() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0); @@ -11780,6 +11782,7 @@ static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand, /// CUDA: diagnose an invalid call across targets. static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) { FunctionDecl *Caller = S.getCurFunctionDecl(/*AllowLambda=*/true); + assert(Cand->Function && "Candidate must be a Function."); FunctionDecl *Callee = Cand->Function; CUDAFunctionTarget CallerTarget = S.CUDA().IdentifyTarget(Caller), @@ -11837,6 +11840,7 @@ static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) { } static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { + assert(Cand->Function && "Candidate must be a function"); FunctionDecl *Callee = Cand->Function; EnableIfAttr *Attr = static_cast<EnableIfAttr*>(Cand->DeductionFailure.Data); @@ -11846,11 +11850,13 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { } static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { - ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Cand->Function); + assert(Cand->Function && "Candidate must be a function"); + Function *CandFunc = Cand->Function; + ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc); assert(ES.isExplicit() && "not an explicit candidate"); unsigned Kind; - switch (Cand->Function->getDeclKind()) { + switch (CandFunc->getDeclKind()) { case Decl::Kind::CXXConstructor: Kind = 0; break; @@ -11858,7 +11864,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { Kind = 1; break; case Decl::Kind::CXXDeductionGuide: - Kind = Cand->Function->isImplicit() ? 0 : 2; + Kind = CandFunc->isImplicit() ? 0 : 2; break; default: llvm_unreachable("invalid Decl"); @@ -11868,7 +11874,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { // (particularly an out-of-class definition) will typically lack the // 'explicit' specifier. // FIXME: This is probably a good thing to do for all 'candidate' notes. - FunctionDecl *First = Cand->Function->getFirstDecl(); + FunctionDecl *First = CandFunc->getFirstDecl(); if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern()) First = Pattern->getFirstDecl(); @@ -11937,6 +11943,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS = LangAS::Default) { + assert(Cand->Function && "Candidate must be a function"); FunctionDecl *Fn = Cand->Function; if (shouldSkipNotingLambdaConversionDecl(Fn)) return; @@ -11951,8 +11958,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, // Skip implicit member functions when trying to resolve // the address of a an overload set for a function pointer. if (Cand->TookAddressOfOverload && - !Cand->Function->hasCXXExplicitFunctionObjectParameter() && - !Cand->Function->isStatic()) + !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic()) return; // Note deleted candidates, but only if they're viable. @@ -12050,7 +12056,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, return; case ovl_fail_addr_not_available: { - bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function); + bool Available = checkAddressOfCandidateIsAvailable(S, Fn); (void)Available; assert(!Available); break; >From d48e7d3b6242e6ce65fd5f5e9651e0995751db77 Mon Sep 17 00:00:00 2001 From: Vortex <nsreekum...@gmail.com> Date: Tue, 16 Jul 2024 03:12:36 +0530 Subject: [PATCH 3/5] [Clang] Refactor uses of Cand->Function in SemaOverload.cpp --- clang/lib/Sema/SemaOverload.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 1275d311b21a8..b68e54b9caa5b 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11468,8 +11468,10 @@ static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, /// Arity mismatch diagnosis specific to a function overload candidate. static void DiagnoseArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumFormalArgs) { + assert(Cand->Function && "Candidate must be a function"); + FunctionDecl *Fn = Cand->Function; if (!CheckArityMismatch(S, Cand, NumFormalArgs, Cand->TookAddressOfOverload)) - DiagnoseArityMismatch(S, Cand->FoundDecl, Cand->Function, NumFormalArgs, + DiagnoseArityMismatch(S, Cand->FoundDecl, Fn, NumFormalArgs, Cand->TookAddressOfOverload); } @@ -11769,13 +11771,15 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress) { + assert(Cand->Function && "Candidate must be a function"); + FunctionDecl *Fn = Cand->Function; TemplateDeductionResult TDK = Cand->DeductionFailure.getResult(); if (TDK == TemplateDeductionResult::TooFewArguments || TDK == TemplateDeductionResult::TooManyArguments) { if (CheckArityMismatch(S, Cand, NumArgs)) return; } - DiagnoseBadDeduction(S, Cand->FoundDecl, Cand->Function, // pattern + DiagnoseBadDeduction(S, Cand->FoundDecl, Fn, // pattern Cand->DeductionFailure, NumArgs, TakingCandidateAddress); } >From 5e0c33cbea49a8b7fd2e833b3c1431efa470a55d Mon Sep 17 00:00:00 2001 From: Vortex <nsreekum...@gmail.com> Date: Thu, 18 Jul 2024 10:09:03 +0530 Subject: [PATCH 4/5] renamed occurences of CandFunc to Fn --- clang/lib/Sema/SemaOverload.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index b68e54b9caa5b..bc1dd862d4058 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -9995,9 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name, CandEnd = CandidateSet.end(); Cand != CandEnd; ++Cand) if (Cand->Function) { - FunctionDecl *CandFunc = Cand->Function; - Fns.erase(CandFunc); - if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate()) + FunctionDecl *Fn = Cand->Function; + Fns.erase(Fn); + if (FunctionTemplateDecl *FunTmpl = Fn->getPrimaryTemplate()) Fns.erase(FunTmpl); } @@ -11855,12 +11855,12 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { assert(Cand->Function && "Candidate must be a function"); - Function *CandFunc = Cand->Function; - ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc); + Function *Fn = Cand->Function; + ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Fn); assert(ES.isExplicit() && "not an explicit candidate"); unsigned Kind; - switch (CandFunc->getDeclKind()) { + switch (Fn->getDeclKind()) { case Decl::Kind::CXXConstructor: Kind = 0; break; @@ -11868,7 +11868,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { Kind = 1; break; case Decl::Kind::CXXDeductionGuide: - Kind = CandFunc->isImplicit() ? 0 : 2; + Kind = Fn->isImplicit() ? 0 : 2; break; default: llvm_unreachable("invalid Decl"); @@ -11878,7 +11878,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { // (particularly an out-of-class definition) will typically lack the // 'explicit' specifier. // FIXME: This is probably a good thing to do for all 'candidate' notes. - FunctionDecl *First = CandFunc->getFirstDecl(); + FunctionDecl *First = Fn->getFirstDecl(); if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern()) First = Pattern->getFirstDecl(); >From ef007ca0c0119298767bbc9f1a345969fe6e8c03 Mon Sep 17 00:00:00 2001 From: Vortex <nsreekum...@gmail.com> Date: Thu, 18 Jul 2024 10:09:03 +0530 Subject: [PATCH 5/5] renamed occurences of CandFunc to Fn --- clang/lib/Sema/SemaOverload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bc1dd862d4058..5712ab0377f72 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11855,7 +11855,7 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) { static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) { assert(Cand->Function && "Candidate must be a function"); - Function *Fn = Cand->Function; + FunctionDecl *Fn = Cand->Function; ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Fn); assert(ES.isExplicit() && "not an explicit candidate"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits