2021-12-10 10:31:09 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -target-feature -x87
2021-11-03 17:08:39 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -DNOERROR
# ifdef NOERROR
// expected-no-diagnostics
# endif
typedef long double long_double ;
// Declaration is fine, unless it is called or defined.
double decl ( long_double x , long_double y ) ;
template < typename T >
T decl_ld_del ( T ) ;
// No code is generated for deleted functions
long_double decl_ld_del ( long_double ) = delete ;
double decl_ld_del ( double ) = delete ;
float decl_ld_del ( float ) = delete ;
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+4{{'def' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
// expected-note@+3{{'def' defined here}}
// expected-note@+2{{'x' defined here}}
# endif
int def ( long_double x ) {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+2{{'x' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
return ( int ) x ;
}
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-note@+3{{'ld_args' defined here}}
// expected-note@+2{{'ld_args' defined here}}
# endif
int ld_args ( long_double x , long_double y ) ;
int call1 ( float x , float y ) {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+2 2{{'ld_args' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
return ld_args ( x , y ) ;
}
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-note@+2{{'ld_ret' defined here}}
# endif
long_double ld_ret ( double x , double y ) ;
int call2 ( float x , float y ) {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+2{{'ld_ret' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
return ( int ) ld_ret ( x , y ) ;
}
int binop ( double x , double y ) {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+2 2{{expression requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
double z = ( long_double ) x * ( long_double ) y ;
return ( int ) z ;
}
void assign1 ( long_double * ret , double x ) {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+2{{expression requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
* ret = x ;
}
struct st_long_double1 {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-note@+2{{'ld' defined here}}
# endif
long_double ld ;
} ;
struct st_long_double2 {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-note@+2{{'ld' defined here}}
# endif
long_double ld ;
} ;
struct st_long_double3 {
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-note@+2{{'ld' defined here}}
# endif
long_double ld ;
} ;
void assign2 ( ) {
struct st_long_double1 st ;
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
st . ld = 0.42 ;
}
void assign3 ( ) {
struct st_long_double2 st ;
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
st . ld = 42 ;
}
void assign4 ( double d ) {
struct st_long_double3 st ;
2021-12-10 10:31:09 +08:00
# ifndef NOERROR
2021-11-03 17:08:39 +08:00
// expected-error@+3{{expression requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
// expected-error@+2{{'ld' requires 'long_double' (aka 'long double') type support, but target 'x86_64-unknown-linux-gnu' does not support it}}
# endif
st . ld = d ;
}
void assign5 ( ) {
// unused variable declaration is fine
long_double ld = 0.42 ;
}
// Double and Float return type on x86_64 do not use x87 registers
double d_ret1 ( float x ) {
return 0.0 ;
}
double d_ret2 ( float x ) ;
int d_ret3 ( float x ) {
return ( int ) d_ret2 ( x ) ;
}
float f_ret1 ( float x ) {
return 0.0f ;
}
float f_ret2 ( float x ) ;
int f_ret3 ( float x ) {
return ( int ) f_ret2 ( x ) ;
}