Remove workaround for Bazel C/C++ issue

https://github.com/bazelbuild/bazel/pull/23792 is available in Bazel
7.4.0 or later. [0] has long set a minimum Bazel version of Bazel 7 and,
as of [1], Envoy has since caught up. We should be able to rely on this
now, and
remove the workaround.

This doesn't enable parse_headers, but clears the Bazel blocker.

Update-Note: BoringSSL now requires Bazel 7.4.0 or later.

[0] https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md
[1] https://github.com/envoyproxy/envoy/pull/41209

Bug: 399387924
Change-Id: Icf2278d9fe8f0f38f353ce87dd227bd4bf0ac95c
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/76787
Commit-Queue: David Benjamin <davidben@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/BUILD.bazel b/BUILD.bazel
index b7dc359..c8c4b16 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -47,10 +47,8 @@
 
 package(
     default_applicable_licenses = [":license"],
-    # Disable the parse_headers feature. It does not work well in C right now.
-    # See https://github.com/bazelbuild/bazel/issues/23460 for details. When
-    # that is fixed, if enabled, we likely also need to rename some headers to
-    # .inc per
+    # TODO(crbug.com/399387924): Enable parse_headers feature. Not all of our
+    # headers are self-contained. We may need to rename or fix some of them per
     # https://google.github.io/styleguide/cppguide.html#Self_contained_Headers
     features = ["-parse_headers"],
 )
diff --git a/util/util.bzl b/util/util.bzl
index 35c14a2..6b5b750 100644
--- a/util/util.bzl
+++ b/util/util.bzl
@@ -33,18 +33,18 @@
     "-fno-strict-aliasing",
 ]
 
-gcc_copts_cxx = [
+gcc_cxxopts = [
     "-Wmissing-declarations",
     "-Wnon-virtual-dtor",
 ]
 
-gcc_copts_c = [
+gcc_conlyopts = [
     "-Wmissing-prototypes",
     "-Wold-style-definition",
     "-Wstrict-prototypes",
 ]
 
-boringssl_copts_common = select({
+boringssl_copts = select({
     # This condition and the asm_srcs_used one below must be kept in sync.
     "@platforms//os:windows": ["-DOPENSSL_NO_ASM"],
     "//conditions:default": [],
@@ -72,18 +72,18 @@
 # We do not specify the C++ version here because Bazel expects C++ version
 # to come from the top-level toolchain. The concern is that different C++
 # versions may cause ABIs, notably Abseil's, to change.
-boringssl_copts_cxx = boringssl_copts_common + select({
+boringssl_cxxopts = select({
     "@platforms//os:windows": [],
-    "//conditions:default": gcc_copts_cxx,
+    "//conditions:default": gcc_cxxopts,
 })
 
 # We specify the C version because Bazel projects often do not remember to
 # specify the C version. We do not expect ABIs to vary by C versions, at least
 # for our code or the headers we include, so configure the C version inside the
 # library. If Bazel's C/C++ version handling improves, we may reconsider this.
-boringssl_copts_c = boringssl_copts_common + select({
+boringssl_conlyopts = select({
     "@platforms//os:windows": ["/std:c11"],
-    "//conditions:default": ["-std=c11"] + gcc_copts_c,
+    "//conditions:default": ["-std=c11"] + gcc_conlyopts,
 })
 
 def linkstatic_kwargs(linkstatic):
@@ -96,59 +96,6 @@
         kwargs["linkstatic"] = linkstatic
     return kwargs
 
-def handle_mixed_c_cxx(
-        name,
-        copts,
-        deps,
-        internal_hdrs,
-        includes,
-        linkopts,
-        linkstatic,
-        srcs,
-        testonly,
-        alwayslink):
-    """
-    Works around https://github.com/bazelbuild/bazel/issues/22041. Determines
-    whether a target contains C, C++, or both. If the target is multi-language,
-    the C sources are split into a separate library. Returns a tuple of updated
-    (copts, deps, srcs) to apply.
-    """
-    has_c, has_cxx = False, False
-    for src in srcs:
-        if src.endswith(".c"):
-            has_c = True
-        elif src.endswith(".cc"):
-            has_cxx = True
-
-    # If a target has both C and C++, we need to split it in two.
-    if has_c and has_cxx:
-        # Pull the C++ files out.
-        srcs_cxx = [src for src in srcs if src.endswith(".cc") or src.endswith(".h")]
-        name_cxx = name + "_cxx"
-        cc_library(
-            name = name_cxx,
-            srcs = srcs_cxx + internal_hdrs,
-            copts = copts + boringssl_copts_cxx,
-            includes = includes,
-            linkopts = linkopts,
-            deps = deps,
-            testonly = testonly,
-            alwayslink = alwayslink,
-            **linkstatic_kwargs(linkstatic)
-        )
-
-        # Build the remainder as a C-only target.
-        deps = deps + [":" + name_cxx]
-        srcs = [src for src in srcs if not src.endswith(".cc")]
-        has_cxx = False
-
-    if has_c:
-        copts = copts + boringssl_copts_c
-    else:
-        copts = copts + boringssl_copts_cxx
-
-    return copts, deps, srcs
-
 def handle_asm_srcs(asm_srcs):
     if not asm_srcs:
         return []
@@ -194,26 +141,6 @@
         testonly = False,
         alwayslink = False,
         visibility = []):
-    copts, deps, srcs = handle_mixed_c_cxx(
-        name = name,
-        copts = copts,
-        deps = deps,
-        internal_hdrs = hdrs + internal_hdrs,
-        includes = includes,
-        linkopts = linkopts,
-        # Ideally we would set linkstatic = True to statically link the helper
-        # library into main cc_library. But Bazel interprets linkstatic such
-        # that, if A(test, linkshared) -> B(library) -> C(library, linkstatic),
-        # C will be statically linked into A, not B. This is probably to avoid
-        # diamond dependency problems but means linkstatic does not help us make
-        # this function transparent. Instead, just pass along the linkstatic
-        # nature of the main library.
-        linkstatic = linkstatic,
-        srcs = srcs,
-        testonly = testonly,
-        alwayslink = alwayslink,
-    )
-
     # BoringSSL's notion of internal headers are slightly different from
     # Bazel's. libcrypto's internal headers may be used by libssl, but they
     # cannot be used outside the library. To express this, we make separate
@@ -226,7 +153,9 @@
         name = name_internal,
         srcs = srcs + handle_asm_srcs(asm_srcs),
         hdrs = hdrs + internal_hdrs,
-        copts = copts,
+        copts = copts + boringssl_copts,
+        conlyopts = boringssl_conlyopts,
+        cxxopts = boringssl_cxxopts,
         includes = includes,
         linkopts = linkopts,
         deps = deps,
@@ -254,28 +183,12 @@
         deps = [],
         testonly = False,
         visibility = []):
-    copts, deps, srcs = handle_mixed_c_cxx(
-        name = name,
-        copts = copts,
-        deps = deps,
-        internal_hdrs = [],
-        includes = includes,
-        # If it weren't for https://github.com/bazelbuild/bazel/issues/22041,
-        # the split library be part of `srcs` and linked statically. Set
-        # linkstatic to match.
-        linkstatic = True,
-        linkopts = linkopts,
-        srcs = srcs,
-        testonly = testonly,
-        # TODO(davidben): Should this be alwayslink = True? How does Bazel treat
-        # the real cc_binary.srcs?
-        alwayslink = False,
-    )
-
     cc_binary(
         name = name,
         srcs = srcs + handle_asm_srcs(asm_srcs),
-        copts = copts,
+        copts = copts + boringssl_copts,
+        conlyopts = boringssl_conlyopts,
+        cxxopts = boringssl_cxxopts,
         includes = includes,
         linkopts = linkopts,
         deps = deps,
@@ -296,30 +209,14 @@
         linkstatic = None,
         deps = [],
         shard_count = None):
-    copts, deps, srcs = handle_mixed_c_cxx(
-        name = name,
-        copts = copts,
-        deps = deps,
-        internal_hdrs = [],
-        includes = includes,
-        # If it weren't for https://github.com/bazelbuild/bazel/issues/22041,
-        # the split library be part of `srcs` and linked statically. Set
-        # linkstatic to match.
-        linkstatic = True,
-        linkopts = linkopts,
-        srcs = srcs,
-        testonly = True,
-        # If any sources get extracted, they must always be linked, otherwise
-        # tests will be dropped.
-        alwayslink = True,
-    )
-
     cc_test(
         name = name,
         data = data,
         deps = deps,
         srcs = srcs + handle_asm_srcs(asm_srcs),
-        copts = copts,
+        copts = copts + boringssl_copts,
+        conlyopts = boringssl_conlyopts,
+        cxxopts = boringssl_cxxopts,
         includes = includes,
         linkopts = linkopts,
         shard_count = shard_count,