[clang] df46fb4 - Test C DR conformance (part one of many)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat May 21 12:02:54 PDT 2022


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>


        


More information about the cfe-commits mailing list