105 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3typedef enum { XX } EnumType;4struct S { int x; };5 6// Check enumerations. Vector modes on enum types must cause an error.7template <class T>8void CheckEnumerations() {9 // Check that non-vector 'mode' attribute is OK with enumeration types.10 typedef T __attribute__((mode(QI))) T1;11 typedef T T2 __attribute__((mode(HI)));12 typedef T __attribute__((mode(V8SI))) T3; // expected-error{{mode 'V8SI' is not supported for enumeration types}}13 // expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}14 15 typedef enum __attribute__((mode(HI))) { A4, B4 } T4;16 typedef enum { A5, B5 } __attribute__((mode(SI))) T5;17 typedef enum __attribute__((mode(V2SI))) { A6, B6 } T6; // expected-error{{mode 'V2SI' is not supported for enumeration types}}18 // expected-warning@-1{{deprecated}}19 typedef enum { A7, B7 } __attribute__((mode(V2QI))) T7; // expected-error{{mode 'V2QI' is not supported for enumeration types}}20 // expected-warning@-1{{deprecated}}21}22 23// Check that attribute applies only for integer and floating-point types.24// OK when instantiated with 'int', error with structure types, for example.25template <class T>26void CheckPrimitiveTypes() {27 typedef T __attribute__((mode(QI))) T1; // expected-error{{mode attribute only supported for integer and floating-point types}}28 typedef T __attribute__((mode(V2SI))) VT1; // expected-error{{mode attribute only supported for integer and floating-point types}}29 // expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}30}31 32// Check that attribute supports certain modes. Check that wrong machine modes33// are NOT diagnosed twice during instantiation.34template <class T>35void CheckMachineMode() {36 typedef T __attribute__((mode(QI))) T1; // expected-error{{type of machine mode does not match type of base type}}37 typedef T __attribute__((mode(HI))) T2; // expected-error{{type of machine mode does not match type of base type}}38 typedef T __attribute__((mode(SI))) T3; // expected-error{{type of machine mode does not match type of base type}}39 typedef T __attribute__((mode(DI))) T4; // expected-error{{type of machine mode does not match type of base type}}40 typedef T __attribute__((mode(SF))) T5; // expected-error2{{type of machine mode does not match type of base type}}41 typedef T __attribute__((mode(DF))) T6; // expected-error2{{type of machine mode does not match type of base type}}42 typedef T __attribute__((mode(II))) T7; // expected-error{{unknown machine mode}}43 typedef T __attribute__((mode(12))) T8; // expected-error{{'mode' attribute requires an identifier}}44}45 46// Check attributes on function parameters.47template <class T1, class T2>48void CheckParameters(T1 __attribute__((mode(SI))) paramSI, // expected-note{{ignored: substitution failure}} expected-note{{ignored: substitution failure [with T1 = int, T2 = int]: type of machine mode does not match type of base type}}49 T1 __attribute__((mode(V4DI))) paramV4DI, // expected-warning{{deprecated}}50 T2 __attribute__((mode(SF))) paramSF,51 T2 __attribute__((mode(V4DF))) paramV4DF) { // expected-warning{{deprecated}}52}53 54 55// Check dependent structure.56template <class T>57struct TemplatedStruct {58 // Check fields.59 T __attribute__((mode(HI))) x1;60 T __attribute__((mode(V4HI))) x2; // expected-error{{mode 'V4HI' is not supported for enumeration types}}61 // expected-warning@-1{{deprecated}}62 63 // Check typedefs.64 typedef T __attribute__((mode(DI))) T1;65 typedef T __attribute__((mode(V8DI))) T2; // expected-error{{mode 'V8DI' is not supported for enumeration types}}66 // expected-warning@-1{{deprecated}}67 68 // Check parameters.69 void f1(T __attribute__((mode(QI))) x) {}70 void f2(T __attribute__((mode(SF))) x) {} // expected-error2{{type of machine mode does not match type of base type}}71 void f3(T __attribute__((mode(V4QI))) x) {} // expected-error{{mode 'V4QI' is not supported for enumeration types}}72 // expected-warning@-1{{deprecated}}73 74 // Check attribute on methods - it is invalid.75 __attribute__((mode(QI))) T g1() { return 0; } // expected-error{{'mode' attribute only applies to variables, enums, typedefs, and non-static data members}}76};77 78 79 80int main() {81 CheckEnumerations<int>();82 CheckEnumerations<EnumType>(); // expected-note{{in instantiation of}}83 84 CheckPrimitiveTypes<int>();85 CheckPrimitiveTypes<S>(); // expected-note{{in instantiation of}}86 87 // 'II' mode is unknown, no matter what we instantiate with.88 CheckMachineMode<int>(); // expected-note{{in instantiation of}}89 CheckMachineMode<EnumType>(); // expected-note{{in instantiation of}}90 CheckMachineMode<float>(); // expected-note{{in instantiation of}}91 92 int __attribute__((mode(V4DI))) valV4DI; // expected-warning{{deprecated}}93 float __attribute__((mode(V4DF))) valV4DF; // expected-warning{{deprecated}}94 // OK.95 CheckParameters<int, float>(0, valV4DI, 1.0, valV4DF);96 // Enumeral type with vector mode is invalid.97 CheckParameters<EnumType, float>(0, valV4DI, 1.0, valV4DF); // expected-error{{no matching function for call}}98 // 'V4DF' mode with 'int' type is invalid.99 CheckParameters<int, int>(0, valV4DI, 1, valV4DF); // expected-error{{no matching function for call}}100 101 TemplatedStruct<int> s1; // expected-note{{in instantiation of}}102 TemplatedStruct<EnumType> s2; // expected-note{{in instantiation of}}103 return 0;104}105