summaryrefslogtreecommitdiff
path: root/test/Sema/enum-attr.c
blob: 933d8ccdcd89cab50e93a4d08623915e12651b67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// RUN: %clang_cc1 -fsyntax-only -verify -Wassign-enum -Wswitch-enum -Wcovered-switch-default %s

enum Enum {
  A0 = 1, A1 = 10
};

enum __attribute__((enum_extensibility(closed))) EnumClosed {
  B0 = 1, B1 = 10
};

enum __attribute__((enum_extensibility(open))) EnumOpen {
  C0 = 1, C1 = 10
};

enum __attribute__((flag_enum)) EnumFlag {
  D0 = 1, D1 = 8
};

enum __attribute__((flag_enum,enum_extensibility(closed))) EnumFlagClosed {
  E0 = 1, E1 = 8
};

enum __attribute__((flag_enum,enum_extensibility(open))) EnumFlagOpen {
  F0 = 1, F1 = 8
};

enum __attribute__((enum_extensibility(arg1))) EnumInvalidArg { // expected-warning{{'enum_extensibility' attribute argument not supported: 'arg1'}}
  X0
};

// FIXME: The warning should mention that enum_extensibility takes only one argument.
enum __attribute__((enum_extensibility(closed,open))) EnumTooManyArgs { // expected-error{{use of undeclared identifier 'open'}}
  X1
};

enum __attribute__((enum_extensibility())) EnumTooFewArgs { // expected-error{{'enum_extensibility' attribute takes one argument}}
  X2
};

struct __attribute__((enum_extensibility(open))) S { // expected-warning{{'enum_extensibility' attribute only applies to enums}}{
};

void test() {
  enum Enum t0 = 100; // expected-warning{{integer constant not in range of enumerated type}}
  t0 = 1;

  switch (t0) { // expected-warning{{enumeration value 'A1' not handled in switch}}
  case A0: break;
  case 16: break; // expected-warning{{case value not in enumerated type}}
  }

  switch (t0) {
  case A0: break;
  case A1: break;
  default: break; // expected-warning{{default label in switch which covers all enumeration}}
  }

  enum EnumClosed t1 = 100; // expected-warning{{integer constant not in range of enumerated type}}
  t1 = 1;

  switch (t1) { // expected-warning{{enumeration value 'B1' not handled in switch}}
  case B0: break;
  case 16: break; // expected-warning{{case value not in enumerated type}}
  }

  switch (t1) {
  case B0: break;
  case B1: break;
  default: break; // expected-warning{{default label in switch which covers all enumeration}}
  }

  enum EnumOpen t2 = 100;
  t2 = 1;

  switch (t2) { // expected-warning{{enumeration value 'C1' not handled in switch}}
  case C0: break;
  case 16: break;
  }

  switch (t2) {
  case C0: break;
  case C1: break;
  default: break;
  }

  enum EnumFlag t3 = 5; // expected-warning{{integer constant not in range of enumerated type}}
  t3 = 9;

  switch (t3) { // expected-warning{{enumeration value 'D1' not handled in switch}}
  case D0: break;
  case 9: break;
  case 16: break; // expected-warning{{case value not in enumerated type}}
  }

  switch (t3) {
  case D0: break;
  case D1: break;
  default: break;
  }

  enum EnumFlagClosed t4 = 5; // expected-warning{{integer constant not in range of enumerated type}}
  t4 = 9;

  switch (t4) { // expected-warning{{enumeration value 'E1' not handled in switch}}
  case E0: break;
  case 9: break;
  case 16: break; // expected-warning{{case value not in enumerated type}}
  }

  switch (t4) {
  case E0: break;
  case E1: break;
  default: break;
  }

  enum EnumFlagOpen t5 = 5;
  t5 = 9;

  switch (t5) { // expected-warning{{enumeration value 'F1' not handled in switch}}
  case F0: break;
  case 9: break;
  case 16: break;
  }

  switch (t5) {
  case F0: break;
  case F1: break;
  default: break;
  }
}