[clang] [clang] assume_aligned incorrectly diagnoses a dependent return type (PR #111573)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 8 13:10:53 PDT 2024
https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/111573
>From dea97ae4f893774489bfd423e9536e486f022bb9 Mon Sep 17 00:00:00 2001
From: AmrDeveloper <amr96 at 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 at +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>
More information about the cfe-commits
mailing list