aboutsummaryrefslogtreecommitdiff
path: root/clang/test
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-03-31 18:53:01 +0200
committerGitHub <noreply@github.com>2025-03-31 18:53:01 +0200
commit11dd7d98a6ecd2374289b6a217e358e503d4778a (patch)
tree484d99766328a2d9598fe50a0b7af9b4945f5115 /clang/test
parent9cdab16da99ad9fdb823853fbc634008229e284f (diff)
downloadllvm-11dd7d98a6ecd2374289b6a217e358e503d4778a.zip
llvm-11dd7d98a6ecd2374289b6a217e358e503d4778a.tar.gz
llvm-11dd7d98a6ecd2374289b6a217e358e503d4778a.tar.bz2
[clang][bytecode] Reject constexpr-unknown values from comparisons (#133701)
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/AST/ByteCode/codegen-constexpr-unknown.cpp72
-rw-r--r--clang/test/AST/ByteCode/codegen-mutable-read.cpp36
2 files changed, 72 insertions, 36 deletions
diff --git a/clang/test/AST/ByteCode/codegen-constexpr-unknown.cpp b/clang/test/AST/ByteCode/codegen-constexpr-unknown.cpp
new file mode 100644
index 0000000..f62117d
--- /dev/null
+++ b/clang/test/AST/ByteCode/codegen-constexpr-unknown.cpp
@@ -0,0 +1,72 @@
+// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -fcxx-exceptions -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -fcxx-exceptions -o - %s -fexperimental-new-constant-interpreter | FileCheck %s
+
+
+/// In the if expression below, the read from s.i should fail.
+/// If it doesn't, and we actually read the value 0, the call to
+/// func() will always occur, resuliting in a runtime failure.
+
+struct S {
+ mutable int i = 0;
+};
+
+void func() {
+ __builtin_abort();
+};
+
+void setI(const S &s) {
+ s.i = 12;
+}
+
+int main() {
+ const S s;
+
+ setI(s);
+
+ if (s.i == 0)
+ func();
+
+ return 0;
+}
+
+// CHECK: define dso_local noundef i32 @main()
+// CHECK: br
+// CHECK: if.then
+// CHECK: if.end
+// CHECK: ret i32 0
+
+
+/// Similarly, here we revisit the BindingDecl.
+struct F { int x; };
+int main2() {
+ const F const s{99};
+ const auto& [r1] = s;
+ if (&r1 != &s.x)
+ __builtin_abort();
+ return 0;
+}
+// CHECK: define dso_local noundef i32 @_Z5main2v()
+// CHECK: br
+// CHECK: if.then
+// CHECK: if.end
+// CHECK: ret i32 0
+
+/// The comparison here should work and return 0.
+class X {
+public:
+ X();
+ X(const X&);
+ X(const volatile X &);
+ ~X();
+};
+extern X OuterX;
+X test24() {
+ X x;
+ if (&x == &OuterX)
+ throw 0;
+ return x;
+}
+
+// CHECK: define dso_local void @_Z6test24v
+// CHECK-NOT: lpad
+// CHECK-NOT: eh.resume
diff --git a/clang/test/AST/ByteCode/codegen-mutable-read.cpp b/clang/test/AST/ByteCode/codegen-mutable-read.cpp
deleted file mode 100644
index afa46d3..0000000
--- a/clang/test/AST/ByteCode/codegen-mutable-read.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s
-
-
-/// In the if expression below, the read from s.i should fail.
-/// If it doesn't, and we actually read the value 0, the call to
-/// func() will always occur, resuliting in a runtime failure.
-
-struct S {
- mutable int i = 0;
-};
-
-void func() {
- __builtin_abort();
-};
-
-void setI(const S &s) {
- s.i = 12;
-}
-
-int main() {
- const S s;
-
- setI(s);
-
- if (s.i == 0)
- func();
-
- return 0;
-}
-
-// CHECK: define dso_local noundef i32 @main()
-// CHECK: br
-// CHECK: if.then
-// CHECK: if.end
-// CHECK: ret i32 0