Mark no_unique_address field accessors as experimental.

We don't really know how these should look yet, so, yeet.

PiperOrigin-RevId: 604499324
Change-Id: I175d888595b03b5094fca8ae8a339aa299d55917
diff --git a/bazel/llvm.bzl b/bazel/llvm.bzl
index 86c05e8..b0d12c8 100644
--- a/bazel/llvm.bzl
+++ b/bazel/llvm.bzl
@@ -53,7 +53,7 @@
             executable = False,
         )
 
-LLVM_COMMIT_SHA = "cca9f9b78fc657c280f7e4024a552af43a315bdb"
+LLVM_COMMIT_SHA = "0f8680b9d87fa9e8839bd8e39ce605d64148ace6"
 
 def llvm_loader_repository_dependencies():
     # This *declares* the dependency, but it won't actually be *downloaded* unless it's used.
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 563069e..ce9e48b 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -2362,7 +2362,6 @@
         forward_declare::unsafe_define!(forward_declare::symbol!(#fully_qualified_cc_name), #qualified_ident);
     };
 
-    let no_unique_address_accessors = cc_struct_no_unique_address_impl(db, record)?;
     let mut record_generated_items = record
         .child_item_ids
         .iter()
@@ -2383,6 +2382,11 @@
     if crubit_features.contains(ir::CrubitFeature::Experimental) {
         record_generated_items.push(cc_struct_upcast_impl(record, &ir)?);
     }
+    let no_unique_address_accessors = if crubit_features.contains(ir::CrubitFeature::Experimental) {
+        cc_struct_no_unique_address_impl(db, record)?
+    } else {
+        quote! {}
+    };
 
     let mut items = vec![];
     let mut thunks_from_record_items = vec![];
@@ -9011,6 +9015,31 @@
         Ok(())
     }
 
+    #[test]
+    fn test_extern_c_no_unique_address_field() -> Result<()> {
+        let mut ir = ir_from_cc(
+            r#"
+            struct Struct final {
+                [[no_unique_address]] char field;
+            };
+        "#,
+        )?;
+        *ir.target_crubit_features_mut(&ir.current_target().clone()) =
+            ir::CrubitFeature::ExternC.into();
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
+        assert_rs_matches!(
+            rs_api,
+            quote! {
+                pub struct Struct {
+                    ...
+                    pub(crate) field: [::core::mem::MaybeUninit<u8>; 1],
+                }
+            }
+        );
+        assert_rs_not_matches!(rs_api, quote! {pub fn field});
+        Ok(())
+    }
+
     /// The default crubit feature set currently doesn't include extern_c.
     #[test]
     fn test_default_crubit_features_disabled_extern_c() -> Result<()> {