| // RUN: %clang_cc1 %s -Wno-unused-value -verify -fsyntax-only |
| // RUN: %clang_cc1 %s -Wno-unused-value -ast-dump -DAST_CHECK | FileCheck %s |
| |
| struct S {}; |
| void usage(float f, int i, double d) { |
| #ifdef AST_CHECK |
| __builtin_fpclassify(d, 1, i, i, 3, d); |
| //CHECK: CallExpr |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: <BuiltinFnToFnPtr> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: '__builtin_fpclassify' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <FloatingToIntegral> |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'double' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'd' 'double' |
| //CHECK-NEXT: IntegerLiteral |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'i' 'int' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'i' 'int' |
| //CHECK-NEXT: IntegerLiteral |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'double' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'd' 'double' |
| |
| __builtin_fpclassify(f, 1, i, i, 3, f); |
| //CHECK: CallExpr |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: <BuiltinFnToFnPtr> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: '__builtin_fpclassify' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <FloatingToIntegral> |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'float' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'f' 'float' |
| //CHECK-NEXT: IntegerLiteral |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'i' 'int' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'int' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'i' 'int' |
| //CHECK-NEXT: IntegerLiteral |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'float' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'f' 'float' |
| |
| __builtin_isfinite(f); |
| //CHECK: CallExpr |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: <BuiltinFnToFnPtr> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: '__builtin_isfinite' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'float' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'f' 'float' |
| |
| __builtin_isfinite(d); |
| //CHECK: CallExpr |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: <BuiltinFnToFnPtr> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: '__builtin_isfinite' |
| //CHECK-NEXT: ImplicitCastExpr |
| //CHECK-SAME: 'double' <LValueToRValue> |
| //CHECK-NEXT: DeclRefExpr |
| //CHECK-SAME: 'd' 'double' |
| #else |
| struct S s; |
| // expected-error@+1{{passing 'struct S' to parameter of incompatible type 'int'}} |
| __builtin_fpclassify(d, s, i, i, 3, d); |
| // expected-error@+1{{floating point classification requires argument of floating point type (passed in 'int')}} |
| __builtin_fpclassify(d, 1, i, i, 3, i); |
| // expected-error@+1{{floating point classification requires argument of floating point type (passed in 'int')}} |
| __builtin_isfinite(i); |
| #endif |
| } |