blob: b53bcd2b45800f2b9a856a29bf6c3c79557edb3a [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregorbbe27432008-11-21 16:29:06 +00002typedef int INT;
Chris Lattner5f4a6822008-11-23 23:12:31 +00003typedef INT REALLY_INT; // expected-note {{previous definition is here}}
Douglas Gregorbbe27432008-11-21 16:29:06 +00004typedef REALLY_INT REALLY_REALLY_INT;
5typedef REALLY_INT BOB;
Chris Lattnerd0344a42009-02-19 23:45:49 +00006typedef float REALLY_INT; // expected-error{{typedef redefinition with different types ('float' vs 'INT' (aka 'int'))}}
Douglas Gregorbbe27432008-11-21 16:29:06 +00007
Douglas Gregor66973122009-01-28 17:15:10 +00008struct X {
Chris Lattner5f4a6822008-11-23 23:12:31 +00009 typedef int result_type; // expected-note {{previous definition is here}}
10 typedef INT result_type; // expected-error {{redefinition of 'result_type'}}
Douglas Gregorbbe27432008-11-21 16:29:06 +000011};
Douglas Gregor66973122009-01-28 17:15:10 +000012
13struct Y; // expected-note{{previous definition is here}}
John McCall7c2342d2010-03-10 11:27:22 +000014typedef int Y; // expected-error{{typedef redefinition with different types ('int' vs 'Y')}}
Douglas Gregor66973122009-01-28 17:15:10 +000015
John McCall0d6b1642010-04-23 18:46:30 +000016typedef int Y2; // expected-note{{declared here}}
John McCall7c2342d2010-03-10 11:27:22 +000017struct Y2; // expected-error{{definition of type 'Y2' conflicts with typedef of the same name}}
Douglas Gregor66973122009-01-28 17:15:10 +000018
19void f(); // expected-note{{previous definition is here}}
20typedef int f; // expected-error{{redefinition of 'f' as different kind of symbol}}
21
22typedef int f2; // expected-note{{previous definition is here}}
23void f2(); // expected-error{{redefinition of 'f2' as different kind of symbol}}
24
25typedef struct s s;
26typedef int I;
27typedef int I;
28typedef I I;
29
30struct s { };
31
John McCall5126fd02009-12-30 00:31:22 +000032// PR5874
33namespace test1 {
34 typedef int foo;
35 namespace a { using test1::foo; };
36 typedef int foo;
37 using namespace a;
38 foo x;
39}
Douglas Gregorc8fd2da2010-04-27 16:26:47 +000040
41namespace PR6923 {
42 struct A;
43
44 extern "C" {
45 struct A;
46 typedef struct A A;
47 }
48
49 struct A;
50}
Douglas Gregoraef01992010-07-13 06:37:01 +000051
52namespace PR7462 {
53 struct A {};
54 typedef int operator! (A); // expected-error{{typedef name must be an identifier}}
55 int i = !A(); // expected-error{{invalid argument type}}
56}
Richard Smith874d2532011-11-29 05:27:40 +000057
58template<typename T>
59typedef T f(T t) { return t; } // expected-error {{function definition declared 'typedef'}}
60int k = f(0);
61int k2 = k;
Rafael Espindola5df37bd2011-12-26 22:42:47 +000062
63namespace PR11630 {
64 template <class T>
65 struct S
66 {
67 static const unsigned C = 1;
68 static void f()
69 {
70 typedef int q[C == 1 ? 1 : -1]; // expected-note{{previous definition is here}}
71 typedef int q[C >= 1 ? 2 : -2]; // expected-error{{typedef redefinition with different types ('int [2]' vs 'int [1]')}}
72 typedef int n[C == 1 ? 1 : -1];
73 typedef int n[C >= 1 ? 1 : -1];
74 }
75 };
76
77 template <int T>
78 struct S2
79 {
80 static void f()
81 {
82 typedef int q[1]; // expected-note{{previous definition is here}}
83 typedef int q[T]; // expected-error{{typedef redefinition with different types ('int [2]' vs 'int [1]')}}
84 }
85 };
86
87 void f() {
88 S<int> a;
89 a.f(); // expected-note{{in instantiation of member function 'PR11630::S<int>::f' requested here}}
90 S2<1> b;
91 b.f();
92 S2<2> b2;
93 b2.f(); // expected-note{{in instantiation of member function 'PR11630::S2<2>::f' requested here}}
94 }
95}