1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3void f(); 4 5// Test typeof(expr) canonicalization 6template<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 canonicalization 16void 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 // expected-note{{previous}} 27 28void f(float); 29 30template<typename T, T N> 31void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}} 32 33// Test dependently-sized array canonicalization 34template<typename T, int N, int M> 35void f1(T (&array)[N + M]) { } // expected-note{{previous}} 36 37template<typename T, int N, int M> 38void f1(T (&array)[M + N]) { } 39 40template<typename T, int M, int N> 41void f1(T (&array)[M + N]) { } // expected-error{{redefinition}} 42 43// Test dependently-sized extended vector type canonicalization 44template<typename T, int N, int M> 45struct X2 { 46 typedef T __attribute__((ext_vector_type(N))) type1; 47 typedef T __attribute__((ext_vector_type(M))) type2; 48 typedef T __attribute__((ext_vector_type(N))) type3; 49 50 void f0(type1); // expected-note{{previous}} 51 void f0(type2); 52 void f0(type3); // expected-error{{redeclared}} 53}; 54