================
@@ -1862,3 +1866,189 @@ void direct_inside_try_catch_with_exception_type() {
 // OGCG:   resume { ptr, i32 }
 // OGCG: [[UNREACHABLE]]:
 // OGCG:   unreachable
+
+const void *init_catch_param_with_ref_to_nullptr() {
+  try {
+    division();
+  } catch (const decltype(nullptr) &n) {
+    return &n;
+  }
+  return nullptr;
+}
+
+// CIR: cir.func {{.*}} @_Z36init_catch_param_with_ref_to_nullptrv() {{.*}} 
personality(@__gxx_personality_v0)
+// CIR:   %[[N_ADDR:.*]] = cir.alloca "n" {{.*}} const : 
!cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+// CIR:   } catch [type #cir.global_view<@_ZTIDn> : !cir.ptr<!u8i>] 
(%[[TOKEN:.*]]: !cir.eh_token {{.*}}) {
+// CIR-NEXT: %[[CATCH_TOKEN:.*]], %[[EXN_PTR:.*]] = cir.begin_catch %[[TOKEN]] 
: !cir.eh_token -> (!cir.catch_token, !cir.ptr<!void>)
+// CIR:     cir.init_catch_param reference %[[EXN_PTR]] to %[[N_ADDR]] : 
!cir.ptr<!void>, !cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+
+// SHARED: define {{.*}} ptr @_Z36init_catch_param_with_ref_to_nullptrv() 
{{.*}} personality ptr @__gxx_personality_v0
+// SHARED:   %[[EXN_PTR:.*]] = call ptr @__cxa_begin_catch(ptr %{{.*}})
+// SHARED:   store ptr %[[EXN_PTR]], ptr %[[N_ADDR:.*]], align 8
+// SHARED-NEXT:   %[[N:.*]] = load ptr, ptr %[[N_ADDR]], align 8
+// SHARED-NEXT:   store ptr %[[N]], ptr %{{.*}}, align 8
+
+const void *init_catch_param_with_ref_to_void_ptr() {
+  try {
+    division();
+  } catch (void *const &p) {
+    return &p;
+  }
+  return nullptr;
+}
+
+// CIR: cir.func {{.*}} @_Z37init_catch_param_with_ref_to_void_ptrv() {{.*}} 
personality(@__gxx_personality_v0)
+// CIR:   %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} const : 
!cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+// CIR:   } catch [type #cir.global_view<@_ZTIPv> : !cir.ptr<!u8i>] 
(%[[TOKEN:.*]]: !cir.eh_token {{.*}}) {
+// CIR-NEXT: cir.construct_catch_param reference_to_pointer %[[TOKEN]] to 
%[[P_ADDR]] using : !cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+// CIR-NEXT: %[[CATCH_TOKEN:.*]], %[[EXN_PTR:.*]] = cir.begin_catch %[[TOKEN]] 
: !cir.eh_token -> (!cir.catch_token, !cir.ptr<!void>)
+// CIR:     cir.init_catch_param reference_to_pointer %[[EXN_PTR]] to 
%[[P_ADDR]] : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+
+// SHARED: define {{.*}} ptr @_Z37init_catch_param_with_ref_to_void_ptrv() 
{{.*}} personality ptr @__gxx_personality_v0
+// LLVM:   %[[EXN_OBJ:.*]] = getelementptr i8, ptr %[[EXN:.*]], i64 32
+// LLVM-NEXT:   store ptr %[[EXN_OBJ]], ptr %[[P_ADDR:.+]], align 8
+// LLVM-NEXT:   %{{.*}} = call ptr @__cxa_begin_catch(ptr %[[EXN]])
+// LLVM-NEXT:   br label %[[CATCH_BODY:.+]]
+// LLVM:      [[CATCH_BODY]]:
+// LLVM-NEXT:   %{{.+}} = load ptr, ptr %[[P_ADDR]], align 8
+
+// OGCG:   %{{.*}} = call ptr @__cxa_begin_catch(ptr %[[EXN:.*]])
+// OGCG-NEXT:   %[[EXN_OBJ:.*]] = getelementptr i8, ptr %[[EXN]], i32 32
+// OGCG-NEXT:   store ptr %[[EXN_OBJ]], ptr %[[P_ADDR:.+]], align 8
+// OGCG-NEXT:   %{{.+}} = load ptr, ptr %[[P_ADDR]], align 8
+
+const void *init_catch_param_with_ref_to_atomic_record_ptr() {
+  try {
+    division();
+  } catch (_Atomic(Record) *const &p) {
+    return &p;
+  }
+  return nullptr;
+}
+
+// CIR: cir.func {{.*}} @_Z46init_catch_param_with_ref_to_atomic_record_ptrv() 
{{.*}} personality(@__gxx_personality_v0)
+// CIR:   %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} const : 
!cir.ptr<!cir.ptr<!cir.ptr<!rec_Record>>>
+// CIR:   } catch [type #cir.global_view<@_ZTIPU7_Atomic6Record> : 
!cir.ptr<!u8i>] (%[[TOKEN:.*]]: !cir.eh_token {{.*}}) {
+// CIR-NEXT: cir.construct_catch_param reference_to_pointer %[[TOKEN]] to 
%[[P_ADDR]] using : !cir.ptr<!cir.ptr<!cir.ptr<!rec_Record>>>
+// CIR-NEXT: %[[CATCH_TOKEN:.*]], %[[EXN_PTR:.*]] = cir.begin_catch %[[TOKEN]] 
: !cir.eh_token -> (!cir.catch_token, !cir.ptr<!void>)
+// CIR:     cir.init_catch_param reference_to_pointer %[[EXN_PTR]] to 
%[[P_ADDR]] : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!cir.ptr<!rec_Record>>>
+
+// SHARED: define {{.*}} ptr 
@_Z46init_catch_param_with_ref_to_atomic_record_ptrv() {{.*}} personality ptr 
@__gxx_personality_v0
+// LLVM:   %[[EXN_OBJ:.*]] = getelementptr i8, ptr %[[EXN:.*]], i64 32
+// LLVM-NEXT:   store ptr %[[EXN_OBJ]], ptr %[[P_ADDR:.+]], align 8
+// LLVM-NEXT:   %{{.*}} = call ptr @__cxa_begin_catch(ptr %[[EXN]])
+// LLVM-NEXT:   br label %[[CATCH_BODY:.+]]
+// LLVM:      [[CATCH_BODY]]:
+// LLVM-NEXT:   %{{.+}} = load ptr, ptr %[[P_ADDR]], align 8
+
+// OGCG:   %{{.*}} = call ptr @__cxa_begin_catch(ptr %[[EXN:.*]])
+// OGCG-NEXT:   %[[EXN_OBJ:.*]] = getelementptr i8, ptr %[[EXN]], i32 32
+// OGCG-NEXT:   store ptr %[[EXN_OBJ]], ptr %[[P_ADDR:.+]], align 8
----------------
andykaylor wrote:

The fact that this doesn't get treated like a pointer-to-record seems like a 
bug, though maybe it's just unspecified behavior since `_Atomic` is a C thing. 
GCC won't compile this at all, so I have no reference for comparison.

https://github.com/llvm/llvm-project/pull/229579
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to