Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions clang/test/C/C2y/n3348.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// RUN: %clang_cc1 -verify -std=c2y -Wall -pedantic %s

/* WG14 N3348: No
* Matching of Multi-Dimensional Arrays in Generic Selection Expressions
*
* This allows use of * in a _Generic association as a placeholder for any size
* value.
*
* FIXME: Clang doesn't yet implement this paper. When we do implement it, we
* should expose the functionality in earlier language modes (C89) for
* compatibility with GCC.
*/

void test(int n, int m) {
static_assert(1 == _Generic(int[3][2], int[3][*]: 1, int[2][*]: 0)); /* expected-error {{star modifier used outside of function prototype}}
expected-error {{array has incomplete element type 'int[]'}}
*/
static_assert(1 == _Generic(int[3][2], int[*][2]: 1, int[*][3]: 0)); // expected-error {{star modifier used outside of function prototype}}
static_assert(1 == _Generic(int[3][n], int[3][*]: 1, int[2][*]: 0)); /* expected-error {{star modifier used outside of function prototype}}
expected-error {{array has incomplete element type 'int[]'}}
*/
static_assert(1 == _Generic(int[n][m], int[*][*]: 1, char[*][*]: 0)); /* expected-error 2 {{star modifier used outside of function prototype}}
expected-error {{array has incomplete element type 'int[]'}}
*/
static_assert(1 == _Generic(int(*)[2], int(*)[*]: 1)); // expected-error {{star modifier used outside of function prototype}}
}

void questionable() {
// GCC accepts this despite the * appearing outside of a generic association,
// but it's not clear whether that's intentionally supported or an oversight.
// It gives a warning about * being used outside of a declaration, but not
// with an associated warning group.
static_assert(1 == _Generic(int[*][*], int[2][100]: 1)); /* expected-error 2 {{star modifier used outside of function prototype}}
expected-error {{array has incomplete element type 'int[]'}}
*/
// GCC claims this matches multiple associations, so the functionality seems
// like it may be intended to work?
(void)_Generic(int[*][*], /* expected-error 2 {{star modifier used outside of function prototype}}
expected-error {{array has incomplete element type 'int[]'}}
*/
int[2][100]: 1,
int[3][1000]: 2,
);
}
2 changes: 1 addition & 1 deletion clang/www/c_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ <h2 id="c2y">C2y implementation status</h2>
<tr>
<td>Matching of Multi-Dimensional Arrays in Generic Selection Expressions</td>
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3348.pdf">N3348</a></td>
<td class="unknown" align="center">Unknown</td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td>The __COUNTER__ predefined macro</td>
Expand Down