18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
2a5dd9f85SDouglas Gregor
3a5dd9f85SDouglas Gregor void f();
4a5dd9f85SDouglas Gregor
5a5dd9f85SDouglas Gregor // Test typeof(expr) canonicalization
670317123SDouglas Gregor template<typename T>
f0(T x,__typeof__(f (x)) y)770317123SDouglas Gregor void f0(T x, __typeof__(f(x)) y) { } // expected-note{{previous}}
8a5dd9f85SDouglas Gregor
970317123SDouglas Gregor template<typename T>
f0(T x,__typeof__((f)(x)) y)1070317123SDouglas Gregor void f0(T x, __typeof__((f)(x)) y) { }
11a5dd9f85SDouglas Gregor
1270317123SDouglas Gregor template<typename U>
f0(U u,__typeof__(f (u)) )1370317123SDouglas Gregor void f0(U u, __typeof__(f(u))) { } // expected-error{{redefinition}}
14f3f95527SDouglas Gregor
15802a030dSDouglas Gregor // Test insane typeof(expr) overload set canonicalization
16802a030dSDouglas Gregor void f(int);
17802a030dSDouglas Gregor void f(double);
18802a030dSDouglas Gregor
19802a030dSDouglas Gregor template<typename T, T N>
f0a(T x,__typeof__(f (N)) y)20802a030dSDouglas Gregor void f0a(T x, __typeof__(f(N)) y) { } // expected-note{{previous}}
21802a030dSDouglas Gregor
22802a030dSDouglas Gregor void f(int);
23802a030dSDouglas Gregor
24802a030dSDouglas Gregor template<typename T, T N>
f0a(T x,__typeof__(f (N)) y)25ea5092a3SDavid Majnemer void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}}
26802a030dSDouglas Gregor
27802a030dSDouglas Gregor void f(float);
28802a030dSDouglas Gregor
29f3f95527SDouglas Gregor // Test dependently-sized array canonicalization
30f3f95527SDouglas Gregor template<typename T, int N, int M>
f1(T (& array)[N+M])31f3f95527SDouglas Gregor void f1(T (&array)[N + M]) { } // expected-note{{previous}}
32f3f95527SDouglas Gregor
33f3f95527SDouglas Gregor template<typename T, int N, int M>
f1(T (& array)[M+N])34f3f95527SDouglas Gregor void f1(T (&array)[M + N]) { }
35f3f95527SDouglas Gregor
36f3f95527SDouglas Gregor template<typename T, int M, int N>
f1(T (& array)[M+N])37f3f95527SDouglas Gregor void f1(T (&array)[M + N]) { } // expected-error{{redefinition}}
38352169aeSDouglas Gregor
39352169aeSDouglas Gregor // Test dependently-sized extended vector type canonicalization
40352169aeSDouglas Gregor template<typename T, int N, int M>
41352169aeSDouglas Gregor struct X2 {
42352169aeSDouglas Gregor typedef T __attribute__((ext_vector_type(N))) type1;
43352169aeSDouglas Gregor typedef T __attribute__((ext_vector_type(M))) type2;
44352169aeSDouglas Gregor typedef T __attribute__((ext_vector_type(N))) type3;
45352169aeSDouglas Gregor
46352169aeSDouglas Gregor void f0(type1); // expected-note{{previous}}
47352169aeSDouglas Gregor void f0(type2);
48352169aeSDouglas Gregor void f0(type3); // expected-error{{redeclared}}
49352169aeSDouglas Gregor };
50*e9f130cfSRichard Smith
51*e9f130cfSRichard Smith // Test canonicalization doesn't conflate different literal suffixes.
literal_suffix(int (&)[sizeof (T ()+0)])52*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0)]) {}
literal_suffix(int (&)[sizeof (T ()+0L)])53*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0L)]) {}
literal_suffix(int (&)[sizeof (T ()+0LL)])54*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0LL)]) {}
literal_suffix(int (&)[sizeof (T ()+0.f)])55*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.f)]) {}
literal_suffix(int (&)[sizeof (T ()+0.)])56*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.)]) {}
literal_suffix(int (&)[sizeof (T ()+0.l)])57*e9f130cfSRichard Smith template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.l)]) {}
58