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
9 /* The following are DRs which do not require tests to demonstrate
10 * conformance or nonconformance.
13 * Do functions return values by copying?
16 * May a conforming implementation define and recognize a pragma which would
17 * change the semantics of the language?
20 * Can a conforming C compiler to perform dead-store elimination?
23 * Is a compiler which allows the Relaxed Ref/Def linkage model to be
24 * considered a conforming compiler?
27 * What is meant by 'representable floating-point value?'
30 * Can a strictly conforming program contain a string literal with '$' or '@'?
33 * Conformance questions around 'shall' violations outside of constraints
37 * May floating-point constants be represented with more precision than implied
41 * Questions about multibyte characters and Unicode
44 * Question on pointer arithmetic
47 * Editorial corrections
50 * Floating-point representation precision requirements
53 * Is there an integral type for every pointer?
56 * Do types have to be completed?
59 * Floating-point representation precision requirements
62 * Integer and integral type confusion
65 * Questions about the representation of integer types
68 * Stability of addresses
71 * Merging of string constants
78 * Note: this DR is covered by C/C11/n1282.c
81 * Object-like macros in system headers
87 * Partial initialization of strings
90 * Reservation of identifiers
95 * Are multiple definitions of unused identifiers with external linkage
98 int dr004(void) {return 0;} /* expected-note {{previous definition is here}} */
99 int dr004(void) {return 1;} /* expected-error {{redefinition of 'dr004'}} */
102 * Are declarations of the form struct-or-union identifier ; permitted after
103 * the identifier tag has already been declared?
107 struct dr007_a
{int a
;};
109 struct dr007_b
{int a
;};
114 * Use of typedef names in parameter declarations
116 * FIXME: This should be diagnosed as expecting a declaration specifier instead
117 * of treated as declaring a parameter of type '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}} */
124 * Is a typedef to an incomplete type legal?
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[]')}} */
132 * Merging of declarations for linked identifier
134 * Note: more of this DR is tested in dr011.c
137 * External declarations in different scopes
139 * Note: DR034 has a question resolved by DR011 and another question where the
142 static int dr011_a
[]; /* expected-warning {{tentative array definition assumed to have one element}} */
146 /* a different declaration of the same object */
149 _Static_assert(sizeof(i
) == 10 * sizeof(int), "fail");
151 (void)sizeof(i
); /* expected-error {{invalid application of 'sizeof' to an incomplete type 'int[]'}} */
153 extern int dr011_a
[10];
154 (void)sizeof(dr011_a
);
155 _Static_assert(sizeof(dr011_a
) == 10 * sizeof(int), "fail");
161 _Static_assert(sizeof(j
) == 10 * sizeof(int), "fail");
166 * Is it valid to take the address of a dereferenced void pointer?
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 *'}} */
175 * Compatible and composite function types
183 } dr013_v
[sizeof(struct dr013_t
)];
186 * What is the promoted type of a plain int bit-field?
190 int small_int_bitfield
: 16;
191 unsigned int small_uint_bitfield
: 16;
192 int int_bitfield
: 32;
193 unsigned int uint_bitfield
: 32;
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");
202 * Can there be characters in the character set that are not in the required
203 * source character set?
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}} */
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.
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}} */
217 * Can constant expressions overflow?
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)
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'}} */
234 * Must implementations diagnose extensions to the constant evaluation rules?
236 * This should issue a diagnostic because a constant-expression is a
237 * conditional-expression, which excludes the comma operator.
239 int dr032
= (1, 2); /* expected-warning {{left operand of comma operator has no effect}} */
241 #if __STDC_VERSION__ < 202311L
242 /* WG14 DR035: partial
243 * Questions about definition of functions without a prototype
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}} */
248 int test
= x
; /* expected-error {{use of undeclared identifier 'x'}} */
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.
256 int test
= q
; /* expected-error {{use of undeclared identifier 'q'}} */
258 #endif /* __STDC_VERSION__ < 202311L */
261 * Questions about argument substitution during macro expansion
263 #define DR038_X 0x000E
264 #define DR038_Y 0x0100
266 _Static_assert(DR038(DR038_X
+ DR038_Y
) == DR038_X
+ DR038_Y
, "fail");
269 * Questions about the "C" locale
271 _Static_assert(sizeof('a') == sizeof(int), "fail");
273 /* WG14 DR040: partial
274 * 9 unrelated questions about C89
278 struct dr040
{ /* expected-note {{definition of 'struct dr040' is not complete until the closing '}'}} */
281 int i
[__builtin_offsetof(struct dr040
, s
)]; /* expected-error {{offsetof of incomplete type 'struct dr040'}} */
285 * On the definition of the NULL macro
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;
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.
304 NULL
->a
; /* expected-error {{member reference base type 'void' is not a structure or union}} */
308 * On the result of the offsetof macro
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");
318 * Use of typedef names in parameter declarations
321 int dr046(int dr046_t
) { return dr046_t
; }
324 * Questions about declaration conformance
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'}} */
334 * Do wide string literals implicitly include <stddef.h>?
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.
343 (void)NULL
; /* expected-error {{use of undeclared identifier 'NULL'}} */
346 #if __STDC_VERSION__ < 202311L
348 * Accessing a pointer to a function with a prototype through a pointer to
349 * pointer to function without a prototype
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}} */
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}} */
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}} */
363 #endif /* __STDC_VERSION__ < 202311L */
366 * Null pointer constants
368 char *dr064_1(int i
, int *pi
) {
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 *'}} */
378 * 'char' and signed vs unsigned integer types
383 #if CHAR_MAX == SCHAR_MAX
385 _Static_assert('\xFF' == -1, "fail");
387 /* char is unsigned */
388 _Static_assert('\xFF' == 0xFF, "fail");
392 #if __STDC_VERSION__ < 202311L
394 * Interchangeability of function arguments
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.
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.
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}} */
411 dr070_1(6U); /* Pedantically UB */
413 #endif /* __STDC_VERSION__ < 202311L */
418 enum dr071_t
{ foo_A
= 0, foo_B
= 1, foo_C
= 8 };
420 /* Test that in-range values not present in the enumeration still round-trip
421 * to the original value.
423 _Static_assert(100 == (int)(enum dr071_t
)100, "fail");
427 * Left shift operator
430 /* Demonstrate that we don't crash when left shifting a signed value; that's
431 * implementation defined behavior.
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. */
439 * Incomplete type in function declaration
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.
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'}} */
451 * Compatibility of incomplete types
455 void dr088_f(struct dr088_t_1
*); /* expected-note {{passing argument to parameter here}} */
457 /* Distinct type from the file scope forward declaration. */
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 *'}} */
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?
473 * Multiple definitions of macros
475 #define DR089 object_like /* expected-note {{previous definition is here}} */
476 #define DR089(argument) function_like /* expected-warning {{'DR089' macro redefined}} */
479 * Is initialization as constrained as assignment?
482 /* Ensure that type compatibility constraints on assignment are also honored
483 * for initializations.
490 } two
= one
; /* expected-error {{initializing 'struct Two' with an expression of incompatible type 'struct One'}} */
492 two
= one
; /* expected-error {{assigning to 'struct Two' from incompatible type 'struct One'}} */
496 * Arrays of incomplete types
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)')}} */
502 void array_void
[10]; /* expected-error {{array has incomplete element type 'void'}} */
504 struct S
; /* expected-note {{forward declaration of 'struct S'}} */
505 struct S s
[10]; /* expected-error {{array has incomplete element type 'struct S'}} */
507 union U
; /* expected-note {{forward declaration of 'union U'}} */
508 union U u
[10]; /* expected-error {{array has incomplete element type 'union U'}} */
511 int never_completed_incomplete_array
[][]; /* expected-error {{array has incomplete element type 'int[]'}} */
513 extern int completed_later
[][]; /* expected-error {{array has incomplete element type 'int[]'}} */
514 extern int completed_later
[10][10];
518 * Pre/post increment/decrement of function or incomplete types
521 typedef void func_type(void);
523 struct incomplete
*incomplete_ptr
;
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)')}} */
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'}} */