mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:37:06 +00:00

This also clarifies some terminology used by the diagnostic (methods -> Objective-C methods, fields -> non-static data members, etc). Many of the tests needed to be updated in multiple places for the diagnostic wording tweaks. The first instance of the diagnostic for that attribute is fully specified and subsequent instances cut off the complete list (to make it easier if additional subjects are added in the future for the attribute). llvm-svn: 319002
105 lines
5.6 KiB
C++
105 lines
5.6 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
typedef enum { XX } EnumType;
|
|
struct S { int x; };
|
|
|
|
// Check enumerations. Vector modes on enum types must cause an error.
|
|
template <class T>
|
|
void CheckEnumerations() {
|
|
// Check that non-vector 'mode' attribute is OK with enumeration types.
|
|
typedef T __attribute__((mode(QI))) T1;
|
|
typedef T T2 __attribute__((mode(HI)));
|
|
typedef T __attribute__((mode(V8SI))) T3; // expected-error{{mode 'V8SI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}
|
|
|
|
typedef enum __attribute__((mode(HI))) { A4, B4 } T4;
|
|
typedef enum { A5, B5 } __attribute__((mode(SI))) T5;
|
|
typedef enum __attribute__((mode(V2SI))) { A6, B6 } T6; // expected-error{{mode 'V2SI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{deprecated}}
|
|
typedef enum { A7, B7 } __attribute__((mode(V2QI))) T7; // expected-error{{mode 'V2QI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{deprecated}}
|
|
}
|
|
|
|
// Check that attribute applies only for integer and floating-point types.
|
|
// OK when instantiated with 'int', error with structure types, for example.
|
|
template <class T>
|
|
void CheckPrimitiveTypes() {
|
|
typedef T __attribute__((mode(QI))) T1; // expected-error{{mode attribute only supported for integer and floating-point types}}
|
|
typedef T __attribute__((mode(V2SI))) VT1; // expected-error{{mode attribute only supported for integer and floating-point types}}
|
|
// expected-warning@-1{{specifying vector types with the 'mode' attribute is deprecated}}
|
|
}
|
|
|
|
// Check that attribute supports certain modes. Check that wrong machine modes
|
|
// are NOT diagnosed twice during instantiation.
|
|
template <class T>
|
|
void CheckMachineMode() {
|
|
typedef T __attribute__((mode(QI))) T1; // expected-error{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(HI))) T2; // expected-error{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(SI))) T3; // expected-error{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(DI))) T4; // expected-error{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(SF))) T5; // expected-error2{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(DF))) T6; // expected-error2{{type of machine mode does not match type of base type}}
|
|
typedef T __attribute__((mode(II))) T7; // expected-error{{unknown machine mode}}
|
|
typedef T __attribute__((mode(12))) T8; // expected-error{{'mode' attribute requires an identifier}}
|
|
}
|
|
|
|
// Check attributes on function parameters.
|
|
template <class T1, class T2>
|
|
void CheckParameters(T1 __attribute__((mode(SI))) paramSI, // expected-note{{ignored: substitution failure}} expected-note-re{{not viable: no known conversion from '{{.*}}' (vector of 4 '{{.*}}' values) to 'EnumType' for 2nd argument}}
|
|
T1 __attribute__((mode(V4DI))) paramV4DI, // expected-warning{{deprecated}}
|
|
T2 __attribute__((mode(SF))) paramSF,
|
|
T2 __attribute__((mode(V4DF))) paramV4DF) { // expected-warning{{deprecated}}
|
|
}
|
|
|
|
|
|
// Check dependent structure.
|
|
template <class T>
|
|
struct TemplatedStruct {
|
|
// Check fields.
|
|
T __attribute__((mode(HI))) x1;
|
|
T __attribute__((mode(V4HI))) x2; // expected-error{{mode 'V4HI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{deprecated}}
|
|
|
|
// Check typedefs.
|
|
typedef T __attribute__((mode(DI))) T1;
|
|
typedef T __attribute__((mode(V8DI))) T2; // expected-error{{mode 'V8DI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{deprecated}}
|
|
|
|
// Check parameters.
|
|
void f1(T __attribute__((mode(QI))) x) {}
|
|
void f2(T __attribute__((mode(SF))) x) {} // expected-error2{{type of machine mode does not match type of base type}}
|
|
void f3(T __attribute__((mode(V4QI))) x) {} // expected-error{{mode 'V4QI' is not supported for enumeration types}}
|
|
// expected-warning@-1{{deprecated}}
|
|
|
|
// Check attribute on methods - it is invalid.
|
|
__attribute__((mode(QI))) T g1() { return 0; } // expected-error{{'mode' attribute only applies to variables, enums, typedefs, and non-static data members}}
|
|
};
|
|
|
|
|
|
|
|
int main() {
|
|
CheckEnumerations<int>();
|
|
CheckEnumerations<EnumType>(); // expected-note{{in instantiation of}}
|
|
|
|
CheckPrimitiveTypes<int>();
|
|
CheckPrimitiveTypes<S>(); // expected-note{{in instantiation of}}
|
|
|
|
// 'II' mode is unknown, no matter what we instantiate with.
|
|
CheckMachineMode<int>(); // expected-note{{in instantiation of}}
|
|
CheckMachineMode<EnumType>(); // expected-note{{in instantiation of}}
|
|
CheckMachineMode<float>(); // expected-note{{in instantiation of}}
|
|
|
|
int __attribute__((mode(V4DI))) valV4DI; // expected-warning{{deprecated}}
|
|
float __attribute__((mode(V4DF))) valV4DF; // expected-warning{{deprecated}}
|
|
// OK.
|
|
CheckParameters<int, float>(0, valV4DI, 1.0, valV4DF);
|
|
// Enumeral type with vector mode is invalid.
|
|
CheckParameters<EnumType, float>(0, valV4DI, 1.0, valV4DF); // expected-error{{no matching function for call}}
|
|
// 'V4DF' mode with 'int' type is invalid.
|
|
CheckParameters<int, int>(0, valV4DI, 1, valV4DF); // expected-error{{no matching function for call}}
|
|
|
|
TemplatedStruct<int> s1; // expected-note{{in instantiation of}}
|
|
TemplatedStruct<EnumType> s2; // expected-note{{in instantiation of}}
|
|
return 0;
|
|
}
|