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