Test more C DR conformance (part two of many)

This continues the work started earlier at filling our the C DR status
page based on test coverage.
This commit is contained in:
Aaron Ballman 2022-05-22 13:36:10 -04:00
parent 145fe57106
commit 202a4fde2b
3 changed files with 233 additions and 31 deletions

17
clang/test/C/drs/dr060.c Normal file
View File

@ -0,0 +1,17 @@
/* RUN: %clang_cc1 -std=c89 -emit-llvm -o - %s | FileCheck %s
RUN: %clang_cc1 -std=c99 -emit-llvm -o - %s | FileCheck %s
RUN: %clang_cc1 -std=c11 -emit-llvm -o - %s | FileCheck %s
RUN: %clang_cc1 -std=c17 -emit-llvm -o - %s | FileCheck %s
RUN: %clang_cc1 -std=c2x -emit-llvm -o - %s | FileCheck %s
*/
/* WG14 DR060:
* Array initialization from a string literal
*/
const char str[5] = "foo";
const __typeof__(*L"a") wstr[5] = L"foo";
// CHECK: @str = {{.*}}constant [5 x i8] c"foo\00\00"
// CHECK-NEXT: @wstr = {{.*}}constant [5 x i{{16|32}}] [i{{16|32}} 102, i{{16|32}} 111, i{{16|32}} 111, i{{16|32}} 0, i{{16|32}} 0]

View File

@ -1,8 +1,9 @@
/* RUN: %clang_cc1 -std=c89 -verify=expected,c89 -pedantic -Wno-declaration-after-statement -Wno-c11-extensions %s
RUN: %clang_cc1 -std=c99 -verify -pedantic -Wno-c11-extensions %s
RUN: %clang_cc1 -std=c11 -verify -pedantic %s
RUN: %clang_cc1 -std=c17 -verify -pedantic %s
RUN: %clang_cc1 -std=c2x -verify -pedantic %s
/* RUN: %clang_cc1 -std=c89 -verify=expected,c89only -pedantic -Wno-declaration-after-statement -Wno-c11-extensions %s
RUN: %clang_cc1 -std=c89 -verify=expected,c89only -pedantic -Wno-declaration-after-statement -Wno-c11-extensions -fno-signed-char %s
RUN: %clang_cc1 -std=c99 -verify=expected,c99untilc2x -pedantic -Wno-c11-extensions %s
RUN: %clang_cc1 -std=c11 -verify=expected,c99untilc2x -pedantic %s
RUN: %clang_cc1 -std=c17 -verify=expected,c99untilc2x -pedantic %s
RUN: %clang_cc1 -std=c2x -verify=expected,c2xandup -pedantic %s
*/
/* The following are DRs which do not require tests to demonstrate
@ -28,6 +29,34 @@
* WG14 DR033: yes
* Conformance questions around 'shall' violations outside of constraints
* sections
*
* WG14 DR036: yes
* May floating-point constants be represented with more precision than implied
* by its type?
*
* WG14 DR037: yes
* Questions about multibyte characters and Unicode
*
* WG14 DR051: yes
* Question on pointer arithmetic
*
* WG14 DR052: yes
* Editorial corrections
*
* WG14 DR056: yes
* Floating-point representation precision requirements
*
* WG14 DR057: yes
* Is there an integral type for every pointer?
*
* WG14 DR059: yes
* Do types have to be completed?
*
* WG14 DR063: dup 056
* Floating-point representation precision requirements
*
* WG14 DR067: yes
* Integer and integral type confusion
*/
@ -49,11 +78,16 @@ struct dr007_a;
struct dr007_b {int a;};
struct dr007_b;
/* WG14 DR009: no
* Use of typedef names in parameter declarations
*
* FIXME: This should be diagnosed as expecting a declaration specifier instead
* of treated as declaring a parameter of type 'int (*)(dr009_t);'
*/
typedef int dr009_t;
void dr009_f(int dr009_t);
void dr009_f((dr009_t)); /* c99untilc2x-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}}
c2xandup-error {{a type specifier is required for all declarations}} */
/* WG14 DR010:
* Is a typedef to an incomplete type legal?
@ -67,6 +101,12 @@ int dr010_c = sizeof(dr010_t); /* expected-error {{invalid application of 'sizeo
* Merging of declarations for linked identifier
*
* Note: more of this DR is tested in dr011.c
*
* WG14 DR034: yes
* External declarations in different scopes
*
* Note: DR034 has a question resolved by DR011 and another question where the
* result is UB.
*/
static int dr011_a[]; /* expected-warning {{tentative array definition assumed to have one element}} */
void dr011(void) {
@ -96,7 +136,7 @@ void dr011(void) {
*/
void dr012(void *p) {
/* The behavior changed between C89 and C99. */
(void)&*p; /* c89-warning {{ISO C forbids taking the address of an expression of type 'void'}} */
(void)&*p; /* c89only-warning {{ISO C forbids taking the address of an expression of type 'void'}} */
}
/* WG14 DR013: yes
@ -158,10 +198,150 @@ void dr031(int i) {
}
}
/* WG21 DR032: no
/* WG14 DR032: no
* Must implementations diagnose extensions to the constant evaluation rules?
*
* This should issue a diagnostic because a constant-expression is a
* conditional-expression, which excludes the comma operator.
*/
int dr032 = (1, 2); /* expected-warning {{left operand of comma operator has no effect}} */
#if __STDC_VERSION__ < 202000L
/* WG14 DR035: partial
* Questions about definition of functions without a prototype
*/
void dr035_1(a, b) /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x}} */
int a(enum b {x, y}); /* expected-warning {{declaration of 'enum b' will not be visible outside of this function}} */
int b; {
int test = x; /* expected-error {{use of undeclared identifier 'x'}} */
}
void dr035_2(c) /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x}} */
enum m{q, r} c; { /* expected-warning {{declaration of 'enum m' will not be visible outside of this function}} */
/* FIXME: This should be accepted because the scope of m, q, and r ends at
* the closing brace of the function per C89 6.1.2.1.
*/
int test = q; /* expected-error {{use of undeclared identifier 'q'}} */
}
#endif /* __STDC_VERSION__ < 202000L */
/* WG14 DR038: yes
* Questions about argument substitution during macro expansion
*/
#define DR038_X 0x000E
#define DR038_Y 0x0100
#define DR038(a) a
_Static_assert(DR038(DR038_X + DR038_Y) == DR038_X + DR038_Y, "fail");
/* WG14 DR039: yes
* Questions about the "C" locale
*/
_Static_assert(sizeof('a') == sizeof(int), "fail");
/* WG14 DR043: yes
* On the definition of the NULL macro
*/
void dr043(void) {
#include <stddef.h>
/* NULL has to be an integer constant expression with the value 0, or such an
* expression cast to void *. If it's an integer constant expression other
* than the literal 0 (such as #define NULL 4-4), this would fail to compile
* unless the macro replacement list is properly parenthesized as it would
* expand to: (void)(void *)4-4;
*/
(void)(void *)NULL;
/* If the NULL macro is an integer constant expression with the value 0 and
* it has been cast to void *, ensure that it's also fully parenthesized. If
* it isn't (such as #define NULL (void *)0), this would fail to compile as
* would expand to (void *)0->a; which gives a diagnostic about int not being
* a pointer, instead of((void *)0)->a; which gives a diagnostic about the
* base reference being void and not a structure.
*/
NULL->a; /* expected-error {{member reference base type 'void' is not a structure or union}} */
}
/* WG14 DR044: yes
* On the result of the offsetof macro
*/
void dr044(void) {
#include <stddef.h>
struct S { int a, b; };
/* Ensure that the result of offsetof is usable in a constant expression. */
_Static_assert(offsetof(struct S, b) == sizeof(int), "fail");
}
/* WG14 DR046: yes
* Use of typedef names in parameter declarations
*/
typedef int dr046_t;
int dr046(int dr046_t) { return dr046_t; }
/* WG14 DR047: yes
* Questions about declaration conformance
*/
struct dr047_t; /* expected-note 2 {{forward declaration of 'struct dr047_t'}} */
struct dr047_t *dr047_1(struct dr047_t *p) {return p; }
struct dr047_t *dr047_2(struct dr047_t a[]) {return a; } /* expected-error {{array has incomplete element type 'struct dr047_t'}} */
int *dr047_3(int a2[][]) {return *a2; } /* expected-error {{array has incomplete element type 'int[]'}} */
extern struct dr047_t es1;
extern struct dr047_t es2[1]; /* expected-error {{array has incomplete element type 'struct dr047_t'}} */
/* WG14 DR050: yes
* Do wide string literals implicitly include <stddef.h>?
*/
void dr050(void) {
/* The NULL macro is previously defined because we include <stddef.h> for
* other tests. Undefine the macro to demonstrate that use of a wide string
* literal doesn't magically include the header file.
*/
#undef NULL
(void)L"huttah!";
(void)NULL; /* expected-error {{use of undeclared identifier 'NULL'}} */
}
#if __STDC_VERSION__ < 202000L
/* WG14 DR053: yes
* Accessing a pointer to a function with a prototype through a pointer to
* pointer to function without a prototype
*/
void dr053(void) {
int f(int);
int (*fp1)(int);
int (*fp2)(); /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C}} */
int (**fpp)(); /* expected-warning {{a function declaration without a prototype is deprecated in all versions of C}} */
fp1 = f;
fp2 = fp1;
(*fp2)(3); /* expected-warning {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C2x}} */
fpp = &fp1;
(**fpp)(3); /* expected-warning {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C2x}} */
}
#endif /* __STDC_VERSION__ < 202000L */
/* WG14 DR064: yes
* Null pointer constants
*/
char *dr064_1(int i, int *pi) {
*pi = i;
return 0;
}
char *dr064_2(int i, int *pi) {
return (*pi = i, 0); /* expected-warning {{incompatible integer to pointer conversion returning 'int' from a function with result type 'char *'}} */
}
/* WG14 DR068: yes
* 'char' and signed vs unsigned integer types
*/
void dr068(void) {
#include <limits.h>
#if CHAR_MAX == SCHAR_MAX
/* char is signed */
_Static_assert('\xFF' == -1, "fail");
#else
/* char is unsigned */
_Static_assert('\xFF' == 0xFF, "fail");
#endif
}

View File

@ -250,37 +250,42 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_034.html">34</a></td>
<td>C89</td>
<td>External declarations in different scopes</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="35">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_035.html">35</a></td>
<td>NAD</td>
<td>Questions about definition of functions without a prototype</td>
<td class="unknown" align="center">Unknown</td>
<td class="partial" align="center">
<details><summary>Partial</summary>
Tags declared directly within an identifier list are incorrectly scoped
to the prototype rather than to the function body.
</details>
</td>
</tr>
<tr id="36">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_036.html">36</a></td>
<td>NAD</td>
<td>May floating-point constants be represented with more precision than implied by its type?</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="37">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_037.html">37</a></td>
<td>NAD</td>
<td>Questions about multibyte characters and Unicode</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="38">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_038.html">38</a></td>
<td>NAD</td>
<td>Questions about argument substitution during macro expansion</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="39">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_039.html">39</a></td>
<td>NAD</td>
<td>Questions about the "C" locale</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="40">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_040.html">40</a></td>
@ -304,13 +309,13 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_043.html">43</a></td>
<td>C89</td>
<td>On the definition of the NULL macro</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="44">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_044.html">44</a></td>
<td>NAD</td>
<td>On the result of the offsetof macro</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="45">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_045.html">45</a></td>
@ -322,13 +327,13 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_046.html">46</a></td>
<td>NAD</td>
<td>Use of typedef names in parameter declarations</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="47">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_047.html">47</a></td>
<td>NAD</td>
<td>Questions about declaration conformance</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="48">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_048.html">48</a></td>
@ -346,25 +351,25 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_050.html">50</a></td>
<td>NAD</td>
<td>Do wide string literals implicitly include &lt;stddef.h&gt;?</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="51">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_051.html">51</a></td>
<td>NAD</td>
<td>Question on pointer arithmetic</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="52">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_052.html">52</a></td>
<td>C89</td>
<td>Editorial corrections</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="53">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_053.html">53</a></td>
<td>C89</td>
<td>Accessing a pointer to a function with a prototype through a pointer to pointer to function without a prototype</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="54">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_054.html">54</a></td>
@ -382,13 +387,13 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_056.html">56</a></td>
<td>NAD</td>
<td>Floating-point representation precision requirements</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="57">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_057.html">57</a></td>
<td>NAD</td>
<td>Is there an integral type for every pointer?</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="58">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_058.html">58</a></td>
@ -400,13 +405,13 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_059.html">59</a></td>
<td>NAD</td>
<td>Do types have to be completed?</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="60">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_060.html">60</a></td>
<td>C89</td>
<td>Array initialization from a string literal</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="61">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_061.html">61</a></td>
@ -424,13 +429,13 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_063.html">63</a></td>
<td>Dup</td>
<td>Floating-point representation precision requirements</td>
<td class="unknown" align="center">Duplicate of <a href="#56">56</a></td>
<td class="full" align="center">Duplicate of <a href="#56">56</a></td>
</tr>
<tr id="64">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_064.html">64</a></td>
<td>NAD</td>
<td>Null pointer constants</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="65">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_065.html">65</a></td>
@ -442,19 +447,19 @@ conformance.</p>
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_066.html">66</a></td>
<td>NAD</td>
<td>Another question on locales</td>
<td class="unknown" align="center">Unknown</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="67">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_067.html">67</a></td>
<td>NAD</td>
<td>Integer and integral type confusion</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="68">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_068.html">68</a></td>
<td>NAD</td>
<td>'char' and signed vs unsigned integer types</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="69">
<td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_069.html">69</a></td>