aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <josmyers@redhat.com>2024-06-17 19:45:43 +0000
committerJoseph Myers <josmyers@redhat.com>2024-06-17 19:45:43 +0000
commitedf514f83fa41012e52aaef2faef5a649e4b3f6d (patch)
tree9bbfe742a84e6b96e8d08b2af3404550b0b0a7be /gcc
parentb63c7d92012f92e0517190cf263d29bbef8a06bf (diff)
downloadgcc-edf514f83fa41012e52aaef2faef5a649e4b3f6d.zip
gcc-edf514f83fa41012e52aaef2faef5a649e4b3f6d.tar.gz
gcc-edf514f83fa41012e52aaef2faef5a649e4b3f6d.tar.bz2
c: Implement C2Y alignof on incomplete arrays
C2Y has adopted support for alignof applied to incomplete array types (N3273). Add this support to GCC. As the relevant checks are in c-family code that doesn't have access to functions such as pedwarn_c23, this remains a hard error for older versions and isn't handled by -Wc23-c2y-compat, although preferably it would work like pedwarn_c23 (pedwarn-if-pedantic for older versions, warning with -Wc23-c2y-compat in C2Y mode). Bootstrapped with no regressions for x86_64-pc-linux-gnu. gcc/c-family/ * c-common.cc (c_sizeof_or_alignof_type): Allow alignof on an incomplete array type for C2Y. gcc/testsuite/ * gcc.dg/c23-align-10.c, gcc.dg/c2y-align-1.c, gcc.dg/c2y-align-2.c: New tests.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-common.cc4
-rw-r--r--gcc/testsuite/gcc.dg/c23-align-10.c6
-rw-r--r--gcc/testsuite/gcc.dg/c2y-align-1.c6
-rw-r--r--gcc/testsuite/gcc.dg/c2y-align-2.c8
4 files changed, 23 insertions, 1 deletions
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 24335de..7d752ac 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -3972,7 +3972,9 @@ c_sizeof_or_alignof_type (location_t loc,
value = size_one_node;
}
else if (!COMPLETE_TYPE_P (type)
- && (!c_dialect_cxx () || is_sizeof || type_code != ARRAY_TYPE))
+ && ((!c_dialect_cxx () && !flag_isoc2y)
+ || is_sizeof
+ || type_code != ARRAY_TYPE))
{
if (complain)
error_at (loc, "invalid application of %qs to incomplete type %qT",
diff --git a/gcc/testsuite/gcc.dg/c23-align-10.c b/gcc/testsuite/gcc.dg/c23-align-10.c
new file mode 100644
index 0000000..bd6b9c2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-align-10.c
@@ -0,0 +1,6 @@
+/* Test C2Y alignof on an incomplete array type: not allowed in C23. */
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+
+int a = alignof(int[]); /* { dg-error "incomplete" } */
+int b = alignof(int[][1]); /* { dg-error "incomplete" } */
diff --git a/gcc/testsuite/gcc.dg/c2y-align-1.c b/gcc/testsuite/gcc.dg/c2y-align-1.c
new file mode 100644
index 0000000..3f9ab18
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-align-1.c
@@ -0,0 +1,6 @@
+/* Test C2Y alignof on an incomplete array type. */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -pedantic-errors" } */
+
+int a = alignof(int[]);
+int b = alignof(int[][1]);
diff --git a/gcc/testsuite/gcc.dg/c2y-align-2.c b/gcc/testsuite/gcc.dg/c2y-align-2.c
new file mode 100644
index 0000000..b7b8715
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-align-2.c
@@ -0,0 +1,8 @@
+/* Test C2Y alignof on an incomplete array type: still not allowed for other
+ incomplete types. */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -pedantic-errors" } */
+
+int a = alignof(void); /* { dg-error "void" } */
+struct s;
+int b = alignof(struct s); /* { dg-error "incomplete" } */