1 // RUN: %clang_cc1 %s -Wno-unused-value -verify -fsyntax-only
2 // RUN: %clang_cc1 %s -Wno-unused-value -ast-dump -DAST_CHECK | FileCheck %s
3
4 struct S {};
usage(float f,int i,double d)5 void usage(float f, int i, double d) {
6 #ifdef AST_CHECK
7 __builtin_fpclassify(d, 1, i, i, 3, d);
8 //CHECK: CallExpr
9 //CHECK-NEXT: ImplicitCastExpr
10 //CHECK-SAME: <BuiltinFnToFnPtr>
11 //CHECK-NEXT: DeclRefExpr
12 //CHECK-SAME: '__builtin_fpclassify'
13 //CHECK-NEXT: ImplicitCastExpr
14 //CHECK-SAME: 'int' <FloatingToIntegral>
15 //CHECK-NEXT: ImplicitCastExpr
16 //CHECK-SAME: 'double' <LValueToRValue>
17 //CHECK-NEXT: DeclRefExpr
18 //CHECK-SAME: 'd' 'double'
19 //CHECK-NEXT: IntegerLiteral
20 //CHECK-NEXT: ImplicitCastExpr
21 //CHECK-SAME: 'int' <LValueToRValue>
22 //CHECK-NEXT: DeclRefExpr
23 //CHECK-SAME: 'i' 'int'
24 //CHECK-NEXT: ImplicitCastExpr
25 //CHECK-SAME: 'int' <LValueToRValue>
26 //CHECK-NEXT: DeclRefExpr
27 //CHECK-SAME: 'i' 'int'
28 //CHECK-NEXT: IntegerLiteral
29 //CHECK-NEXT: ImplicitCastExpr
30 //CHECK-SAME: 'double' <LValueToRValue>
31 //CHECK-NEXT: DeclRefExpr
32 //CHECK-SAME: 'd' 'double'
33
34 __builtin_fpclassify(f, 1, i, i, 3, f);
35 //CHECK: CallExpr
36 //CHECK-NEXT: ImplicitCastExpr
37 //CHECK-SAME: <BuiltinFnToFnPtr>
38 //CHECK-NEXT: DeclRefExpr
39 //CHECK-SAME: '__builtin_fpclassify'
40 //CHECK-NEXT: ImplicitCastExpr
41 //CHECK-SAME: 'int' <FloatingToIntegral>
42 //CHECK-NEXT: ImplicitCastExpr
43 //CHECK-SAME: 'float' <LValueToRValue>
44 //CHECK-NEXT: DeclRefExpr
45 //CHECK-SAME: 'f' 'float'
46 //CHECK-NEXT: IntegerLiteral
47 //CHECK-NEXT: ImplicitCastExpr
48 //CHECK-SAME: 'int' <LValueToRValue>
49 //CHECK-NEXT: DeclRefExpr
50 //CHECK-SAME: 'i' 'int'
51 //CHECK-NEXT: ImplicitCastExpr
52 //CHECK-SAME: 'int' <LValueToRValue>
53 //CHECK-NEXT: DeclRefExpr
54 //CHECK-SAME: 'i' 'int'
55 //CHECK-NEXT: IntegerLiteral
56 //CHECK-NEXT: ImplicitCastExpr
57 //CHECK-SAME: 'float' <LValueToRValue>
58 //CHECK-NEXT: DeclRefExpr
59 //CHECK-SAME: 'f' 'float'
60
61 __builtin_isfinite(f);
62 //CHECK: CallExpr
63 //CHECK-NEXT: ImplicitCastExpr
64 //CHECK-SAME: <BuiltinFnToFnPtr>
65 //CHECK-NEXT: DeclRefExpr
66 //CHECK-SAME: '__builtin_isfinite'
67 //CHECK-NEXT: ImplicitCastExpr
68 //CHECK-SAME: 'float' <LValueToRValue>
69 //CHECK-NEXT: DeclRefExpr
70 //CHECK-SAME: 'f' 'float'
71
72 __builtin_isfinite(d);
73 //CHECK: CallExpr
74 //CHECK-NEXT: ImplicitCastExpr
75 //CHECK-SAME: <BuiltinFnToFnPtr>
76 //CHECK-NEXT: DeclRefExpr
77 //CHECK-SAME: '__builtin_isfinite'
78 //CHECK-NEXT: ImplicitCastExpr
79 //CHECK-SAME: 'double' <LValueToRValue>
80 //CHECK-NEXT: DeclRefExpr
81 //CHECK-SAME: 'd' 'double'
82 #else
83 struct S s;
84 // expected-error@+1{{passing 'struct S' to parameter of incompatible type 'int'}}
85 __builtin_fpclassify(d, s, i, i, 3, d);
86 // expected-error@+1{{floating point classification requires argument of floating point type (passed in 'int')}}
87 __builtin_fpclassify(d, 1, i, i, 3, i);
88 // expected-error@+1{{floating point classification requires argument of floating point type (passed in 'int')}}
89 __builtin_isfinite(i);
90 #endif
91 }
92