58 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3void f();4 5// Test typeof(expr) canonicalization6template<typename T>7void f0(T x, __typeof__(f(x)) y) { } // expected-note{{previous}}8 9template<typename T>10void f0(T x, __typeof__((f)(x)) y) { }11 12template<typename U>13void f0(U u, __typeof__(f(u))) { } // expected-error{{redefinition}}14 15// Test insane typeof(expr) overload set canonicalization16void f(int);17void f(double);18 19template<typename T, T N>20void f0a(T x, __typeof__(f(N)) y) { } // expected-note{{previous}}21 22void f(int);23 24template<typename T, T N>25void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}}26 27void f(float);28 29// Test dependently-sized array canonicalization30template<typename T, int N, int M>31void f1(T (&array)[N + M]) { } // expected-note{{previous}}32 33template<typename T, int N, int M>34void f1(T (&array)[M + N]) { }35 36template<typename T, int M, int N>37void f1(T (&array)[M + N]) { } // expected-error{{redefinition}}38 39// Test dependently-sized extended vector type canonicalization40template<typename T, int N, int M>41struct X2 {42 typedef T __attribute__((ext_vector_type(N))) type1;43 typedef T __attribute__((ext_vector_type(M))) type2;44 typedef T __attribute__((ext_vector_type(N))) type3;45 46 void f0(type1); // expected-note{{previous}}47 void f0(type2);48 void f0(type3); // expected-error{{redeclared}}49};50 51// Test canonicalization doesn't conflate different literal suffixes.52template<typename T> void literal_suffix(int (&)[sizeof(T() + 0)]) {}53template<typename T> void literal_suffix(int (&)[sizeof(T() + 0L)]) {}54template<typename T> void literal_suffix(int (&)[sizeof(T() + 0LL)]) {}55template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.f)]) {}56template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.)]) {}57template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.l)]) {}58