1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2
3 typedef enum { XX } EnumType;
4 struct S { int x; };
5
6 // Check enumerations. Vector modes on enum types must cause an error.
7 template <class T>
CheckEnumerations()8 void 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.
25 template <class T>
CheckPrimitiveTypes()26 void 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 modes
33 // are NOT diagnosed twice during instantiation.
34 template <class T>
CheckMachineMode()35 void 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.
47 template <class T1, class T2>
CheckParameters(T1 paramSI,T1 paramV4DI,T2 paramSF,T2 paramV4DF)48 void CheckParameters(T1 __attribute__((mode(SI))) paramSI, // expected-note2{{ignored: substitution failure}}
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.
56 template <class T>
57 struct 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.
f1TemplatedStruct69 void f1(T __attribute__((mode(QI))) x) {}
f2TemplatedStruct70 void f2(T __attribute__((mode(SF))) x) {} // expected-error2{{type of machine mode does not match type of base type}}
f3TemplatedStruct71 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.
g1TemplatedStruct75 __attribute__((mode(QI))) T g1() { return 0; } // expected-error{{'mode' attribute only applies to variables, enums, fields and typedefs}}
76 };
77
78
79
main()80 int 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