15f7157ec28f367b97a9f4560fb0fa3d13a9adf87Eli Friedman// RUN: %clang_cc1 -fsyntax-only -pedantic -std=c++98 -verify -triple x86_64-apple-darwin %s
2f3a7b7cfacf802db5458874842b71a74845f0023Douglas Gregorenum E { // expected-note{{previous definition is here}}
393afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor  Val1,
493afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor  Val2
593afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor};
693afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor
7f3a7b7cfacf802db5458874842b71a74845f0023Douglas Gregorenum E; // expected-warning{{redeclaration of already-defined enum 'E' is a GNU extension}}
8f3a7b7cfacf802db5458874842b71a74845f0023Douglas Gregor
993afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregorint& enumerator_type(int);
1093afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregorfloat& enumerator_type(E);
1193afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor
1293afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregorvoid f() {
1393afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor  E e = Val1;
1493afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor  float& fr = enumerator_type(Val2);
1593afb0d4f9f2ec322438c3bb7e1114ea6f614510Douglas Gregor}
1666b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregor
1766b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregor// <rdar://problem/6502934>
1866b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregortypedef enum Foo {
191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  A = 0,
201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  B = 1
2166b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregor} Foo;
221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2366b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregorvoid bar() {
241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Foo myvar = A;
251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  myvar = B;
2666b947fdf9104b53d7e8caa8f71ee0c0e3fe1521Douglas Gregor}
2780711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor
2880711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor/// PR3688
2980711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregorstruct s1 {
305023437f5a897d513c08ddf64b74d688252a23e5John McCall  enum e1 (*bar)(void); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
3180711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor};
3280711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor
3380711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregorenum e1 { YES, NO };
3480711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor
3580711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregorstatic enum e1 badfunc(struct s1 *q) {
365023437f5a897d513c08ddf64b74d688252a23e5John McCall  return q->bar();
3780711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor}
3880711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregor
3980711a22fa06b734a68d719ac85d4e443a51cb09Douglas Gregorenum e2; // expected-error{{ISO C++ forbids forward references to 'enum' types}}
40842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
41842aef8d942a880eeb9535d40de31a86838264cbJohn McCallnamespace test1 {
42842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  template <class A, class B> struct is_same { static const int value = -1; };
43842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  template <class A> struct is_same<A,A> { static const int value = 1; };
44842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
45842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  enum enum0 { v0 };
462aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  int test0[is_same<__typeof(+v0), int>::value];
47842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
48842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  enum enum1 { v1 = __INT_MAX__ };
492aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  int test1[is_same<__typeof(+v1), int>::value];
50842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
51842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  enum enum2 { v2 = __INT_MAX__ * 2U };
522aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  int test2[is_same<__typeof(+v2), unsigned int>::value];
53842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
542aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  enum enum3 { v3 = __LONG_MAX__ };
552aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  int test3[is_same<__typeof(+v3), long>::value];
56842aef8d942a880eeb9535d40de31a86838264cbJohn McCall
572aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  enum enum4 { v4 = __LONG_MAX__ * 2UL };
582aaad63ec5d012e6de40f72e114c60df9c205a24Eli Friedman  int test4[is_same<__typeof(+v4), unsigned long>::value];
59842aef8d942a880eeb9535d40de31a86838264cbJohn McCall}
60e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor
61e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor// PR6061
62e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregornamespace PR6061 {
63e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor  struct A { enum { id }; };
64e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor  struct B { enum { id }; };
65e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor
66e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor  struct C : public A, public B
67e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor  {
68e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor    enum { id };
69e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor  };
70e39fe72df7da662c195ef4bcd542d58ec87d5422Douglas Gregor}
71a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor
72a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregornamespace Conditional {
73a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor  enum a { A }; a x(const enum a x) { return 1?x:A; }
74a873dfc9e7314681bb37efd9ab185045de121e43Douglas Gregor}
7588623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor
7688623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregornamespace PR7051 {
7788623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor  enum E { e0 };
7888623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor  void f() {
7988623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor    E e;
8088623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor    e = 1; // expected-error{{assigning to 'PR7051::E' from incompatible type 'int'}}
8188623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor    e |= 1; // expected-error{{assigning to 'PR7051::E' from incompatible type 'int'}}
8288623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor  }
8388623ade9599d2a2f4e21e80bce00fb4cb9e7d5fDouglas Gregor}
84a131d0fc0af9f79c90e7654231041b2495d355a9Douglas Gregor
85a131d0fc0af9f79c90e7654231041b2495d355a9Douglas Gregor// PR7466
86a131d0fc0af9f79c90e7654231041b2495d355a9Douglas Gregorenum { }; // expected-warning{{declaration does not declare anything}}
87a131d0fc0af9f79c90e7654231041b2495d355a9Douglas Gregortypedef enum { }; // expected-warning{{typedef requires a name}}
8834fd628d22f54baddf30cf80c401b2f862a31b23Eli Friedman
8934fd628d22f54baddf30cf80c401b2f862a31b23Eli Friedman// PR7921
9034fd628d22f54baddf30cf80c401b2f862a31b23Eli Friedmanenum PR7921E {
91244ee7b89a483fd3764637abdf95de2893b437d0Richard Smith    PR7921V = (PR7921E)(123) // expected-error {{expression is not an integral constant expression}}
9234fd628d22f54baddf30cf80c401b2f862a31b23Eli Friedman};
935dde1605da5e6db8a9214f4a5d094ae0bbc64a4eDouglas Gregor
945dde1605da5e6db8a9214f4a5d094ae0bbc64a4eDouglas Gregorvoid PR8089() {
955dde1605da5e6db8a9214f4a5d094ae0bbc64a4eDouglas Gregor  enum E; // expected-error{{ISO C++ forbids forward references to 'enum' types}}
965dde1605da5e6db8a9214f4a5d094ae0bbc64a4eDouglas Gregor  int a = (E)3; // expected-error{{cannot initialize a variable of type 'int' with an rvalue of type 'E'}}
975dde1605da5e6db8a9214f4a5d094ae0bbc64a4eDouglas Gregor}
98