[clang] 5e676aa - Add tests for C11 DRs and update the status page

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 26 10:53:57 PDT 2022


Author: Aaron Ballman
Date: 2022-10-26T13:53:50-04:00
New Revision: 5e676aa702d8df32a832c765eb8f60773d190236

URL: https://github.com/llvm/llvm-project/commit/5e676aa702d8df32a832c765eb8f60773d190236
DIFF: https://github.com/llvm/llvm-project/commit/5e676aa702d8df32a832c765eb8f60773d190236.diff

LOG: Add tests for C11 DRs and update the status page

This gets a start on testing how we're doing for C11 DRs

Added: 
    clang/test/C/drs/dr411.c

Modified: 
    clang/test/C/drs/dr4xx.c
    clang/www/c_dr_status.html

Removed: 
    


################################################################################
diff  --git a/clang/test/C/drs/dr411.c b/clang/test/C/drs/dr411.c
new file mode 100644
index 0000000000000..0cb0000b3c316
--- /dev/null
+++ b/clang/test/C/drs/dr411.c
@@ -0,0 +1,33 @@
+/* RUN: %clang_cc1 -std=c89 -fsyntax-only -verify -DC89 -Wno-c11-extensions %s
+   RUN: %clang_cc1 -std=c99 -fsyntax-only -verify -DC99 -Wno-c11-extensions %s
+   RUN: %clang_cc1 -std=c11 -fsyntax-only -verify -DC11 %s
+   RUN: %clang_cc1 -std=c17 -fsyntax-only -verify -DC17 %s
+   RUN: %clang_cc1 -std=c2x -fsyntax-only -verify -DC2X %s
+ */
+
+/* expected-no-diagnostics */
+
+/* WG14 DR411: yes
+ * Predefined macro values
+ *
+ * Note: the DR is about the C11 macro value, but we'll test all the standard
+ * version macro values just to be sure. We do not need to test
+ * __STDC_LIB_EXT1__ values because that requires an Annex K-compatible header.
+ */
+#if defined(C89)
+#ifdef __STDC_VERSION__
+#error "C89 didn't have this macro!"
+#endif
+#elif defined(C99)
+_Static_assert(__STDC_VERSION__ == 199901L, "");
+#elif defined(C11)
+_Static_assert(__STDC_VERSION__ == 201112L, "");
+#elif defined(C17)
+_Static_assert(__STDC_VERSION__ == 201710L, "");
+#elif defined(C2X)
+/* FIXME: this value will change once WG14 picks the final value for C2x. */
+_Static_assert(__STDC_VERSION__ == 202000L, "");
+#else
+#error "unknown language standard version"
+#endif
+

diff  --git a/clang/test/C/drs/dr4xx.c b/clang/test/C/drs/dr4xx.c
index ab3407520f592..c1e55f5153d12 100644
--- a/clang/test/C/drs/dr4xx.c
+++ b/clang/test/C/drs/dr4xx.c
@@ -1,14 +1,102 @@
 /* RUN: %clang_cc1 -std=c89 -verify=expected,c89only -pedantic -Wno-c11-extensions %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
+   RUN: %clang_cc1 -std=c99 -verify=expected -pedantic -Wno-c11-extensions %s
+   RUN: %clang_cc1 -std=c11 -verify=expected -pedantic %s
+   RUN: %clang_cc1 -std=c17 -verify=expected -pedantic %s
+   RUN: %clang_cc1 -std=c2x -verify=expected -pedantic %s
  */
 
 /* The following are DRs which do not require tests to demonstrate
  * conformance or nonconformance.
+ *
+ * WG14 DR401: yes
+ * "happens before" can not be cyclic
+ *
+ * WG14 DR402: yes
+ * Memory model coherence is not aligned with C++11
+ *
+ * WG14 DR404: yes
+ * Joke fragment remains in a footnote
+ *
+ * WG14 DR406: yes
+ * Visible sequences of side effects are redundant
+ *
+ * WG14 DR415: yes
+ * Missing divide by zero entry in Annex J
+ *
+ * WG14 DR417: yes
+ * Annex J not updated with necessary aligned_alloc entries
+ *
+ * WG14 DR419: yes
+ * Generic Functions
+ *
+ * WG14 DR420: yes
+ * Sytax error in specification of for-statement
+ *
+ * WG14 DR425: yes
+ * No specification for the access to variables with temporary lifetime
+ *
+ * WG14 DR434: yes
+ * Possible defect report: Missing constraint w.r.t. Atomic
+ *
+ * WG14 DR435: yes
+ * Possible defect report: Missing constraint w.r.t. Imaginary
+ *
+ * WG14 DR436: yes
+ * Request for interpretation of C11 6.8.5#6
+ * Note: This is not really testable because it requires -O1 or higher for LLVM
+ * to perform its reachability analysis and -Wunreachable-code only verifies
+ * diagnostic behavior, not runtime behavior. Also, both are a matter of QoI as
+ * to what they optimize/diagnose. But if someone thinks of a way to test this,
+ * we can add a test case for it then.
  */
 
+/* WG14 DR412: yes
+ * #elif
+ *
+ * Note: this is testing that #elif behaves the same as #else followed by #if.
+ */
+#if 1
+#elif this is not a valid expression
+#else
+  #if this is not a valid expression
+  #endif
+#endif
+
+/* WG14 DR413: yes
+ * Initialization
+ */
+void dr413(void) {
+  typedef struct {
+    int k;
+    int l;
+    int a[2];
+  } T;
+
+  typedef struct {
+    int i;
+    T t;
+  } S;
+
+  /* Ensure that explicit initialization (.t = { ... }) takes precedence over a
+   * later implicit partial initialization (.t.l = 41). The value should be 42,
+   * not 0.
+   */
+  _Static_assert((S){ /* c89only-warning {{compound literals are a C99-specific feature}}
+                         expected-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}}
+                       */
+      1,
+      .t = {          /* c89only-warning {{designated initializers are a C99 feature}} */
+        .l = 43,      /* c89only-warning {{designated initializers are a C99 feature}}
+                         expected-note {{previous initialization is here}}
+                       */
+        .k = 42,
+        .a[1] = 19,   /* expected-note {{previous initialization is here}} */
+        .a[0] = 18
+      },
+      .t.l = 41,      /* expected-warning {{initializer overrides prior initialization of this subobject}} */
+      .t.a[1] = 17    /* expected-warning {{initializer overrides prior initialization of this subobject}} */
+    }.t.k == 42, "");
+}
 
 /* WG14 DR423: partial
  * Defect Report relative to n1570: underspecification for qualified rvalues
@@ -30,3 +118,47 @@ void dr423_func(void) {
   v2 = 100; /* Not an error; the qualifier was stripped. */
 }
 
+/* WG14 DR432: yes
+ * Possible defect report: Is 0.0 required to be a representable value?
+ *
+ * We're going to lean on the fpclassify builtin to tell us whether 0.0
+ * represents the value 0, and we'll test that adding and subtracting 0.0 does
+ * not change the value, and we'll hope that's enough to validate this DR.
+ */
+_Static_assert(__builtin_fpclassify(0, 1, 2, 3, 4, 0.0f) == 4, "");
+_Static_assert((1.0 / 3.0) + 0.0 == (1.0 / 3.0) - 0.0, ""); /* expected-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}} */
+
+/* WG14 DR444: partial
+ * Issues with alignment in C11, part 1
+ */
+void dr444(void) {
+  _Alignas(int) int i;
+   _Alignas(int) struct S {
+    _Alignas(int) int i;
+  } s;
+
+  /* FIXME: This should be accepted as per this DR. */
+  int j = (_Alignas(int) int){12}; /* expected-error {{expected expression}} */
+
+ /* FIXME: The diagnostic in this case is really bad; moving the specifier to
+  * where the diagnostic recommends causes a 
diff erent, more inscrutable error
+  * about anonymous structures.
+  */
+  _Alignas(int) struct T { /* expected-warning {{attribute '_Alignas' is ignored, place it after "struct" to apply attribute to type declaration}} */
+    int i;
+  };
+
+  struct U {
+    _Alignas(int) int bit : 1; /* expected-error {{'_Alignas' attribute cannot be applied to a bit-field}} */
+  };
+
+  _Alignas(int) typedef int foo;  /* expected-error {{'_Alignas' attribute only applies to variables and fields}} */
+  _Alignas(int) register int bar; /* expected-error {{'_Alignas' attribute cannot be applied to a variable with 'register' storage class}} */
+  _Alignas(int) void func(void);  /* expected-error {{'_Alignas' attribute only applies to variables and fields}} */
+
+  /* FIXME: it is correct for us to accept this per 6.7.3p5, but it seems like
+   * a situation we'd want to diagnose because the alignments are 
diff erent and
+   * the user probably doesn't know which one "wins".
+   */
+  _Alignas(int) _Alignas(double) int k;
+}

diff  --git a/clang/www/c_dr_status.html b/clang/www/c_dr_status.html
index 667e0f668f57d..b0a54cf0b934c 100644
--- a/clang/www/c_dr_status.html
+++ b/clang/www/c_dr_status.html
@@ -2042,13 +2042,13 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_401">401</a></td>
     <td>C11</td>
     <td>"happens before" can not be cyclic</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="402">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_402">402</a></td>
     <td>C11</td>
     <td>Memory model coherence is not aligned with C++11</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="403">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_403">403</a></td>
@@ -2072,7 +2072,7 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_406">406</a></td>
     <td>C11</td>
     <td>Visible sequences of side effects are redundant</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="407">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_407">407</a></td>
@@ -2101,20 +2101,20 @@ <h2 id="cdr">C defect report implementation status</h2>
   <tr id="411">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_411">411</a></td>
     <td>C11</td>
-    <td>#elif</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td>Predefined macro values</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="412">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_412">412</a></td>
     <td>C11</td>
     <td>#elif</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="413">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_413">413</a></td>
     <td>NAD</td>
     <td>Initialization</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="414">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_414">414</a></td>
@@ -2150,7 +2150,7 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_419">419</a></td>
     <td>C11</td>
     <td>Generic Functions</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="420">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_420">420</a></td>
@@ -2191,7 +2191,7 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_425">425</a></td>
     <td>NAD</td>
     <td>No specification for the access to variables with temporary lifetime</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="426">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_426">426</a></td>
@@ -2233,7 +2233,7 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_432">432</a></td>
     <td>C11</td>
     <td>Possible defect report: Is 0.0 required to be a representable value?</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="433">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_433">433</a></td>
@@ -2257,7 +2257,7 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_436">436</a></td>
     <td>C11</td>
     <td>Request for interpretation of C11 6.8.5#6</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="437">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_437">437</a></td>
@@ -2305,7 +2305,11 @@ <h2 id="cdr">C defect report implementation status</h2>
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_444">444</a></td>
     <td>C11</td>
     <td>Issues with alignment in C11, part 1</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="partial" align="center">
+      <details><summary>Partial</summary>
+      Clang rejects use of an alignment specifier in a compound literal expression.
+      </details>
+    </td>
   </tr>
   <tr id="445">
     <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_445">445</a></td>


        


More information about the cfe-commits mailing list