[clang] 0417cd1 - [Clang] FunctionEffects: Correctly navigate through array types in FunctionEffectsRef::get(). (#121525)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 17 07:11:40 PST 2025
Author: Doug Wyatt
Date: 2025-01-17T07:11:36-08:00
New Revision: 0417cd1b3e66c06966a3685f143df9228e2444b1
URL: https://github.com/llvm/llvm-project/commit/0417cd1b3e66c06966a3685f143df9228e2444b1
DIFF: https://github.com/llvm/llvm-project/commit/0417cd1b3e66c06966a3685f143df9228e2444b1.diff
LOG: [Clang] FunctionEffects: Correctly navigate through array types in FunctionEffectsRef::get(). (#121525)
`FunctionEffectsRef::get()` is supposed to strip off layers of
indirection (pointers/references, type sugar) to get to a
`FunctionProtoType` (if any) and return its effects (if any).
It wasn't correctly dealing with situations where the compiler
implicitly converts an array to a pointer.
---------
Co-authored-by: Doug Wyatt <dwyatt at apple.com>
Co-authored-by: Sirraide <aeternalmail at gmail.com>
Added:
Modified:
clang/include/clang/AST/Type.h
clang/test/Sema/attr-nonblocking-constraints.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index f0fbacccc97bb3..3457d524c63aaa 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -8841,13 +8841,16 @@ void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val,
unsigned Scale);
inline FunctionEffectsRef FunctionEffectsRef::get(QualType QT) {
+ const Type *TypePtr = QT.getTypePtr();
while (true) {
- QualType Pointee = QT->getPointeeType();
- if (Pointee.isNull())
+ if (QualType Pointee = TypePtr->getPointeeType(); !Pointee.isNull())
+ TypePtr = Pointee.getTypePtr();
+ else if (TypePtr->isArrayType())
+ TypePtr = TypePtr->getBaseElementTypeUnsafe();
+ else
break;
- QT = Pointee;
}
- if (const auto *FPT = QT->getAs<FunctionProtoType>())
+ if (const auto *FPT = TypePtr->getAs<FunctionProtoType>())
return FPT->getFunctionEffects();
return {};
}
diff --git a/clang/test/Sema/attr-nonblocking-constraints.cpp b/clang/test/Sema/attr-nonblocking-constraints.cpp
index bbc909f627f4c3..b26a9458436960 100644
--- a/clang/test/Sema/attr-nonblocking-constraints.cpp
+++ b/clang/test/Sema/attr-nonblocking-constraints.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -fblocks -fcxx-exceptions -std=c++20 -verify -Wfunction-effects %s
+// RUN: %clang_cc1 -fsyntax-only -fblocks -fcxx-exceptions -std=c++20 -verify -Wfunction-effects -Wno-vla-extension %s
// These are in a separate file because errors (e.g. incompatible attributes) currently prevent
// the FXAnalysis pass from running at all.
@@ -246,6 +246,23 @@ void PTMFTester::convert() [[clang::nonblocking]]
(this->*mConvertFunc)();
}
+// Allow implicit conversion from array to pointer.
+void nb14(unsigned idx) [[clang::nonblocking]]
+{
+ using FP = void (*)() [[clang::nonblocking]];
+ using FPArray = FP[2];
+ auto nb = +[]() [[clang::nonblocking]] {};
+
+ FPArray src{ nb, nullptr };
+ FP f = src[idx]; // This should not generate a warning.
+
+ FP twoDim[2][2] = {};
+ FP g = twoDim[1][1];
+
+ FP vla[idx];
+ FP h = vla[0];
+}
+
// Block variables
void nb17(void (^blk)() [[clang::nonblocking]]) [[clang::nonblocking]] {
blk();
More information about the cfe-commits
mailing list