[clang] 1b8830c - [clang][Interp] Fix comparing to integral function pointers
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 12 00:29:25 PDT 2024
Author: Timm Bäder
Date: 2024-04-12T09:29:13+02:00
New Revision: 1b8830c56abd01c9ab70bbbb71a00c2506cf2116
URL: https://github.com/llvm/llvm-project/commit/1b8830c56abd01c9ab70bbbb71a00c2506cf2116
DIFF: https://github.com/llvm/llvm-project/commit/1b8830c56abd01c9ab70bbbb71a00c2506cf2116.diff
LOG: [clang][Interp] Fix comparing to integral function pointers
We need to account for the fact that the Function pointer is not
accessible here. Add FunctionPointer::isWeak() for that.
Added:
Modified:
clang/lib/AST/Interp/FunctionPointer.h
clang/lib/AST/Interp/Interp.h
clang/test/AST/Interp/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/FunctionPointer.h b/clang/lib/AST/Interp/FunctionPointer.h
index 840c1101f396b9..c2ea295b82bdf5 100644
--- a/clang/lib/AST/Interp/FunctionPointer.h
+++ b/clang/lib/AST/Interp/FunctionPointer.h
@@ -32,6 +32,12 @@ class FunctionPointer final {
const Function *getFunction() const { return Func; }
bool isZero() const { return !Func; }
+ bool isWeak() const {
+ if (!Func || !Valid)
+ return false;
+
+ return Func->getDecl()->isWeak();
+ }
APValue toAPValue() const {
if (!Func)
diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index c7012aa4ec680b..4182254357eb9a 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -758,7 +758,7 @@ inline bool CmpHelperEQ<FunctionPointer>(InterpState &S, CodePtr OpPC,
// We cannot compare against weak declarations at compile time.
for (const auto &FP : {LHS, RHS}) {
- if (!FP.isZero() && FP.getFunction()->getDecl()->isWeak()) {
+ if (FP.isWeak()) {
const SourceInfo &Loc = S.Current->getSource(OpPC);
S.FFDiag(Loc, diag::note_constexpr_pointer_weak_comparison)
<< FP.toDiagnosticString(S.getCtx());
diff --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index cdecd3e83a9979..e0b18120fd2110 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -1,7 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-linux -fexperimental-new-constant-interpreter -verify=expected,all -std=c11 -Wcast-qual %s
-// RUN: %clang_cc1 -triple x86_64-linux -fexperimental-new-constant-interpreter -pedantic -verify=pedantic-expected,all -std=c11 -Wcast-qual %s
+// RUN: %clang_cc1 -triple x86_64-linux -fexperimental-new-constant-interpreter -pedantic -verify=pedantic,pedantic-expected,all -std=c11 -Wcast-qual %s
// RUN: %clang_cc1 -triple x86_64-linux -verify=ref,all -std=c11 -Wcast-qual %s
-// RUN: %clang_cc1 -triple x86_64-linux -pedantic -verify=pedantic-ref,all -std=c11 -Wcast-qual %s
+// RUN: %clang_cc1 -triple x86_64-linux -pedantic -verify=pedantic,pedantic-ref,all -std=c11 -Wcast-qual %s
typedef __INTPTR_TYPE__ intptr_t;
typedef __PTRDIFF_TYPE__ ptr
diff _t;
@@ -227,3 +227,9 @@ int castViaInt[*(int*)(unsigned long)"test"]; // ref-error {{variable length arr
// pedantic-ref-error {{variable length array}} \
// expected-error {{variable length array}} \
// pedantic-expected-error {{variable length array}}
+
+const void (*const funcp)(void) = (void*)123; // pedantic-warning {{converts between void pointer and function pointer}}
+_Static_assert(funcp == (void*)0, ""); // all-error {{failed due to requirement 'funcp == (void *)0'}} \
+ // pedantic-warning {{expression is not an integer constant expression}}
+_Static_assert(funcp == (void*)123, ""); // pedantic-warning {{equality comparison between function pointer and void pointer}} \
+ // pedantic-warning {{expression is not an integer constant expression}}
More information about the cfe-commits
mailing list