https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/111573
>From dea97ae4f893774489bfd423e9536e486f022bb9 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Tue, 8 Oct 2024 20:12:45 +0200 Subject: [PATCH] [clang] assume_aligned incorrectly diagnoses a dependent return type --- clang/include/clang/Sema/Sema.h | 6 +++--- clang/lib/Sema/SemaDeclAttr.cpp | 7 ++++--- clang/test/SemaCXX/builtin-assume-aligned-tmpl.cpp | 6 ++++++ clang/test/SemaObjCXX/noescape.mm | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 7ff9c2754a6fe0..3a5bd3be43ee64 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -4453,9 +4453,9 @@ class Sema final : public SemaBase { SourceLocation *ArgLocation = nullptr); /// Determine if type T is a valid subject for a nonnull and similar - /// attributes. By default, we look through references (the behavior used by - /// nonnull), but if the second parameter is true, then we treat a reference - /// type as valid. + /// attributes. We skip dependence By default, we look through references + /// (the behavior used by nonnull), but if the second parameter is true, then + /// we treat a reference type as valid.. bool isValidPointerAttrType(QualType T, bool RefOkay = false); /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index af983349a89b58..e2174ba926f17f 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1216,6 +1216,8 @@ static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL) { } bool Sema::isValidPointerAttrType(QualType T, bool RefOkay) { + if (T->isDependentType()) + return true; if (RefOkay) { if (T->isReferenceType()) return true; @@ -1284,7 +1286,7 @@ static void handleNonNullAttr(Sema &S, Decl *D, const ParsedAttr &AL) { for (unsigned I = 0, E = getFunctionOrMethodNumParams(D); I != E && !AnyPointers; ++I) { QualType T = getFunctionOrMethodParamType(D, I); - if (T->isDependentType() || S.isValidPointerAttrType(T)) + if (S.isValidPointerAttrType(T)) AnyPointers = true; } @@ -1409,8 +1411,7 @@ void Sema::AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, AllocAlignAttr TmpAttr(Context, CI, ParamIdx()); SourceLocation AttrLoc = CI.getLoc(); - if (!ResultType->isDependentType() && - !isValidPointerAttrType(ResultType, /* RefOkay */ true)) { + if (!isValidPointerAttrType(ResultType, /* RefOkay */ true)) { Diag(AttrLoc, diag::warn_attribute_return_pointers_refs_only) << &TmpAttr << CI.getRange() << getFunctionOrMethodResultSourceRange(D); return; diff --git a/clang/test/SemaCXX/builtin-assume-aligned-tmpl.cpp b/clang/test/SemaCXX/builtin-assume-aligned-tmpl.cpp index 61b85557d6b294..e709c936735c74 100644 --- a/clang/test/SemaCXX/builtin-assume-aligned-tmpl.cpp +++ b/clang/test/SemaCXX/builtin-assume-aligned-tmpl.cpp @@ -52,6 +52,12 @@ T *atest3() __attribute__((assume_aligned(31, o))); // expected-error {{requeste template <typename T, int o> T *atest4() __attribute__((assume_aligned(32, o))); +template<typename T> +T atest5(int) __attribute__((assume_aligned(2))); + +// expected-warning@+1 {{'assume_aligned' attribute only applies to return values that are pointers or references}} +int atest6(int) __attribute__((assume_aligned(2))); + void test22() { atest3<int, 5>(); atest4<int, 5>(); diff --git a/clang/test/SemaObjCXX/noescape.mm b/clang/test/SemaObjCXX/noescape.mm index 4b52164dffd3da..cdcad07feb2bc8 100644 --- a/clang/test/SemaObjCXX/noescape.mm +++ b/clang/test/SemaObjCXX/noescape.mm @@ -17,7 +17,7 @@ void noescapeFunc2(int *); // expected-error {{conflicting types for 'noescapeFunc2'}} template <class T> -void noescapeFunc5(__attribute__((noescape)) T); // expected-warning {{'noescape' attribute only applies to pointer arguments}} +void noescapeFunc5(__attribute__((noescape)) T); template <class T> void noescapeFunc6(__attribute__((noescape)) const T &); template <class T> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits