Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2022-11-13 01:58:07 +0300
committerRoman Lebedev <lebedev.ri@gmail.com>2022-11-13 02:39:52 +0300
commit6daa005b90c8122751d04c6eba0fa1259e912cfe (patch)
treed116254f1f826f3a450904488d3c7e8d2b886018
parent858a6ec3af29a6483f013cc382de7860c0f33351 (diff)
[NFC][Clang] Add some codegen tests for https://github.com/llvm/llvm-project/issues/58798
-rw-r--r--clang/test/CodeGenCXX/pr58798.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/pr58798.cpp b/clang/test/CodeGenCXX/pr58798.cpp
new file mode 100644
index 000000000000..607b36aa7f69
--- /dev/null
+++ b/clang/test/CodeGenCXX/pr58798.cpp
@@ -0,0 +1,186 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-attributes
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions | FileCheck %s
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z54early_caller_of_callee_with_clang_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3:[0-9]+]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z22callee_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
+// CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+// CHECK: if.then:
+// CHECK-NEXT: [[EXCEPTION:%.*]] = call ptr @__cxa_allocate_exception(i64 4) #[[ATTR4:[0-9]+]]
+// CHECK-NEXT: store i32 42, ptr [[EXCEPTION]], align 16
+// CHECK-NEXT: call void @__cxa_throw(ptr [[EXCEPTION]], ptr @_ZTIi, ptr null) #[[ATTR5:[0-9]+]]
+// CHECK-NEXT: unreachable
+// CHECK: if.end:
+// CHECK-NEXT: ret i32 24
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z52early_caller_of_callee_with_clang_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z52early_caller_of_callee_with_cxx_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z20callee_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] personality ptr @__gxx_personality_v0 {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
+// CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+// CHECK: if.then:
+// CHECK-NEXT: [[EXCEPTION:%.*]] = call ptr @__cxa_allocate_exception(i64 4) #[[ATTR4]]
+// CHECK-NEXT: store i32 42, ptr [[EXCEPTION]], align 16
+// CHECK-NEXT: invoke void @__cxa_throw(ptr [[EXCEPTION]], ptr @_ZTIi, ptr null) #[[ATTR5]]
+// CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
+// CHECK: if.end:
+// CHECK-NEXT: ret i32 24
+// CHECK: terminate.lpad:
+// CHECK-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 }
+// CHECK-NEXT: catch ptr null
+// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
+// CHECK-NEXT: call void @__clang_call_terminate(ptr [[TMP2]]) #[[ATTR6:[0-9]+]]
+// CHECK-NEXT: unreachable
+// CHECK: unreachable:
+// CHECK-NEXT: unreachable
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z50early_caller_of_callee_with_cxx_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+
+
+// Forward declarations:
+
+__attribute__((pure)) int callee_with_clang_attr(int a);
+int callee_with_cxx_attr(int a) noexcept;
+
+// Calls to forward declarations:
+
+__attribute__((pure)) int early_caller_of_callee_with_clang_attr_with_clang_attr(int a) {
+ return callee_with_clang_attr(a);
+}
+
+int early_caller_of_callee_with_clang_attr_with_cxx_attr(int a) noexcept {
+ return callee_with_clang_attr(a);
+}
+
+__attribute__((pure)) int early_caller_of_callee_with_cxx_attr_with_clang_attr(int a) {
+ return callee_with_cxx_attr(a);
+}
+
+int early_caller_of_callee_with_cxx_attr_with_cxx_attr(int a) noexcept {
+ return callee_with_cxx_attr(a);
+}
+
+// Definitions:
+
+__attribute__((pure)) int callee_with_clang_attr(int a) {
+ if(a)
+ throw int(42);
+ return 24;
+}
+
+int callee_with_cxx_attr(int a) noexcept {
+ if(a)
+ throw int(42);
+ return 24;
+}
+
+// Calls to definitions:
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z53late_caller_of_callee_with_clang_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+__attribute__((pure)) int late_caller_of_callee_with_clang_attr_with_clang_attr(int a) {
+ return callee_with_clang_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z51late_caller_of_callee_with_clang_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+int late_caller_of_callee_with_clang_attr_with_cxx_attr(int a) noexcept {
+ return callee_with_clang_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z51late_caller_of_callee_with_cxx_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+__attribute__((pure)) int late_caller_of_callee_with_cxx_attr_with_clang_attr(int a) {
+ return callee_with_cxx_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z49late_caller_of_callee_with_cxx_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT: ret i32 [[CALL]]
+//
+int late_caller_of_callee_with_cxx_attr_with_cxx_attr(int a) noexcept {
+ return callee_with_cxx_attr(a);
+}