1 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
2 // RUN: -triple x86_64-linux-gnu \
3 // RUN: -verify %s 2>&1 | FileCheck %s --check-prefixes=CHECK-PRGM
4
5 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
6 // RUN: -triple x86_64-linux-gnu -freciprocal-math \
7 // RUN: -verify %s 2>&1 | FileCheck %s --check-prefixes=CHECK-RECPR,CHECK-PRGM
8
9 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
10 // RUN: -triple x86_64-linux-gnu -mreassociate \
11 // RUN: -verify %s 2>&1 | FileCheck %s --check-prefixes=CHECK-ASSOC,CHECK-PRGM
12
13 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
14 // RUN: -triple x86_64-linux-gnu -fapprox-func \
15 // RUN: -verify %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FUNC,CHECK-PRGM
16
17 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
18 // RUN: -triple x86_64-linux-gnu -freciprocal-math -mreassociate -verify \
19 // RUN: %s 2>&1 | FileCheck %s --check-prefixes=CHECK-ASSOC,CHECK-RECPR,CHECK-PRGM
20
21 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
22 // RUN: -triple x86_64-linux-gnu -freciprocal-math -mreassociate -fapprox-func \
23 // RUN: -verify %s 2>&1 \
24 // RUN: | FileCheck %s --check-prefixes=CHECK-FUNC,CHECK-ASSOC,CHECK-RECPR,CHECK-PRGM
25
26 // RUN: not %clang_cc1 -fexperimental-strict-floating-point \
27 // RUN: -triple x86_64-linux-gnu -ffp-eval-method=source \
28 // RUN: -verify %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FFP-OPT,CHECK-PRGM
29
30 // expected-no-diagnostics
31
f1(float a,float b,float c)32 float f1(float a, float b, float c) {
33 a = b + c;
34 return a * b + c;
35 }
36
f2(float a,float b,float c)37 float f2(float a, float b, float c) {
38 // CHECK-FFP-OPT: option 'ffp-eval-method' cannot be used with '#pragma clang fp reassociate'
39 #pragma clang fp reassociate(on)
40 return (a + b) + c;
41 }
42
f3(float a,float b,float c)43 float f3(float a, float b, float c) {
44 #pragma clang fp reassociate(off)
45 return (a - b) - c;
46 }
47
f4(float a,float b,float c)48 float f4(float a, float b, float c) {
49 #pragma clang fp eval_method(double)
50 // CHECK-FUNC: '#pragma clang fp eval_method' cannot be used with option 'fapprox-func'
51 // CHECK-ASSOC: '#pragma clang fp eval_method' cannot be used with option 'mreassociate'
52 // CHECK-RECPR: '#pragma clang fp eval_method' cannot be used with option 'freciprocal'
53 // CHECK-PRGM: '#pragma clang fp eval_method' cannot be used with '#pragma clang fp reassociate'
54 #pragma clang fp reassociate(on)
55 return (a * c) - (b * c);
56 }
57
f4_reciprocal(float a,float b,float c)58 float f4_reciprocal(float a, float b, float c) {
59 #pragma clang fp eval_method(double)
60 // CHECK-FUNC: '#pragma clang fp eval_method' cannot be used with option 'fapprox-func'
61 // CHECK-ASSOC: '#pragma clang fp eval_method' cannot be used with option 'mreassociate'
62 // CHECK-RECPR: '#pragma clang fp eval_method' cannot be used with option 'freciprocal'
63 // CHECK-PRGM: '#pragma clang fp eval_method' cannot be used with '#pragma clang fp reciprocal'
64 #pragma clang fp reciprocal(on)
65 return (a * c) / (b * c);
66 }
67
f4_reciprocal_reassociate(float a,float b,float c)68 float f4_reciprocal_reassociate(float a, float b, float c) {
69 #pragma clang fp eval_method(double)
70 // CHECK-FUNC: '#pragma clang fp eval_method' cannot be used with option 'fapprox-func'
71 // CHECK-ASSOC: '#pragma clang fp eval_method' cannot be used with option 'mreassociate'
72 // CHECK-RECPR: '#pragma clang fp eval_method' cannot be used with option 'freciprocal'
73 // CHECK-PRGM: '#pragma clang fp eval_method' cannot be used with '#pragma clang fp reassociate'
74 // CHECK-PRGM: '#pragma clang fp eval_method' cannot be used with '#pragma clang fp reciprocal'
75 #pragma clang fp reciprocal(on) reassociate(on)
76 return (a * c) / (b * c);
77 }
78
f2_reciprocal(float a,float b,float c)79 float f2_reciprocal(float a, float b, float c) {
80 // CHECK-FFP-OPT: option 'ffp-eval-method' cannot be used with '#pragma clang fp reciprocal'
81 #pragma clang fp reciprocal(on)
82 return (a + b) / c;
83 }
84
f3_reciprocal(float a,float b,float c)85 float f3_reciprocal(float a, float b, float c) {
86 #pragma clang fp reciprocal(off)
87 return (a - b) / c;
88 }
89