xref: /llvm-project/clang/test/C/drs/dr0xx.c (revision e4163c0927772f2ec73cf16d53e000614c419c45)
1 /* RUN: %clang_cc1 -std=c89 -fsyntax-only -verify=expected,c89only -pedantic -Wno-declaration-after-statement -Wno-c11-extensions %s
2    RUN: %clang_cc1 -std=c89 -fsyntax-only -verify=expected,c89only -pedantic -Wno-declaration-after-statement -Wno-c11-extensions -fno-signed-char %s
3    RUN: %clang_cc1 -std=c99 -fsyntax-only -verify=expected,c99untilc2x -pedantic -Wno-c11-extensions %s
4    RUN: %clang_cc1 -std=c11 -fsyntax-only -verify=expected,c99untilc2x -pedantic %s
5    RUN: %clang_cc1 -std=c17 -fsyntax-only -verify=expected,c99untilc2x -pedantic %s
6    RUN: %clang_cc1 -std=c2x -fsyntax-only -verify=expected,c2xandup -pedantic %s
7  */
8 
9 /* The following are DRs which do not require tests to demonstrate
10  * conformance or nonconformance.
11  *
12  * WG14 DR001: yes
13  * Do functions return values by copying?
14  *
15  * WG14 DR005: yes
16  * May a conforming implementation define and recognize a pragma which would
17  * change the semantics of the language?
18  *
19  * WG14 DR008: yes
20  * Can a conforming C compiler to perform dead-store elimination?
21  *
22  * WG14 DR020: yes
23  * Is a compiler which allows the Relaxed Ref/Def linkage model to be
24  * considered a conforming compiler?
25  *
26  * WG14 DR025: yes
27  * What is meant by 'representable floating-point value?'
28  *
29  * WG14 DR026: yes
30  * Can a strictly conforming program contain a string literal with '$' or '@'?
31  *
32  * WG14 DR033: yes
33  * Conformance questions around 'shall' violations outside of constraints
34  * sections
35  *
36  * WG14 DR036: yes
37  * May floating-point constants be represented with more precision than implied
38  * by its type?
39  *
40  * WG14 DR037: yes
41  * Questions about multibyte characters and Unicode
42  *
43  * WG14 DR051: yes
44  * Question on pointer arithmetic
45  *
46  * WG14 DR052: yes
47  * Editorial corrections
48  *
49  * WG14 DR056: yes
50  * Floating-point representation precision requirements
51  *
52  * WG14 DR057: yes
53  * Is there an integral type for every pointer?
54  *
55  * WG14 DR059: yes
56  * Do types have to be completed?
57  *
58  * WG14 DR063: dup 056
59  * Floating-point representation precision requirements
60  *
61  * WG14 DR067: yes
62  * Integer and integral type confusion
63  *
64  * WG14 DR069: yes
65  * Questions about the representation of integer types
66  *
67  * WG14 DR077: yes
68  * Stability of addresses
69  *
70  * WG14 DR080: yes
71  * Merging of string constants
72  *
73  * WG14 DR085: yes
74  * Returning from main
75  *
76  * WG14 DR087: yes
77  * Order of evaluation
78  * Note: this DR is covered by C/C11/n1282.c
79  *
80  * WG14 DR086: yes
81  * Object-like macros in system headers
82  *
83  * WG14 DR091: yes
84  * Multibyte encodings
85  *
86  * WG14 DR092: dup 060
87  * Partial initialization of strings
88  *
89  * WG14 DR093: yes
90  * Reservation of identifiers
91  */
92 
93 
94 /* WG14 DR004: yes
95  * Are multiple definitions of unused identifiers with external linkage
96  * permitted?
97  */
98 int dr004(void) {return 0;} /* expected-note {{previous definition is here}} */
99 int dr004(void) {return 1;} /* expected-error {{redefinition of 'dr004'}} */
100 
101 /* WG14 DR007: yes
102  * Are declarations of the form struct-or-union identifier ; permitted after
103  * the identifier tag has already been declared?
104  */
105 struct dr007_a;
106 struct dr007_a;
107 struct dr007_a {int a;};
108 struct dr007_a;
109 struct dr007_b {int a;};
110 struct dr007_b;
111 
112 
113 /* WG14 DR009: no
114  * Use of typedef names in parameter declarations
115  *
116  * FIXME: This should be diagnosed as expecting a declaration specifier instead
117  * of treated as declaring a parameter of type 'int (*)(dr009_t);'
118  */
119 typedef int dr009_t;
120 void dr009_f((dr009_t)); /* c99untilc2x-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
121                             c2xandup-error {{a type specifier is required for all declarations}} */
122 
123 /* WG14 DR010:
124  * Is a typedef to an incomplete type legal?
125  */
126 typedef int dr010_t[];
127 dr010_t dr010_a = {1};
128 dr010_t dr010_b = {1, 2};
129 int dr010_c = sizeof(dr010_t); /* expected-error {{invalid application of 'sizeof' to an incomplete type 'dr010_t' (aka 'int[]')}} */
130 
131 /* WG14 DR011: yes
132  * Merging of declarations for linked identifier
133  *
134  * Note: more of this DR is tested in dr011.c
135  *
136  * WG14 DR034: yes
137  * External declarations in different scopes
138  *
139  * Note: DR034 has a question resolved by DR011 and another question where the
140  * result is UB.
141  */
142 static int dr011_a[]; /* expected-warning {{tentative array definition assumed to have one element}} */
143 void dr011(void) {
144   extern int i[];
145   {
146     /* a different declaration of the same object */
147     extern int i[10];
148     (void)sizeof(i);
149     _Static_assert(sizeof(i) == 10 * sizeof(int), "fail");
150   }
151   (void)sizeof(i); /* expected-error {{invalid application of 'sizeof' to an incomplete type 'int[]'}} */
152 
153   extern int dr011_a[10];
154   (void)sizeof(dr011_a);
155   _Static_assert(sizeof(dr011_a) == 10 * sizeof(int), "fail");
156 
157   extern int j[10];
158   {
159     extern int j[];
160     (void)sizeof(j);
161     _Static_assert(sizeof(j) == 10 * sizeof(int), "fail");
162   }
163 }
164 
165 /* WG14 DR012: yes
166  * Is it valid to take the address of a dereferenced void pointer?
167  */
168 void dr012(void *p) {
169   /* The behavior changed between C89 and C99. */
170   (void)&*p; /* c89only-warning {{ISO C forbids taking the address of an expression of type 'void'}}
171                 c89only-warning {{ISO C does not allow indirection on operand of type 'void *'}} */
172 }
173 
174 /* WG14 DR013: yes
175  * Compatible and composite function types
176  */
177 int dr013(int a[4]);
178 int dr013(int a[5]);
179 int dr013(int *a);
180 
181 struct dr013_t {
182 struct dr013_t *p;
183 } dr013_v[sizeof(struct dr013_t)];
184 
185 /* WG14 DR015: yes
186  * What is the promoted type of a plain int bit-field?
187  */
188 void dr015(void) {
189   struct S {
190     int small_int_bitfield : 16;
191     unsigned int small_uint_bitfield : 16;
192     int int_bitfield : 32;
193     unsigned int uint_bitfield : 32;
194   } s;
195   _Static_assert(__builtin_types_compatible_p(__typeof__(+s.small_int_bitfield), int), "fail");
196   _Static_assert(__builtin_types_compatible_p(__typeof__(+s.small_uint_bitfield), int), "fail");
197   _Static_assert(__builtin_types_compatible_p(__typeof__(+s.int_bitfield), int), "fail");
198   _Static_assert(__builtin_types_compatible_p(__typeof__(+s.uint_bitfield), unsigned int), "fail");
199 }
200 
201 /* WG14 DR027: yes
202  * Can there be characters in the character set that are not in the required
203  * source character set?
204  */
205 #define THIS$AND$THAT(a, b) ((a) + (b)) /* expected-warning 2 {{'$' in identifier}} */
206 _Static_assert(THIS$AND$THAT(1, 1) == 2, "fail"); /* expected-warning 2 {{'$' in identifier}} */
207 
208 
209 /* WG14 DR029: no
210  * Do two types have to have the same tag to be compatible?
211  * Note: the rule changed in C99 to be different than the resolution to DR029,
212  * so it's not clear there's value in implementing this DR.
213  */
214 _Static_assert(__builtin_types_compatible_p(struct S { int a; }, union U { int a; }), "fail"); /* expected-error {{static assertion failed due to requirement '__builtin_types_compatible_p(struct S, union U)': fail}} */
215 
216 /* WG14 DR031: yes
217  * Can constant expressions overflow?
218  */
219 void dr031(int i) {
220   switch (i) {
221   case __INT_MAX__ + 1: break; /* expected-warning {{overflow in expression; result is -2'147'483'648 with type 'int'}} */
222   #pragma clang diagnostic push
223   #pragma clang diagnostic ignored "-Wswitch"
224   /* Silence the targets which issue:
225    * warning: overflow converting case value to switch condition type (2147483649 to 18446744071562067969)
226    */
227   case __INT_MAX__ + 2ul: break;
228   #pragma clang diagnostic pop
229   case (__INT_MAX__ * 4) / 4: break; /* expected-warning {{overflow in expression; result is -4 with type 'int'}} */
230   }
231 }
232 
233 /* WG14 DR032: no
234  * Must implementations diagnose extensions to the constant evaluation rules?
235  *
236  * This should issue a diagnostic because a constant-expression is a
237  * conditional-expression, which excludes the comma operator.
238  */
239 int dr032 = (1, 2); /* expected-warning {{left operand of comma operator has no effect}} */
240 
241 #if __STDC_VERSION__ < 202311L
242 /* WG14 DR035: partial
243  * Questions about definition of functions without a prototype
244  */
245 void dr035_1(a, b) /* expected-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}} */
246   int a(enum b {x, y}); /* expected-warning {{declaration of 'enum b' will not be visible outside of this function}} */
247   int b; {
248   int test = x; /* expected-error {{use of undeclared identifier 'x'}} */
249 }
250 
251 void dr035_2(c) /* expected-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}} */
252   enum m{q, r} c; { /* expected-warning {{declaration of 'enum m' will not be visible outside of this function}} */
253   /* FIXME: This should be accepted because the scope of m, q, and r ends at
254    * the closing brace of the function per C89 6.1.2.1.
255    */
256   int test = q; /* expected-error {{use of undeclared identifier 'q'}} */
257 }
258 #endif /* __STDC_VERSION__ < 202311L */
259 
260 /* WG14 DR038: yes
261  * Questions about argument substitution during macro expansion
262  */
263 #define DR038_X 0x000E
264 #define DR038_Y 0x0100
265 #define DR038(a) a
266 _Static_assert(DR038(DR038_X + DR038_Y) == DR038_X + DR038_Y, "fail");
267 
268 /* WG14 DR039: yes
269  * Questions about the "C" locale
270  */
271 _Static_assert(sizeof('a') == sizeof(int), "fail");
272 
273 /* WG14 DR040: partial
274  * 9 unrelated questions about C89
275  *
276  * Question 6
277  */
278 struct dr040 { /* expected-note {{definition of 'struct dr040' is not complete until the closing '}'}} */
279   char c;
280   short s;
281   int i[__builtin_offsetof(struct dr040, s)]; /* expected-error {{offsetof of incomplete type 'struct dr040'}} */
282 };
283 
284 /* WG14 DR043: yes
285  * On the definition of the NULL macro
286  */
287 void dr043(void) {
288   #include <stddef.h>
289   /* NULL has to be an integer constant expression with the value 0, or such an
290    * expression cast to void *. If it's an integer constant expression other
291    * than the literal 0 (such as #define NULL 4-4), this would fail to compile
292    * unless the macro replacement list is properly parenthesized as it would
293    * expand to: (void)(void *)4-4;
294    */
295    (void)(void *)NULL;
296 
297   /* If the NULL macro is an integer constant expression with the value 0 and
298    * it has been cast to void *, ensure that it's also fully parenthesized. If
299    * it isn't (such as #define NULL (void *)0), this would fail to compile as
300    * would expand to (void *)0->a; which gives a diagnostic about int not being
301    * a pointer, instead of((void *)0)->a; which gives a diagnostic about the
302    * base reference being void and not a structure.
303    */
304    NULL->a; /* expected-error {{member reference base type 'void' is not a structure or union}} */
305 }
306 
307 /* WG14 DR044: yes
308  * On the result of the offsetof macro
309  */
310 void dr044(void) {
311   #include <stddef.h>
312   struct S { int a, b; };
313   /* Ensure that the result of offsetof is usable in a constant expression. */
314   _Static_assert(offsetof(struct S, b) == sizeof(int), "fail");
315 }
316 
317 /* WG14 DR046: yes
318  * Use of typedef names in parameter declarations
319  */
320 typedef int dr046_t;
321 int dr046(int dr046_t) { return dr046_t; }
322 
323 /* WG14 DR047: yes
324  * Questions about declaration conformance
325  */
326 struct dr047_t; /* expected-note 2 {{forward declaration of 'struct dr047_t'}} */
327 struct dr047_t *dr047_1(struct dr047_t *p) {return p; }
328 struct dr047_t *dr047_2(struct dr047_t a[]) {return a; } /* expected-error {{array has incomplete element type 'struct dr047_t'}} */
329 int *dr047_3(int a2[][]) {return *a2; } /* expected-error {{array has incomplete element type 'int[]'}} */
330 extern struct dr047_t es1;
331 extern struct dr047_t es2[1]; /* expected-error {{array has incomplete element type 'struct dr047_t'}} */
332 
333 /* WG14 DR050: yes
334  * Do wide string literals implicitly include <stddef.h>?
335  */
336 void dr050(void) {
337   /* The NULL macro is previously defined because we include <stddef.h> for
338    * other tests. Undefine the macro to demonstrate that use of a wide string
339    * literal doesn't magically include the header file.
340    */
341   #undef NULL
342   (void)L"huttah!";
343   (void)NULL; /* expected-error {{use of undeclared identifier 'NULL'}} */
344 }
345 
346 #if __STDC_VERSION__ < 202311L
347 /* WG14 DR053: yes
348  * Accessing a pointer to a function with a prototype through a pointer to
349  * pointer to function without a prototype
350  */
351 void dr053(void) {
352   int f(int);
353   int (*fp1)(int);
354   int (*fp2)();  /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C}} */
355   int (**fpp)(); /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C}} */
356 
357   fp1 = f;
358   fp2 = fp1;
359   (*fp2)(3);  /* expected-warning {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23}} */
360   fpp = &fp1;
361   (**fpp)(3); /* expected-warning {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23}} */
362 }
363 #endif /* __STDC_VERSION__ < 202311L */
364 
365 /* WG14 DR064: yes
366  * Null pointer constants
367  */
368 char *dr064_1(int i, int *pi) {
369   *pi = i;
370   return 0;
371 }
372 
373 char *dr064_2(int i, int *pi) {
374   return (*pi = i, 0); /* expected-error {{incompatible integer to pointer conversion returning 'int' from a function with result type 'char *'}} */
375 }
376 
377 /* WG14 DR068: yes
378  * 'char' and signed vs unsigned integer types
379  */
380 void dr068(void) {
381   #include <limits.h>
382 
383 #if CHAR_MAX == SCHAR_MAX
384   /* char is signed */
385   _Static_assert('\xFF' == -1, "fail");
386 #else
387   /* char is unsigned */
388   _Static_assert('\xFF' == 0xFF, "fail");
389 #endif
390 }
391 
392 #if __STDC_VERSION__ < 202311L
393 /* WG14: DR070: yes
394  * Interchangeability of function arguments
395  *
396  * Note: we could issue a pedantic warning in this case. We are claiming
397  * conformance not because we diagnose the UB when we could but because we're
398  * not obligated to do anything about it and we make it "just work" via the
399  * usual conversion rules.
400  *
401  * This behavior is specific to functions without prototypes. A function with
402  * a prototype causes implicit conversions rather than relying on default
403  * argument promotion and warm thoughts.
404  */
405 void dr070_1(c) /* expected-warning {{a function definition without a prototype is deprecated in all versions of C and is not supported in C23}} */
406   int c; {
407 }
408 
409 void dr070_2(void) {
410   dr070_1(6);
411   dr070_1(6U); /* Pedantically UB */
412 }
413 #endif /* __STDC_VERSION__ < 202311L */
414 
415 /* WG14 DR071: yes
416  * Enumerated types
417  */
418 enum dr071_t { foo_A = 0, foo_B = 1, foo_C = 8 };
419 void dr071(void) {
420   /* Test that in-range values not present in the enumeration still round-trip
421    * to the original value.
422    */
423   _Static_assert(100 == (int)(enum dr071_t)100, "fail");
424 }
425 
426 /* WG14 DR081: yes
427  * Left shift operator
428  */
429 void dr081(void) {
430   /* Demonstrate that we don't crash when left shifting a signed value; that's
431    * implementation defined behavior.
432    */
433  _Static_assert(-1 << 1 == -2, "fail"); /* expected-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}}
434                                            expected-note {{left shift of negative value -1}} */
435  _Static_assert(1 << 3 == 1u << 3u, "fail"); /* Shift of a positive signed value does sensible things. */
436 }
437 
438 /* WG14 DR084: yes
439  * Incomplete type in function declaration
440  *
441  * Note: because the situation is UB, we're free to do what we want. We elect
442  * to accept and require the incomplete type to be completed before the
443  * function definition.
444  */
445 struct dr084_t; /* expected-note {{forward declaration of 'struct dr084_t'}} */
446 extern void (*dr084_1)(struct dr084_t);
447 void dr084_2(struct dr084_t);
448 void dr084_2(struct dr084_t val) {} /* expected-error {{variable has incomplete type 'struct dr084_t'}} */
449 
450 /* WG14 DR088: yes
451  * Compatibility of incomplete types
452  */
453 struct dr088_t_1;
454 
455 void dr088_f(struct dr088_t_1 *); /* expected-note {{passing argument to parameter here}} */
456 void dr088_1(void) {
457   /* Distinct type from the file scope forward declaration. */
458   struct dr088_t_1;
459   /* FIXME: this diagnostic could be improved to not be utterly baffling. */
460   dr088_f((struct dr088_t_1 *)0); /* expected-warning {{incompatible pointer types passing 'struct dr088_t_1 *' to parameter of type 'struct dr088_t_1 *'}} */
461 }
462 
463 void dr088_2(struct dr088_t_1 *p) { /* Pointer to incomplete type. */ }
464 struct dr088_t_1 { int i; }; /* Type is completed. */
465 void dr088_3(struct dr088_t_1 s) {
466   /* When passing a pointer to the completed type, is it the same type as the
467    * incomplete type used in the call declaration?
468    */
469   dr088_2(&s);
470 }
471 
472 /* WG14 DR089: yes
473  * Multiple definitions of macros
474  */
475 #define DR089 object_like             /* expected-note {{previous definition is here}} */
476 #define DR089(argument) function_like /* expected-warning {{'DR089' macro redefined}} */
477 
478 /* WG14 DR095: yes
479  * Is initialization as constrained as assignment?
480  */
481 void dr095(void) {
482   /* Ensure that type compatibility constraints on assignment are also honored
483    * for initializations.
484    */
485   struct One {
486     int a;
487   } one;
488   struct Two {
489     float f;
490   } two = one; /* expected-error {{initializing 'struct Two' with an expression of incompatible type 'struct One'}} */
491 
492   two = one; /* expected-error {{assigning to 'struct Two' from incompatible type 'struct One'}} */
493 }
494 
495 /* WG14 DR096: yes
496  * Arrays of incomplete types
497  */
498 void dr096(void) {
499   typedef void func_type(void);
500   func_type array_funcs[10]; /* expected-error {{'array_funcs' declared as array of functions of type 'func_type' (aka 'void (void)')}} */
501 
502   void array_void[10]; /* expected-error {{array has incomplete element type 'void'}} */
503 
504   struct S; /* expected-note {{forward declaration of 'struct S'}} */
505   struct S s[10]; /* expected-error {{array has incomplete element type 'struct S'}} */
506 
507   union U; /* expected-note {{forward declaration of 'union U'}} */
508   union U u[10]; /* expected-error {{array has incomplete element type 'union U'}} */
509   union U { int i; };
510 
511   int never_completed_incomplete_array[][]; /* expected-error {{array has incomplete element type 'int[]'}} */
512 
513   extern int completed_later[][]; /* expected-error {{array has incomplete element type 'int[]'}} */
514   extern int completed_later[10][10];
515 }
516 
517 /* WG14 DR098: yes
518  * Pre/post increment/decrement of function or incomplete types
519  */
520 void dr098(void) {
521   typedef void func_type(void);
522   func_type fp;
523   struct incomplete *incomplete_ptr;
524 
525   ++fp; /* expected-error {{cannot increment value of type 'func_type' (aka 'void (void)')}} */
526   fp++; /* expected-error {{cannot increment value of type 'func_type' (aka 'void (void)')}} */
527   --fp; /* expected-error {{cannot decrement value of type 'func_type' (aka 'void (void)')}} */
528   fp--; /* expected-error {{cannot decrement value of type 'func_type' (aka 'void (void)')}} */
529 
530   (*incomplete_ptr)++; /* expected-error {{cannot increment value of type 'struct incomplete'}} */
531   ++(*incomplete_ptr); /* expected-error {{cannot increment value of type 'struct incomplete'}} */
532   (*incomplete_ptr)--; /* expected-error {{cannot decrement value of type 'struct incomplete'}} */
533   --(*incomplete_ptr); /* expected-error {{cannot decrement value of type 'struct incomplete'}} */
534 }
535