Home | History | Annotate | Download | only in expr.sizeof
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 struct A {
      4   unsigned bitX : 4;
      5   unsigned bitY : 4;
      6   unsigned var;
      7 
      8   void foo();
      9 };
     10 
     11 void test(A *a) {
     12   int x;
     13   x = sizeof(a->bitX); // expected-error {{invalid application of 'sizeof' to bit-field}}
     14   x = sizeof((unsigned) a->bitX);
     15   x = sizeof(a->foo(), a->bitX); // expected-error {{invalid application of 'sizeof' to bit-field}}
     16   x = sizeof(a->var ? a->bitX : a->bitY); // expected-error {{invalid application of 'sizeof' to bit-field}}
     17   x = sizeof(a->var ? a->bitX : a->bitX); // expected-error {{invalid application of 'sizeof' to bit-field}}
     18   x = sizeof(a->bitX = 3); // expected-error {{invalid application of 'sizeof' to bit-field}}
     19   x = sizeof(a->bitY += 3); // expected-error {{invalid application of 'sizeof' to bit-field}}
     20 }
     21 
     22 void test2() {
     23   int x;
     24   x = sizeof(void); // expected-error {{invalid application of 'sizeof' to an incomplete type 'void'}}
     25   x = sizeof(int()); // expected-error {{invalid application of 'sizeof' to a function type}}
     26   x = sizeof(test2()); // expected-error {{invalid application of 'sizeof' to an incomplete type 'void'}}
     27   x = sizeof(test2); // expected-error {{invalid application of 'sizeof' to a function type}}
     28 }
     29 
     30 namespace pr16992 {
     31 
     32 template<typename T> struct ABC {
     33   int func () {
     34     return sizeof T;  // expected-error {{expected parentheses around type name in sizeof expression}}
     35   }
     36 };
     37 
     38 ABC<int> qq;
     39 
     40 template<typename T> struct ABC2 {
     41   int func () {
     42     return sizeof T::A;
     43   }
     44 };
     45 
     46 struct QQ { int A; };
     47 ABC2<QQ> qq2;
     48 }
     49