Author: Aaron Ballman Date: 2022-05-21T15:02:46-04:00 New Revision: df46fb40557a14807dd508af32251ceb1cab8b86
URL: https://github.com/llvm/llvm-project/commit/df46fb40557a14807dd508af32251ceb1cab8b86 DIFF: https://github.com/llvm/llvm-project/commit/df46fb40557a14807dd508af32251ceb1cab8b86.diff LOG: Test C DR conformance (part one of many) This starts to fill out the C DR status page with information determined from tests. It also starts to add some test coverage for the DRs we can add tests for (some are difficult as not all C DRs involve questions about code and some DRs are about the behavior of linking multiple TUs together). Note: there is currently no automation for filling out the HTML page from test coverage like there is for the C++ DRs, but this commit attempts to use a similar comment style in case we want to add such a script in the future. Added: clang/test/C/drs/dr011.c clang/test/C/drs/dr0xx.c Modified: clang/www/c_dr_status.html Removed: ################################################################################ diff --git a/clang/test/C/drs/dr011.c b/clang/test/C/drs/dr011.c new file mode 100644 index 0000000000000..6bb7d4785cfa3 --- /dev/null +++ b/clang/test/C/drs/dr011.c @@ -0,0 +1,18 @@ +/* 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 DR011: yes + * Merging of declarations for linked identifier + * + * Note, more of this DR is tested in dr0xx.c + */ + +int i[10]; +int j[]; + +// CHECK: @i = {{.*}} global [10 x i32] zeroinitializer +// CHECK-NEXT: @j = {{.*}} global [1 x i32] zeroinitializer diff --git a/clang/test/C/drs/dr0xx.c b/clang/test/C/drs/dr0xx.c new file mode 100644 index 0000000000000..cac8b62483ac2 --- /dev/null +++ b/clang/test/C/drs/dr0xx.c @@ -0,0 +1,161 @@ +/* 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 + */ + +/* The following are DRs which do not require tests to demonstrate + * conformance or nonconformance. + * + * WG14 DR005: yes + * May a conforming implementation define and recognize a pragma which would + * change the semantics of the language? + * + * WG14 DR008: yes + * Can a conforming C compiler to perform dead-store elimination? + * + * WG14 DR020: yes + * Is a compiler which allows the Relaxed Ref/Def linkage model to be + * considered a conforming compiler? + * + * WG14 DR025: yes + * What is meant by 'representable floating-point value?' + * + * WG14 DR026: yes + * Can a strictly conforming program contain a string literal with '$' or '@'? + * + * WG14 DR033: yes + * Conformance questions around 'shall' violations outside of constraints + * sections + */ + + +/* WG14 DR004: yes + * Are multiple definitions of unused identifiers with external linkage + * permitted? + */ +int dr004(void) {return 0;} /* expected-note {{previous definition is here}} */ +int dr004(void) {return 1;} /* expected-error {{redefinition of 'dr004'}} */ + +/* WG14 DR007: yes + * Are declarations of the form struct-or-union identifier ; permitted after + * the identifier tag has already been declared? + */ +struct dr007_a; +struct dr007_a; +struct dr007_a {int a;}; +struct dr007_a; +struct dr007_b {int a;}; +struct dr007_b; + +/* WG14 DR009: no + * Use of typedef names in parameter declarations + */ +typedef int dr009_t; +void dr009_f(int dr009_t); + +/* WG14 DR010: + * Is a typedef to an incomplete type legal? + */ +typedef int dr010_t[]; +dr010_t dr010_a = {1}; +dr010_t dr010_b = {1, 2}; +int dr010_c = sizeof(dr010_t); /* expected-error {{invalid application of 'sizeof' to an incomplete type 'dr010_t' (aka 'int[]')}} */ + +/* WG14 DR011: yes + * Merging of declarations for linked identifier + * + * Note: more of this DR is tested in dr011.c + */ +static int dr011_a[]; /* expected-warning {{tentative array definition assumed to have one element}} */ +void dr011(void) { + extern int i[]; + { + /* a diff erent declaration of the same object */ + extern int i[10]; + (void)sizeof(i); + _Static_assert(sizeof(i) == 10 * sizeof(int), "fail"); + } + (void)sizeof(i); /* expected-error {{invalid application of 'sizeof' to an incomplete type 'int[]'}} */ + + extern int dr011_a[10]; + (void)sizeof(dr011_a); + _Static_assert(sizeof(dr011_a) == 10 * sizeof(int), "fail"); + + extern int j[10]; + { + extern int j[]; + (void)sizeof(j); + _Static_assert(sizeof(j) == 10 * sizeof(int), "fail"); + } +} + +/* WG14 DR012: yes + * Is it valid to take the address of a dereferenced void pointer? + */ +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'}} */ +} + +/* WG14 DR013: yes + * Compatible and composite function types + */ +int dr013(int a[4]); +int dr013(int a[5]); +int dr013(int *a); + +struct dr013_t { +struct dr013_t *p; +} dr013_v[sizeof(struct dr013_t)]; + +/* WG14 DR015: yes + * What is the promoted type of a plain int bit-field? + */ +void dr015(void) { + struct S { + int small_int_bitfield : 16; + unsigned int small_uint_bitfield : 16; + int int_bitfield : 32; + unsigned int uint_bitfield : 32; + } s; + _Static_assert(__builtin_types_compatible_p(__typeof__(+s.small_int_bitfield), int), "fail"); + _Static_assert(__builtin_types_compatible_p(__typeof__(+s.small_uint_bitfield), int), "fail"); + _Static_assert(__builtin_types_compatible_p(__typeof__(+s.int_bitfield), int), "fail"); + _Static_assert(__builtin_types_compatible_p(__typeof__(+s.uint_bitfield), unsigned int), "fail"); +} + +/* WG14 DR027: yes + * Can there be characters in the character set that are not in the required + * source character set? + */ +#define THIS$AND$THAT(a, b) ((a) + (b)) /* expected-warning 2 {{'$' in identifier}} */ +_Static_assert(THIS$AND$THAT(1, 1) == 2, "fail"); /* expected-warning 2 {{'$' in identifier}} */ + + +/* WG14 DR029: no + * Do two types have to have the same tag to be compatible? + * Note: the rule changed in C99 to be diff erent than the resolution to DR029, + * so it's not clear there's value in implementing this DR. + */ +_Static_assert(__builtin_types_compatible_p(struct S { int a; }, union U { int a; }), "fail"); /* expected-error {{static_assert failed due to requirement '__builtin_types_compatible_p(struct S, union U)' "fail"}} */ + +/* WG14 DR031: yes + * Can constant expressions overflow? + */ +void dr031(int i) { + switch (i) { + case __INT_MAX__ + 1: break; /* expected-warning {{overflow in expression; result is -2147483648 with type 'int'}} */ + case __INT_MAX__ + 2ul: break; + case (__INT_MAX__ * 4) / 4: break; /* expected-warning {{overflow in expression; result is -4 with type 'int'}} */ + } +} + +/* WG21 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); diff --git a/clang/www/c_dr_status.html b/clang/www/c_dr_status.html index b92cf60604955..05d85790cb920 100644 --- a/clang/www/c_dr_status.html +++ b/clang/www/c_dr_status.html @@ -70,16 +70,16 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_004.html">4</a></td> <td>NAD</td> <td>Are multiple definitions of unused identifiers with external linkage permitted?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="5"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_005.html">5</a></td> - <td>C89</td> + <td>NAD</td> <td>May a conforming implementation define and recognize a pragma which would change the semantics of the language?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="6"> - <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_006.html">7</a></td> + <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_006.html">6</a></td> <td>C89</td> <td>It is unclear how the strtoul function behaves when presented with a subject sequence that begins with a minus sign</td> <td class="na" align="center">N/A</td> @@ -88,43 +88,43 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_007.html">7</a></td> <td>NAD</td> <td>Are declarations of the form struct-or-union identifier ; permitted after the identifier tag has already been declared?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="8"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_008.html">8</a></td> <td>NAD</td> <td>Can a conforming C compiler to perform dead-store elimination?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="9"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_009.html">9</a></td> <td>C89</td> <td>Use of typedef names in parameter declarations</td> - <td class="unknown" align="center">Unknown</td> + <td class="none" align="center">No</td> </tr> <tr id="10"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_010.html">10</a></td> <td>NAD</td> <td>Is a typedef to an incomplete type legal?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="11"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_011.html">11</a></td> <td>C89</td> <td>Merging of declarations for linked identifier</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="12"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html">12</a></td> <td>NAD</td> - <td>Questions on the validity of various expressions</td> - <td class="unknown" align="center">Unknown</td> + <td>Is it valid to take the address of a dereferenced void pointer?</td> + <td class="full" align="center">Yes</td> </tr> <tr id="13"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_013.html">13</a></td> <td>C89</td> <td>Compatible and composite function types</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="14"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_014.html">14</a></td> @@ -136,7 +136,7 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_015.html">15</a></td> <td>NAD</td> <td>What is the promoted type of a plain int bit-field?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="16"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_016.html">16</a></td> @@ -166,7 +166,7 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_020.html">20</a></td> <td>NAD</td> <td>Is a compiler which allows the Relaxed Ref/Def linkage model to be considered a conforming compiler?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="21"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_021.html">21</a></td> @@ -196,19 +196,19 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_025.html">25</a></td> <td>NAD</td> <td>What is meant by 'representable floating-point value?'</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="26"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_026.html">26</a></td> <td>NAD</td> <td>Can a strictly conforming program contain a string literal with '$' or '@'?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="27"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_027.html">27</a></td> <td>C89</td> <td>Can there be characters in the character set that are not in the required source character set?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="28"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_028.html">28</a></td> @@ -220,7 +220,7 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_029.html">29</a></td> <td>NAD</td> <td>Do two types have to have the same tag to be compatible?</td> - <td class="unknown" align="center">Unknown</td> + <td class="none" align="center">No</td> </tr> <tr id="30"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_030.html">30</a></td> @@ -232,19 +232,19 @@ <h2 id="cdr">C defect report implementation status</h2> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_031.html">31</a></td> <td>NAD</td> <td>Can constant expressions overflow?</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="32"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_032.html">32</a></td> <td>NAD</td> <td>Must implementations diagnose extensions to the constant evaluation rules?</td> - <td class="unknown" align="center">Unknown</td> + <td class="none" align="center">No</td> </tr> <tr id="33"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_033.html">33</a></td> <td>NAD</td> <td>Conformance questions around 'shall' violations outside of constraints sections</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="34"> <td><a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_034.html">34</a></td> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits