aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Compiler.cpp
diff options
context:
space:
mode:
authorEli Friedman <efriedma@quicinc.com>2025-07-30 18:15:17 -0700
committerGitHub <noreply@github.com>2025-07-30 18:15:17 -0700
commit0bbe1b30faf57b5007d7be6af64ae423b4992de4 (patch)
treecf782b15bd0e67a8fab57c2385c94e453b097c6b /clang/lib/AST/ByteCode/Compiler.cpp
parentd3f500f2d9238ac96f1afad1091d461ae98530ac (diff)
downloadllvm-0bbe1b30faf57b5007d7be6af64ae423b4992de4.zip
llvm-0bbe1b30faf57b5007d7be6af64ae423b4992de4.tar.gz
llvm-0bbe1b30faf57b5007d7be6af64ae423b4992de4.tar.bz2
[clang] Forbid reinterpret_cast of function pointers in constexpr. (#150557)
This has been explicitly forbidden since C++11, but somehow the edge case of converting a function pointer to void* using a cast like `(void*)f` wasn't handled. Fixes #150340 .
Diffstat (limited to 'clang/lib/AST/ByteCode/Compiler.cpp')
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index d0ddb2e..2f22d5c 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -457,13 +457,17 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
assert(isPtrType(*FromT));
assert(isPtrType(*ToT));
if (FromT == ToT) {
- if (CE->getType()->isVoidPointerType())
+ if (CE->getType()->isVoidPointerType() &&
+ !SubExprTy->isFunctionPointerType()) {
return this->delegate(SubExpr);
+ }
if (!this->visit(SubExpr))
return false;
- if (CE->getType()->isFunctionPointerType())
- return true;
+ if (CE->getType()->isFunctionPointerType() ||
+ SubExprTy->isFunctionPointerType()) {
+ return this->emitFnPtrCast(CE);
+ }
if (FromT == PT_Ptr)
return this->emitPtrPtrCast(SubExprTy->isVoidPointerType(), CE);
return true;