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