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