// RUN: %clang_cc1 -fsyntax-only -verify %s void f(); // Test typeof(expr) canonicalization template void f0(T x, __typeof__(f(x)) y) { } // expected-note{{previous}} template void f0(T x, __typeof__((f)(x)) y) { } template void f0(U u, __typeof__(f(u))) { } // expected-error{{redefinition}} // Test insane typeof(expr) overload set canonicalization void f(int); void f(double); template void f0a(T x, __typeof__(f(N)) y) { } // expected-note{{previous}} void f(int); template void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}} \ // expected-note{{previous}} void f(float); template void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}} // Test dependently-sized array canonicalization template void f1(T (&array)[N + M]) { } // expected-note{{previous}} template void f1(T (&array)[M + N]) { } template void f1(T (&array)[M + N]) { } // expected-error{{redefinition}} // Test dependently-sized extended vector type canonicalization template struct X2 { typedef T __attribute__((ext_vector_type(N))) type1; typedef T __attribute__((ext_vector_type(M))) type2; typedef T __attribute__((ext_vector_type(N))) type3; void f0(type1); // expected-note{{previous}} void f0(type2); void f0(type3); // expected-error{{redeclared}} };