Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -pedantic -std=c++98 -verify -triple x86_64-apple-darwin %s
      2 // RUN: %clang_cc1 -fsyntax-only -pedantic -std=c++11 -verify -triple x86_64-apple-darwin %s
      3 enum E { // expected-note{{previous definition is here}}
      4   Val1,
      5   Val2
      6 };
      7 
      8 enum E; // expected-warning{{redeclaration of already-defined enum 'E' is a GNU extension}}
      9 
     10 int& enumerator_type(int);
     11 float& enumerator_type(E);
     12 
     13 void f() {
     14   E e = Val1;
     15   float& fr = enumerator_type(Val2);
     16 }
     17 
     18 // <rdar://problem/6502934>
     19 typedef enum Foo {
     20   A = 0,
     21   B = 1
     22 } Foo;
     23 
     24 void bar() {
     25   Foo myvar = A;
     26   myvar = B;
     27 }
     28 
     29 /// PR3688
     30 struct s1 {
     31   enum e1 (*bar)(void); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
     32 };
     33 
     34 enum e1 { YES, NO };
     35 
     36 static enum e1 badfunc(struct s1 *q) {
     37   return q->bar();
     38 }
     39 
     40 enum e2; // expected-error{{ISO C++ forbids forward references to 'enum' types}}
     41 
     42 namespace test1 {
     43   template <class A, class B> struct is_same { static const int value = -1; };
     44   template <class A> struct is_same<A,A> { static const int value = 1; };
     45 
     46   enum enum0 { v0 };
     47   int test0[is_same<__typeof(+v0), int>::value];
     48 
     49   enum enum1 { v1 = __INT_MAX__ };
     50   int test1[is_same<__typeof(+v1), int>::value];
     51 
     52   enum enum2 { v2 = __INT_MAX__ * 2U };
     53   int test2[is_same<__typeof(+v2), unsigned int>::value];
     54 
     55   enum enum3 { v3 = __LONG_MAX__ };
     56   int test3[is_same<__typeof(+v3), long>::value];
     57 
     58   enum enum4 { v4 = __LONG_MAX__ * 2UL };
     59   int test4[is_same<__typeof(+v4), unsigned long>::value];
     60 }
     61 
     62 // PR6061
     63 namespace PR6061 {
     64   struct A { enum { id }; };
     65   struct B { enum { id }; };
     66 
     67   struct C : public A, public B
     68   {
     69     enum { id };
     70   };
     71 }
     72 
     73 namespace Conditional {
     74   enum a { A }; a x(const enum a x) { return 1?x:A; }
     75 }
     76 
     77 namespace PR7051 {
     78   enum E { e0 };
     79   void f() {
     80     E e;
     81     e = 1; // expected-error{{assigning to 'PR7051::E' from incompatible type 'int'}}
     82     e |= 1; // expected-error{{assigning to 'PR7051::E' from incompatible type 'int'}}
     83   }
     84 }
     85 
     86 // PR7466
     87 enum { }; // expected-warning{{declaration does not declare anything}}
     88 typedef enum { }; // expected-warning{{typedef requires a name}}
     89 
     90 // PR7921
     91 enum PR7921E {
     92     PR7921V = (PR7921E)(123)
     93 #if __cplusplus < 201103L
     94 // expected-error@-2 {{expression is not an integral constant expression}}
     95 #else
     96 // expected-error@-4 {{must have integral or unscoped enumeration type}}
     97 // FIXME: The above diagnostic isn't very good; we should instead complain about the type being incomplete.
     98 #endif
     99 };
    100 
    101 void PR8089() {
    102   enum E; // expected-error{{ISO C++ forbids forward references to 'enum' types}}
    103   int a = (E)3; // expected-error{{cannot initialize a variable of type 'int' with an rvalue of type 'E'}}
    104 }
    105 
    106 // This is accepted as a GNU extension. In C++98, there was no provision for
    107 // expressions with UB to be non-constant.
    108 enum { overflow = 123456 * 234567 };
    109 #if __cplusplus >= 201103L
    110 // expected-warning@-2 {{not an integral constant expression}}
    111 // expected-note@-3 {{value 28958703552 is outside the range of representable values}}
    112 #endif
    113