1 // RUN: %clang_cc1 -x c++ -ftrapping-math -fexceptions -fcxx-exceptions -frounding-math -ffp-exception-behavior=strict -emit-llvm -o - %s | FileCheck %s -check-prefix=FPMODELSTRICT
2 // RUN: %clang_cc1 -x c++ -ffp-contract=fast -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s -check-prefix=PRECISE
3 // RUN: %clang_cc1 -x c++ -ffast-math -fexceptions -fcxx-exceptions -ffp-contract=fast -emit-llvm -o - %s | FileCheck %s -check-prefix=FAST
4 // RUN: %clang_cc1 -x c++ -ffast-math -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s -check-prefix=FAST
5 // RUN: %clang_cc1 -x c++ -ffast-math -fexceptions -fcxx-exceptions -ffp-contract=fast -ffp-exception-behavior=ignore -emit-llvm -o - %s | FileCheck %s -check-prefix=FAST
6 // RUN: %clang_cc1 -x c++ -ffast-math -fexceptions -fcxx-exceptions -ffp-contract=fast -ffp-exception-behavior=strict -emit-llvm -o - %s | FileCheck %s -check-prefix=EXCEPT
7 // RUN: %clang_cc1 -x c++ -ffast-math -fexceptions -fcxx-exceptions -ffp-contract=fast -ffp-exception-behavior=maytrap -emit-llvm -o - %s | FileCheck %s -check-prefix=MAYTRAP
8 float f0, f1, f2;
9 
10   template <class>
11   class aaaa {
12    public:
13     ~aaaa();
14     void b();
15   };
16 
17   template <class c>
18   aaaa<c>::~aaaa() { try {
19     b();
20   // CHECK-LABEL: define {{.*}}void @_ZN4aaaaIiED2Ev{{.*}}
21 
22   } catch (...) {
23   // MAYTRAP: llvm.experimental.constrained.fadd.f32(float %4, float %5, metadata !"round.tonearest", metadata !"fpexcept.maytrap")
24   // EXCEPT: llvm.experimental.constrained.fadd.f32(float %4, float %5, metadata !"round.tonearest", metadata !"fpexcept.strict")
25   // FPMODELSTRICT: llvm.experimental.constrained.fadd.f32(float %4, float %5, metadata !"round.dynamic", metadata !"fpexcept.strict")
26   // STRICTEXCEPT: llvm.experimental.constrained.fadd.f32(float %4, float %5, metadata !"round.dynamic", metadata !"fpexcept.strict")
27   // STRICTNOEXCEPT: llvm.experimental.constrained.fadd.f32(float %4, float %5, metadata !"round.dynamic", metadata !"fpexcept.ignore")
28   // PRECISE: fadd contract float %4, %5
29   // FAST: fadd fast
30   f0 = f1 + f2;
31 
32   // CHECK: ret void
33   }
34   }
35 
36   class d {
37    public:
38     d(const char *, int);
39     aaaa<int> e;
40   };
41 
42 float foo() {
43   d x("", 1);
44   aaaa<int> a;
45   return f0;
46 }
47 
48