mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-01 14:58:18 +00:00
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:
parent
145fe57106
commit
202a4fde2b
17
clang/test/C/drs/dr060.c
Normal file
17
clang/test/C/drs/dr060.c
Normal 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]
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 <stddef.h>?</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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user