Skip to content

Conversation

AaronBallman
Copy link
Collaborator

This paper was ensuring that the left operand of . and -> must be a complete object type. This has always been required in every version of Clang.

This paper was ensuring that the left operand of . and -> must be a
complete object type. This has always been required in every version of
Clang.
@AaronBallman AaronBallman added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" c2y labels Oct 9, 2025
@llvmbot
Copy link
Member

llvmbot commented Oct 9, 2025

@llvm/pr-subscribers-clang

Author: Aaron Ballman (AaronBallman)

Changes

This paper was ensuring that the left operand of . and -> must be a complete object type. This has always been required in every version of Clang.


Full diff: https://github.com/llvm/llvm-project/pull/162718.diff

2 Files Affected:

  • (added) clang/test/C/C2y/n3532.c (+53)
  • (modified) clang/www/c_status.html (+1-1)
diff --git a/clang/test/C/C2y/n3532.c b/clang/test/C/C2y/n3532.c
new file mode 100644
index 0000000000000..c481b58ba7d90
--- /dev/null
+++ b/clang/test/C/C2y/n3532.c
@@ -0,0 +1,53 @@
+// RUN: %clang_cc1 -verify -std=c2y %s
+// RUN: %clang_cc1 -verify -std=c23 %s
+// RUN: %clang_cc1 -verify -std=c17 %s
+// RUN: %clang_cc1 -verify -std=c11 %s
+// RUN: %clang_cc1 -verify -std=c99 %s
+// RUN: %clang_cc1 -verify -std=c89 %s
+
+/* WG14 N3532: Yes
+ * Member access of an incomplete object
+ *
+ * Verify that the first operand to the . or -> operators is a complete object
+ * type.
+ */
+
+struct S {
+  int i;
+};
+
+union U {
+  int i;
+};
+
+void good_test(void) {
+  struct S s;
+  struct S *s_ptr = &s;
+  union U u;
+  union U *u_ptr = &u;
+
+  // Complete object type, correctly named member.
+  s.i = 10;
+  s_ptr->i = 10;
+  u.i = 10;
+  u_ptr->i = 10;
+}
+
+void bad_test(void) {
+  struct Incomplete *s_ptr;    /* expected-note 2 {{forward declaration of 'struct Incomplete'}} */
+  union AlsoIncomplete *u_ptr; /* expected-note 2 {{forward declaration of 'union AlsoIncomplete'}} */
+  struct S s;
+  union U u;
+
+  // Incomplete object type.
+  s_ptr->i = 10; /* expected-error {{incomplete definition of type 'struct Incomplete'}} */
+  u_ptr->i = 10; /* expected-error {{incomplete definition of type 'union AlsoIncomplete'}} */
+
+  (*s_ptr).i = 10; /* expected-error {{incomplete definition of type 'struct Incomplete'}} */
+  (*u_ptr).i = 10; /* expected-error {{incomplete definition of type 'union AlsoIncomplete'}} */
+
+  // Complete object type, no named member.
+  s.f = "test"; /* expected-error {{no member named 'f' in 'struct S'}} */
+  u.f = "test"; /* expected-error {{no member named 'f' in 'union U'}} */
+}
+
diff --git a/clang/www/c_status.html b/clang/www/c_status.html
index 380f66495a367..1a5fa4bbda3dc 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -359,7 +359,7 @@ <h2 id="c2y">C2y implementation status</h2>
     <tr>
       <td>Member access of an incomplete object</td>
       <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3532.pdf">N3532</a></td>
-      <td class="unknown" align="center">Unknown</td>
+      <td class="full" align="center">Yes</td>
 	</tr>
     <tr>
       <td>Representation of Pointers and nullptr_t</td>

@AaronBallman AaronBallman merged commit 80f48b8 into llvm:main Oct 10, 2025
13 checks passed
@AaronBallman AaronBallman deleted the aballman-wg14-n3532 branch October 10, 2025 11:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c2y clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants