1*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
2*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
3*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
4*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
5*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
6*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
7*ed128c7dSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
8*ed128c7dSVlad Serebrennikov
9*ed128c7dSVlad Serebrennikov #if __cplusplus == 199711L
10*ed128c7dSVlad Serebrennikov #define NOTHROW throw()
11*ed128c7dSVlad Serebrennikov #else
12*ed128c7dSVlad Serebrennikov #define NOTHROW noexcept(true)
13*ed128c7dSVlad Serebrennikov #endif
14*ed128c7dSVlad Serebrennikov
15*ed128c7dSVlad Serebrennikov namespace cwg124 { // cwg124: 2.7
16*ed128c7dSVlad Serebrennikov
17*ed128c7dSVlad Serebrennikov extern void full_expr_fence() NOTHROW;
18*ed128c7dSVlad Serebrennikov
19*ed128c7dSVlad Serebrennikov struct A {
Acwg124::A20*ed128c7dSVlad Serebrennikov A() NOTHROW {}
~Acwg124::A21*ed128c7dSVlad Serebrennikov ~A() NOTHROW {}
22*ed128c7dSVlad Serebrennikov };
23*ed128c7dSVlad Serebrennikov
24*ed128c7dSVlad Serebrennikov struct B {
Bcwg124::B25*ed128c7dSVlad Serebrennikov B(A = A()) NOTHROW {}
~Bcwg124::B26*ed128c7dSVlad Serebrennikov ~B() NOTHROW {}
27*ed128c7dSVlad Serebrennikov };
28*ed128c7dSVlad Serebrennikov
f()29*ed128c7dSVlad Serebrennikov void f() {
30*ed128c7dSVlad Serebrennikov full_expr_fence();
31*ed128c7dSVlad Serebrennikov B b[2];
32*ed128c7dSVlad Serebrennikov full_expr_fence();
33*ed128c7dSVlad Serebrennikov }
34*ed128c7dSVlad Serebrennikov
35*ed128c7dSVlad Serebrennikov // CHECK-LABEL: define {{.*}} void @cwg124::f()()
36*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::full_expr_fence()
37*ed128c7dSVlad Serebrennikov // CHECK: br label %arrayctor.loop
38*ed128c7dSVlad Serebrennikov // CHECK-LABEL: arrayctor.loop:
39*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::A::A()
40*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::B::B(cwg124::A)
41*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::A::~A()
42*ed128c7dSVlad Serebrennikov // CHECK: br {{.*}}, label %arrayctor.cont, label %arrayctor.loop
43*ed128c7dSVlad Serebrennikov // CHECK-LABEL: arrayctor.cont:
44*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::full_expr_fence()
45*ed128c7dSVlad Serebrennikov // CHECK: br label %arraydestroy.body
46*ed128c7dSVlad Serebrennikov // CHECK-LABEL: arraydestroy.body:
47*ed128c7dSVlad Serebrennikov // CHECK: call void @cwg124::B::~B()
48*ed128c7dSVlad Serebrennikov // CHECK-LABEL: }
49*ed128c7dSVlad Serebrennikov
50*ed128c7dSVlad Serebrennikov
51*ed128c7dSVlad Serebrennikov } // namespace cwg124
52