14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef enum { XX } EnumType;
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S { int x; };
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check enumerations. Vector modes on enum types must cause an error.
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T>
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid CheckEnumerations() {
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check that non-vector 'mode' attribute is OK with enumeration types.
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(QI))) T1;
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T T2 __attribute__((mode(HI)));
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(V8SI))) T3; // expected-error{{mode 'V8SI' is not supported for enumeration types}}
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef enum __attribute__((mode(HI))) { A4, B4 } T4;
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef enum { A5, B5 } __attribute__((mode(SI))) T5;
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef enum __attribute__((mode(V2SI))) { A6, B6 } T6; // expected-error{{mode 'V2SI' is not supported for enumeration types}}
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                          // expected-warning@-1{{deprecated}}
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef enum { A7, B7 } __attribute__((mode(V2QI))) T7; // expected-error{{mode 'V2QI' is not supported for enumeration types}}
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                          // expected-warning@-1{{deprecated}}
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check that attribute applies only for integer and floating-point types.
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// OK when instantiated with 'int', error with structure types, for example.
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T>
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid CheckPrimitiveTypes() {
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(QI))) T1;    // expected-error{{mode attribute only supported for integer and floating-point types}}
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(V2SI))) VT1; // expected-error{{mode attribute only supported for integer and floating-point types}}
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check that attribute supports certain modes. Check that wrong machine modes
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// are NOT diagnosed twice during instantiation.
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T>
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid CheckMachineMode() {
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(QI))) T1; // expected-error{{type of machine mode does not match type of base type}}
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(HI))) T2; // expected-error{{type of machine mode does not match type of base type}}
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(SI))) T3; // expected-error{{type of machine mode does not match type of base type}}
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(DI))) T4; // expected-error{{type of machine mode does not match type of base type}}
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(SF))) T5; // expected-error2{{type of machine mode does not match type of base type}}
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(DF))) T6; // expected-error2{{type of machine mode does not match type of base type}}
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(II))) T7; // expected-error{{unknown machine mode}}
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(12))) T8; // expected-error{{'mode' attribute requires an identifier}}
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check attributes on function parameters.
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T1, class T2>
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid CheckParameters(T1 __attribute__((mode(SI)))   paramSI,     // expected-note2{{ignored: substitution failure}}
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     T1 __attribute__((mode(V4DI))) paramV4DI,   // expected-warning{{deprecated}}
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     T2 __attribute__((mode(SF)))   paramSF,
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     T2 __attribute__((mode(V4DF))) paramV4DF) { // expected-warning{{deprecated}}
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Check dependent structure.
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T>
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct TemplatedStruct {
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check fields.
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T __attribute__((mode(HI)))     x1;
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T __attribute__((mode(V4HI)))   x2;         // expected-error{{mode 'V4HI' is not supported for enumeration types}}
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                              // expected-warning@-1{{deprecated}}
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check typedefs.
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(DI)))   T1;
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef T __attribute__((mode(V8DI))) T2;   // expected-error{{mode 'V8DI' is not supported for enumeration types}}
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                              // expected-warning@-1{{deprecated}}
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check parameters.
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void f1(T __attribute__((mode(QI))) x) {}
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void f2(T __attribute__((mode(SF))) x) {}   // expected-error2{{type of machine mode does not match type of base type}}
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void f3(T __attribute__((mode(V4QI))) x) {} // expected-error{{mode 'V4QI' is not supported for enumeration types}}
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                              // expected-warning@-1{{deprecated}}
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check attribute on methods - it is invalid.
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __attribute__((mode(QI))) T g1() { return 0; } // expected-error{{'mode' attribute only applies to variables, enums, fields and typedefs}}
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint main() {
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckEnumerations<int>();
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckEnumerations<EnumType>(); // expected-note{{in instantiation of}}
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckPrimitiveTypes<int>();
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckPrimitiveTypes<S>();      // expected-note{{in instantiation of}}
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // 'II' mode is unknown, no matter what we instantiate with.
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckMachineMode<int>();       // expected-note{{in instantiation of}}
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckMachineMode<EnumType>();  // expected-note{{in instantiation of}}
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckMachineMode<float>();     // expected-note{{in instantiation of}}
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int   __attribute__((mode(V4DI))) valV4DI; // expected-warning{{deprecated}}
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float __attribute__((mode(V4DF))) valV4DF; // expected-warning{{deprecated}}
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // OK.
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckParameters<int, float>(0, valV4DI, 1.0, valV4DF);
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Enumeral type with vector mode is invalid.
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckParameters<EnumType, float>(0, valV4DI, 1.0, valV4DF); // expected-error{{no matching function for call}}
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // 'V4DF' mode with 'int' type is invalid.
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CheckParameters<int, int>(0, valV4DI, 1, valV4DF); // expected-error{{no matching function for call}}
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TemplatedStruct<int>      s1; // expected-note{{in instantiation of}}
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TemplatedStruct<EnumType> s2; // expected-note{{in instantiation of}}
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return 0;
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
105