[clang] 1029747 - [Sema] Fix null pointer dereference handleAlwaysInlineAttr.

Craig Topper via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 16 20:00:41 PDT 2023


Thanks for the heads up. Looks like we have a different default C++ standard enabled than what the tests got in my local testing. I’ll revert and make a fix. 

> On Mar 16, 2023, at 7:53 PM, Voss, Matthew <Matthew.Voss at sony.com> wrote:
> 
> Hi Craig,
> 
> There are some failures on the PS5 buildbot after this change. Could you take a look?
> 
> https://lab.llvm.org/buildbot/#/builders/216/builds/18474
> 
> Thanks,
> Matt 
> 
>> -----Original Message-----
>> From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of Craig
>> Topper via cfe-commits
>> Sent: Thursday, March 16, 2023 5:52 PM
>> To: cfe-commits at lists.llvm.org
>> Subject: [clang] 1029747 - [Sema] Fix null pointer dereference
>> handleAlwaysInlineAttr.
>> 
>> 
>> Author: Craig Topper
>> Date: 2023-03-16T17:49:34-07:00
>> New Revision: 10297470e953f4f3968c54c851c8af82b07af00b
>> 
>> URL: INVALID URI REMOVED
>> project/commit/10297470e953f4f3968c54c851c8af82b07af00b__;!!JmoZiZGBv
>> 3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
>> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3ln_WfRflk$
>> DIFF: INVALID URI REMOVED
>> project/commit/10297470e953f4f3968c54c851c8af82b07af00b.diff__;!!JmoZiZ
>> GBv3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
>> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnHdJlBwk$
>> 
>> LOG: [Sema] Fix null pointer dereference handleAlwaysInlineAttr.
>> 
>> It's possible for `getCalleeDecl()` to return a null pointer.
>> 
>> This was encountered by a user of our downstream compiler.
>> 
>> The case involved a DependentScopeDeclRefExpr.
>> 
>> Since this seems to only be for a warning diagnostic, I skipped the diagnostic
>> check if it returned null. But mabye there's a different way to fix this.
>> 
>> Reviewed By: erichkeane
>> 
>> Differential Revision:
>> https://reviews.llvm.org/D146089
>> 3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
>> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnaIroE7Q$
>> 
>> Added:
>> 
>> 
>> Modified:
>>    clang/lib/Sema/SemaStmtAttr.cpp
>>    clang/test/Sema/attr-alwaysinline.cpp
>>    clang/test/Sema/attr-noinline.cpp
>> 
>> Removed:
>> 
>> 
>> 
>> #################################################################
>> ###############
>> diff  --git a/clang/lib/Sema/SemaStmtAttr.cpp
>> b/clang/lib/Sema/SemaStmtAttr.cpp index 6d443837a4c5..eeef85373ccb
>> 100644
>> --- a/clang/lib/Sema/SemaStmtAttr.cpp
>> +++ b/clang/lib/Sema/SemaStmtAttr.cpp
>> @@ -233,7 +233,8 @@ static Attr *handleNoInlineAttr(Sema &S, Stmt *St,
>> const ParsedAttr &A,
>> 
>>   for (const auto *CallExpr : CEF.getCallExprs()) {
>>     const Decl *Decl = CallExpr->getCalleeDecl();
>> -    if (Decl->hasAttr<AlwaysInlineAttr>() || Decl->hasAttr<FlattenAttr>())
>> +    if (Decl &&
>> +        (Decl->hasAttr<AlwaysInlineAttr>() ||
>> + Decl->hasAttr<FlattenAttr>()))
>>       S.Diag(St->getBeginLoc(), diag::warn_function_stmt_attribute_precedence)
>>           << A << (Decl->hasAttr<AlwaysInlineAttr>() ? 0 : 1);
>>   }
>> @@ -259,7 +260,7 @@ static Attr *handleAlwaysInlineAttr(Sema &S, Stmt *St,
>> const ParsedAttr &A,
>> 
>>   for (const auto *CallExpr : CEF.getCallExprs()) {
>>     const Decl *Decl = CallExpr->getCalleeDecl();
>> -    if (Decl->hasAttr<NoInlineAttr>() || Decl->hasAttr<FlattenAttr>())
>> +    if (Decl && (Decl->hasAttr<NoInlineAttr>() ||
>> + Decl->hasAttr<FlattenAttr>()))
>>       S.Diag(St->getBeginLoc(), diag::warn_function_stmt_attribute_precedence)
>>           << A << (Decl->hasAttr<NoInlineAttr>() ? 2 : 1);
>>   }
>> 
>> diff  --git a/clang/test/Sema/attr-alwaysinline.cpp b/clang/test/Sema/attr-
>> alwaysinline.cpp
>> index 6b8e8f215a4b..213d70407f48 100644
>> --- a/clang/test/Sema/attr-alwaysinline.cpp
>> +++ b/clang/test/Sema/attr-alwaysinline.cpp
>> @@ -25,3 +25,22 @@ void foo() {
>> }
>> 
>> [[clang::always_inline]] static int i = bar(); // expected-warning {{'always_inline'
>> attribute only applies to functions and statements}}
>> +
>> +// This used to crash the compiler.
>> +template<int D>
>> +int foo(int x) {
>> +    if constexpr (D > 1)
>> +        [[clang::always_inline]] return foo<D-1>(x + 1);
>> +    else
>> +        return x;
>> +}
>> +
>> +// FIXME: This should warn that always_inline statement attribute has
>> +higher // precedence than the noinline function attribute.
>> +template<int D> [[gnu::noinline]]
>> +int bar(int x) {
>> +    if constexpr (D > 1)
>> +        [[clang::always_inline]] return bar<D-1>(x + 1);
>> +    else
>> +        return x;
>> +}
>> 
>> diff  --git a/clang/test/Sema/attr-noinline.cpp b/clang/test/Sema/attr-
>> noinline.cpp
>> index d35782f11adb..a62ca1debcc5 100644
>> --- a/clang/test/Sema/attr-noinline.cpp
>> +++ b/clang/test/Sema/attr-noinline.cpp
>> @@ -25,3 +25,22 @@ void foo() {
>> }
>> 
>> [[clang::noinline]] static int i = bar(); // expected-warning {{'noinline' attribute
>> only applies to functions and statements}}
>> +
>> +// This used to crash the compiler.
>> +template<int D>
>> +int foo(int x) {
>> +    if constexpr (D > 1)
>> +        [[clang::noinline]] return foo<D-1>(x + 1);
>> +    else
>> +        return x;
>> +}
>> +
>> +// FIXME: This should warn that noinline statement attribute has higher
>> +// precedence than the always_inline function attribute.
>> +template<int D> [[clang::always_inline]] int bar(int x) {
>> +    if constexpr (D > 1)
>> +        [[clang::noinline]] return bar<D-1>(x + 1);
>> +    else
>> +        return x;
>> +}
>> 
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> INVALID URI REMOVED
>> commits__;!!JmoZiZGBv3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
>> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnIjBE824$



More information about the cfe-commits mailing list