Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/g++.dg/ext/sve-sizeless-2.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/g++.dg/ext/sve-sizeless-2.C Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,420 @@ +// { dg-do compile { target aarch64*-*-* } } +// { dg-options "-Wclass-memaccess -msve-vector-bits=256" } + +#pragma GCC target "+sve" + +typedef __SIZE_TYPE__ size_t; +inline void *operator new (size_t, void *__p) throw() { return __p; } + +#include <arm_sve.h> + +typedef signed char int8x32_t __attribute__((__vector_size__ (32))); + +// Sizeless objects with global scope. + +svint8_t global_sve_sc; // { dg-error {SVE type 'svint8_t' does not have a fixed size} } +static svint8_t local_sve_sc; // { dg-error {SVE type 'svint8_t' does not have a fixed size} } +extern svint8_t extern_sve_sc; // { dg-error {SVE type 'svint8_t' does not have a fixed size} } +__thread svint8_t tls_sve_sc; // { dg-error {variables of type 'svint8_t' cannot have thread-local storage duration} } + +// Sizeless arrays. + +typedef svint8_t array_type[2]; // { dg-error {array elements cannot have SVE type 'svint8_t'} } +extern svint8_t extern_array[]; // { dg-error {array elements cannot have SVE type 'svint8_t'} } + +// Sizeless member variables. + +struct struct1 { + svint8_t a; // { dg-error {member variables cannot have SVE type 'svint8_t'} } +}; + +union union1 { + svint8_t a; // { dg-error {member variables cannot have SVE type 'svint8_t'} } +}; + +#if __cplusplus >= 201103L +struct static_sve_sc { + static svint8_t sve_sc1 = {}; // { dg-error {SVE type 'svint8_t' does not have a fixed size} "" { target c++11 } } +}; +#endif + +// Sizeless member variables in templated structures. + +template<typename T> +struct templated_struct1 { + svint8_t a; // { dg-error {member variables cannot have SVE type 'svint8_t'} } +}; + +template<typename T> +struct templated_struct2 { + T a; // { dg-error {member variables cannot have SVE type '(svint8_t|__SVInt8_t)'} } +}; + +template class templated_struct2<svint8_t>; + +template<typename T> +struct templated_struct3 { + T &a; +}; + +template class templated_struct3<svint8_t>; + +#if __cplusplus >= 201103L +template<typename T> +struct templated_struct4 { + static T a; // { dg-error {SVE type '(svint8_t|__SVInt8_t)' does not have a fixed size} "" { target c++11 } } + static T b = {}; // { dg-error {SVE type '(svint8_t|__SVInt8_t)' does not have a fixed size} "" { target c++11 } } +}; + +template class templated_struct4<svint8_t>; +#endif + +template<typename T> struct templated_struct5 : T {}; // { dg-error {base type '[^']*' fails to be a struct or class type} } +template class templated_struct5<svint8_t>; + +#if __cplusplus >= 201103L +template<int N> using typedef_sizeless1 = svint8_t; +template<int N> using typedef_sizeless1 = svint8_t; +template<typename T> using array = T[2]; +#endif + +// Pointers to sizeless types. + +svint8_t *global_sve_sc_ptr; + +// Sizeless arguments and return values. + +void ext_consume_sve_sc (svint8_t); +void ext_consume_const_int_ref (const int &); +void ext_consume_varargs (int, ...); +svint8_t ext_produce_sve_sc (); + +// Sizeless types in throw specifications. + +#if __cplusplus < 201103L +void thrower1 () throw (svint8_t); // { dg-error {cannot throw or catch SVE type 'svint8_t'} "" { target c++98_only } } +void thrower2 () throw (svint8_t); // { dg-error {cannot throw or catch SVE type 'svint8_t'} "" { target c++98_only } } +void thrower3 () throw (svint8_t); // { dg-error {cannot throw or catch SVE type 'svint8_t'} "" { target c++98_only } } +#endif + +// Main tests for statements and expressions. + +void +statements (int n) +{ + // Local declarations. + + svint8_t sve_sc1, sve_sc2; + volatile svint8_t volatile_sve_sc1; + int8x32_t gnu_sc1; + svint16_t sve_sh1; + + // Layout queries. + + sizeof (svint8_t); // { dg-error {SVE type 'svint8_t' does not have a fixed size} } + sizeof (sve_sc1); // { dg-error {SVE type 'svint8_t' does not have a fixed size} } + sizeof (ext_produce_sve_sc ()); // { dg-error {SVE type 'svint8_t' does not have a fixed size} } + __alignof (svint8_t); // { dg-error {SVE type 'svint8_t' does not have a defined alignment} } + __alignof (sve_sc1); // { dg-error {SVE type 'svint8_t' does not have a defined alignment} } + __alignof (ext_produce_sve_sc ()); // { dg-error {SVE type 'svint8_t' does not have a defined alignment} } + +#if __cplusplus >= 201103L + array<svint8_t> foo = {}; // { dg-error {array elements cannot have SVE type '(svint8_t|__SVInt8_t)'} "" { target c++11 } } +#endif + + // Initialization. + + int init_int1 = sve_sc1; // { dg-error {cannot convert 'svint8_t' to 'int' in initialization} } + int init_int2 = { sve_sc1 }; // { dg-error {cannot convert 'svint8_t' to 'int' in initialization} } + + svint8_t init_sve_sc1 (sve_sc1); + svint8_t init_sve_sc2 (sve_sh1); // { dg-error {cannot convert 'svint16_t' to 'svint8_t'} } + svint8_t init_sve_sc3 = sve_sc1; + svint8_t init_sve_sc4 = sve_sh1; // { dg-error {cannot convert 'svint16_t' to 'svint8_t'} } + svint8_t init_sve_sc5 = {}; + svint8_t init_sve_sc6 = { sve_sc1 }; + svint8_t init_sve_sc7 = { sve_sh1 }; // { dg-error {cannot convert 'svint16_t' to 'svint8_t'} } + + // Constructor calls. + + (0, svint8_t ()); + + // Lvalue reference binding + + svint8_t &lvalue_ref_sve_sc1 = sve_sc1; + svint8_t &lvalue_ref_sve_sc2 = ext_produce_sve_sc (); // { dg-error {cannot bind non-const lvalue reference of type 'svint8_t&' to an rvalue of type 'svint8_t'} } + svint8_t &lvalue_ref_sve_sc3 = sve_sh1; // { dg-error {invalid initialization of reference of type 'svint8_t&' from expression of type 'svint16_t'} } + + const svint8_t &const_lvalue_ref_sve_sc1 = sve_sc1; + const svint8_t &const_lvalue_ref_sve_sc2 = ext_produce_sve_sc (); + const svint8_t &const_lvalue_ref_sve_sc3 = sve_sh1; // { dg-error {invalid initialization of reference of type 'const svint8_t&' from expression of type 'svint16_t'} } + + // Compound literals. + + (int) { sve_sc1 }; // { dg-error {cannot convert 'svint8_t' to 'int' in initialization} } + + // Arrays. + + svint8_t array[2]; // { dg-error {array elements cannot have SVE type 'svint8_t'} } + svint8_t zero_length_array[0]; // { dg-error {array elements cannot have SVE type 'svint8_t'} } + svint8_t empty_init_array[] = {}; // { dg-error {array elements cannot have SVE type 'svint8_t'} } + + // Assignment. + + n = sve_sc1; // { dg-error {cannot convert 'svint8_t' to 'int' in assignment} } + + sve_sc1 = 0; // { dg-error {cannot convert 'int' to 'svint8_t' in assignment} } + sve_sc1 = sve_sc1; + sve_sc1 = gnu_sc1; + gnu_sc1 = sve_sc1; + sve_sc1 = sve_sh1; // { dg-error {cannot convert 'svint16_t' to 'svint8_t'} } + + // Casting. + + (void) sve_sc1; + (void) volatile_sve_sc1; + (void) *&volatile_sve_sc1; + + // Addressing and dereferencing. + + svint8_t *sve_sc_ptr = &sve_sc1; + int8x32_t *gnu_sc_ptr = &gnu_sc1; + sve_sc_ptr = (svint16_t *) 0; // { dg-error {cannot convert 'svint16_t\*' to 'svint8_t\*' in assignment} } + + // Pointer assignment. + + gnu_sc_ptr = sve_sc_ptr; // { dg-error {invalid conversion from 'svint8_t\*' to 'int8x32_t\*'} } + sve_sc_ptr = gnu_sc_ptr; // { dg-error {invalid conversion from 'int8x32_t\*'[^\n]* to 'svint8_t\*'} } + + // Pointer arithmetic. + + ++sve_sc_ptr; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + --sve_sc_ptr; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr++; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr--; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr += 0; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr += 1; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr -= 0; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr -= 1; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc_ptr - sve_sc_ptr; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + gnu_sc_ptr - sve_sc_ptr; // { dg-error {invalid operands of types 'int8x32_t\*'[^\n]* and 'svint8_t\*' to binary 'operator-'} } + sve_sc_ptr - gnu_sc_ptr; // { dg-error {invalid operands of types 'svint8_t\*' and 'int8x32_t\*'[^\n]* to binary 'operator-'} } + sve_sc1 = sve_sc_ptr[0]; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + sve_sc1 = sve_sc_ptr[1]; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } + + // Pointer comparison. + + sve_sc_ptr == &sve_sc1; + sve_sc_ptr != &sve_sc1; + sve_sc_ptr < &sve_sc1; + sve_sc_ptr <= &sve_sc1; + sve_sc_ptr > &sve_sc1; + sve_sc_ptr >= &sve_sc1; + gnu_sc_ptr == sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + gnu_sc_ptr != sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + gnu_sc_ptr < sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + gnu_sc_ptr <= sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + gnu_sc_ptr > sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + gnu_sc_ptr >= sve_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr == gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr != gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr < gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr <= gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr > gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + sve_sc_ptr >= gnu_sc_ptr; // { dg-error {comparison between distinct pointer types [^\n]*lacks a cast} } + + // New and delete. + + new svint8_t; // { dg-error {cannot allocate objects with SVE type 'svint8_t'} } + new svint8_t (); // { dg-error {cannot allocate objects with SVE type 'svint8_t'} } + + new (global_sve_sc_ptr) svint8_t; // { dg-error {cannot allocate objects with SVE type 'svint8_t'} } + new (global_sve_sc_ptr) svint8_t (); // { dg-error {cannot allocate objects with SVE type 'svint8_t'} } + + sve_sc1.~svint8_t(); // { dg-error {expected class-name before '\(' token} } + delete sve_sc_ptr; // { dg-error {cannot delete objects with SVE type '(svint8_t|__SVInt8_t)'} } + delete[] sve_sc_ptr; // { dg-error {cannot delete objects with SVE type 'svint8_t'} } + + // Conditional expressions. + + 0 ? sve_sc1 : sve_sc1; + 0 ? sve_sc1 : sve_sh1; // { dg-error {different types 'svint8_t' and 'svint16_t'} } + 0 ? sve_sc1 : 0; // { dg-error {different types 'svint8_t' and 'int'} } + 0 ? 0 : sve_sc1; // { dg-error {different types 'int' and 'svint8_t'} } + 0 ? sve_sc1 : sve_sc1; + 0 ? sve_sc_ptr : sve_sc_ptr; + 0 ? sve_sc_ptr : gnu_sc_ptr; // { dg-error {conditional expression between distinct pointer types [^\n]*lacks a cast} } + 0 ? gnu_sc_ptr : sve_sc_ptr; // { dg-error {conditional expression between distinct pointer types [^\n]*lacks a cast} } + + // Function arguments. + + ext_consume_sve_sc (sve_sc1); + ext_consume_sve_sc (sve_sh1); // { dg-error {cannot convert 'svint16_t' to 'svint8_t'} } + ext_consume_const_int_ref (sve_sc1); // { dg-error {invalid initialization of reference of type 'const int&' from expression of type 'svint8_t'} } + ext_consume_varargs (sve_sc1); // { dg-error {cannot convert 'svint8_t' to 'int'} } + ext_consume_varargs (1, sve_sc1); + + // Function returns. + + ext_produce_sve_sc (); + sve_sc1 = ext_produce_sve_sc (); + sve_sh1 = ext_produce_sve_sc (); // { dg-error {cannot convert 'svint8_t' to 'svint16_t' in assignment} } + + // Auto + +#if __cplusplus >= 201103L + auto auto_sve_sc1 = sve_sc1; + auto auto_sve_sc1_return = ext_produce_sve_sc (); +#endif + + // Varargs processing. + + __builtin_va_list valist; + __builtin_va_arg (valist, svint8_t); + + // Other built-ins + + __builtin_launder (sve_sc1); // { dg-error {non-pointer argument to '__builtin_launder'} } + __builtin_memcpy (&sve_sc1, &sve_sc2, 2); + + // Lambdas + +#if __cplusplus >= 201103L + [sve_sc1] () {}; // { dg-error {capture by copy of SVE type 'svint8_t'} "" { target c++11 } } + [=] () { &sve_sc1; }; // { dg-error {capture by copy of SVE type 'svint8_t'} "" { target c++11 } } + [&sve_sc1] () { sve_sc1 = sve_sc2; }; // { dg-error {'sve_sc2' is not captured} "" { target c++11 } } + [&sve_sc1, &sve_sc2] () { sve_sc1 = sve_sc2; }; + [&] () { sve_sc1 = sve_sc2; }; + [] () { return ext_produce_sve_sc (); } (); +#endif + + // Exceptions + + throw svint8_t (); // { dg-error {cannot throw or catch SVE type 'svint8_t'} } + try {} catch (svint8_t x) {} // { dg-error {cannot throw or catch SVE type 'svint8_t'} } + try {} catch (svint8_t &x) {} // { dg-error {cannot throw or catch SVE type 'svint8_t'} } + try {} catch (svint8_t *x) {} +#if __cplusplus < 201103L + thrower2 (); +#endif + + // Use in traits. Doesn't use static_assert so that tests work with + // earlier -std=s. + + { typedef int f[__has_nothrow_assign (svint8_t) ? 1 : -1]; } + { typedef int f[__has_trivial_assign (svint8_t) ? 1 : -1]; } + { typedef int f[__has_nothrow_constructor (svint8_t) ? 1 : -1]; } + { typedef int f[__has_trivial_constructor (svint8_t) ? 1 : -1]; } + { typedef int f[__has_nothrow_copy (svint8_t) ? 1 : -1]; } + { typedef int f[__has_trivial_copy (svint8_t) ? 1 : -1]; } + { typedef int f[__has_trivial_destructor (svint8_t) ? 1 : -1]; } + { typedef int f[__has_unique_object_representations (svint8_t) ? 1 : -1]; } + { typedef int f[!__has_virtual_destructor (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_abstract (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_aggregate (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_base_of (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_base_of (svint8_t, svint16_t) ? 1 : -1]; } + { typedef int f[!__is_class (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_empty (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_enum (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_final (svint8_t) ? 1 : -1]; } + { typedef int f[__is_pod (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_polymorphic (svint8_t) ? 1 : -1]; } + { typedef int f[__is_same_as (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_same_as (svint8_t, int8x32_t) ? 1 : -1]; } + { typedef int f[!__is_same_as (int8x32_t, svint8_t) ? 1 : -1]; } + { typedef int f[__is_same_as (svint8_t *, svint8_t *) ? 1 : -1]; } + { typedef int f[!__is_same_as (svint8_t *, int8x32_t *) ? 1 : -1]; } + { typedef int f[!__is_same_as (int8x32_t *, svint8_t *) ? 1 : -1]; } + { typedef int f[!__is_same_as (svint8_t, int) ? 1 : -1]; } + { typedef int f[!__is_same_as (svint8_t, svint16_t) ? 1 : -1]; } + { typedef int f[__is_trivial (svint8_t) ? 1 : -1]; } + { typedef int f[!__is_union (svint8_t) ? 1 : -1]; } + { typedef int f[__is_trivially_copyable (svint8_t) ? 1 : -1]; } + /* The intention is that svint8_t should behave like int8x32_t here. If the behavior + for int8x32_t changes then the behavior for svint8_t should change in the same + way. */ + { typedef int f[!__is_trivially_assignable (int8x32_t, int8x32_t) ? 1 : -1]; } + { typedef int f[!__is_trivially_assignable (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_trivially_assignable (svint8_t, int8x32_t) ? 1 : -1]; } + { typedef int f[!__is_trivially_assignable (int8x32_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_trivially_assignable (svint8_t, int) ? 1 : -1]; } + { typedef int f[!__is_trivially_assignable (svint8_t, svint16_t) ? 1 : -1]; } + { typedef int f[!__is_assignable (int8x32_t, int8x32_t) ? 1 : -1]; } + { typedef int f[!__is_assignable (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_assignable (svint8_t, int8x32_t) ? 1 : -1]; } + { typedef int f[!__is_assignable (int8x32_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_assignable (svint8_t, int) ? 1 : -1]; } + { typedef int f[!__is_assignable (svint8_t, svint16_t) ? 1 : -1]; } + { typedef int f[__is_trivially_constructible (svint8_t) ? 1 : -1]; } + { typedef int f[__is_trivially_constructible (int8x32_t, int8x32_t) ? 1 : -1]; } + { typedef int f[__is_trivially_constructible (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[__is_trivially_constructible (svint8_t, int8x32_t) ? 1 : -1]; } + { typedef int f[__is_trivially_constructible (int8x32_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_trivially_constructible (svint8_t, int) ? 1 : -1]; } + { typedef int f[!__is_trivially_constructible (svint8_t, svint16_t) ? 1 : -1]; } + { typedef int f[__is_constructible (svint8_t) ? 1 : -1]; } + { typedef int f[__is_constructible (int8x32_t, int8x32_t) ? 1 : -1]; } + { typedef int f[__is_constructible (svint8_t, svint8_t) ? 1 : -1]; } + { typedef int f[__is_constructible (svint8_t, int8x32_t) ? 1 : -1]; } + { typedef int f[__is_constructible (int8x32_t, svint8_t) ? 1 : -1]; } + { typedef int f[!__is_constructible (svint8_t, int) ? 1 : -1]; } + { typedef int f[!__is_constructible (svint8_t, svint16_t) ? 1 : -1]; } +} + +// Function parameters in definitions. + +void +unnamed_st1 (svint8_t) +{ +} + +void +named_st1 (svint8_t param1) +{ + svint8_t sve_sc1 = param1; +} + +// Function return values in definitions. + +svint8_t +ret_st1 (svint8_t param) +{ + return param; +} + +svint8_t +bad_ret_st1 (svint16_t param) +{ + return param; // { dg-error {cannot convert 'svint16_t' to 'svint8_t' in return} } +} + +#if __cplusplus >= 201103L +template<typename T> +void +const_to_sve_sc (T i) +{ + constexpr svint8_t a = (svint8_t) i; +} +#endif + +template<typename T> +int +get_x (T *a) +{ + return a->a; // { dg-error {request for member 'a' in '\* a', which is of non-class type} } +} +template int get_x<svint8_t>(svint8_t *); + +#if __cplusplus < 201103L +void thrower3 () throw (svint8_t) {} // { dg-error {cannot throw or catch SVE type 'svint8_t'} "" { target c++98_only } } +#endif + +// Using "auto" as a return type. + +#if __cplusplus >= 201402L +auto auto_ret_sve_sc (svint8_t *ptr) { return *ptr; } +const auto &auto_ret_const_sve_sc_ref (svint8_t *ptr) { return *ptr; } +auto &auto_ret_sve_sc_ref (svint8_t *ptr) { return *ptr; } +auto &&auto_ret_sve_sc_rvalue_ref (svint8_t *ptr) { return *ptr; } +#endif