Skip to content

Fix StringRef build failure with newer libc++#8307

Open
tsukinoko-kun wants to merge 1 commit intomicrosoft:mainfrom
tsukinoko-kun:fix/macos-sdk
Open

Fix StringRef build failure with newer libc++#8307
tsukinoko-kun wants to merge 1 commit intomicrosoft:mainfrom
tsukinoko-kun:fix/macos-sdk

Conversation

@tsukinoko-kun
Copy link
Copy Markdown

Fixes #8306.

Summary

Building DXC with newer Apple toolchains fails in include/llvm/ADT/StringRef.h because libc++ now rejects user specializations of certain standard library traits. DXC currently specializes:

  • std::is_nothrow_constructible<std::string, llvm::StringRef>
  • std::is_nothrow_constructible<std::string, llvm::StringRef &>
  • std::is_nothrow_constructible<std::string, const llvm::StringRef &>
    On Xcode 26.4 / Apple clang 21 / libc++, that now produces an error like:

is_nothrow_constructible cannot be specialized: Users are not allowed to specialize this standard library entity

What this changes

This patch keeps the existing HLSL workaround for non-libc++ standard libraries, but disables those std::is_nothrow_constructible specializations when building against libc++:

#if !defined(_LIBCPP_VERSION)
...
#endif

Why this fixes the issue
The failure is caused by the specializations themselves, not by any runtime behavior in StringRef.
For libc++:

  • the specializations are now ill-formed and rejected at parse time
  • libc++ already computes std::is_nothrow_constructible<std::string, llvm::StringRef> correctly without the workaround
    So the fix is to stop declaring the forbidden specialization on libc++, while preserving the existing behavior everywhere else.
    Why I chose this approach
    I looked at the HLSL-specific block in StringRef.h and tested the current Apple libc++ behavior directly. Without the manual specialization, libc++ still reports the relevant is_nothrow_constructible cases as false, which matches the intent of the original workaround.
    That made this the narrowest safe fix:
  • it resolves the Xcode/libc++ build break in DirectXShaderCompiler vendored in SDL_shadercross fails to build with Xcode 26.4 / Apple clang 21 on macOS #8306
  • it does not change runtime code generation or ABI
  • it preserves the original workaround for non-libc++ environments where it may still be needed
    Validation
    I verified:
  • the original header fails to compile with current Xcode/libc++
  • after this change, the header compiles cleanly
  • on libc++, the relevant std::is_nothrow_constructible instantiations still evaluate to false

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 27, 2026

✅ With the latest revision this PR passed the C/C++ code formatter.

@pow2clk
Copy link
Copy Markdown
Collaborator

pow2clk commented Mar 30, 2026

@damyannp I agree with the argument made in #8303 that the static asserts ensure that, on all currently supported compilers, the static asserts verify that this explicit manipulation isn't required anymore. I tested my own fix very similar to that approach on VS 2017 and others and found no issues. Maybe @tex3d remembers the history here.

That said, at this point, the compiler will not build on macos, so this or something similar really needs to go in. I have my own fix with a couple new mac compiler warnings fixed too here if you're interested pow2clk@ea596b1

@bogner
Copy link
Copy Markdown
Collaborator

bogner commented Mar 30, 2026

Do we need to keep the workaround for non-libc++ standard libraries? The comments in #8303 strongly suggest we can just remove this completely.

@damyanp
Copy link
Copy Markdown
Member

damyanp commented Mar 31, 2026

Do we need to keep the workaround for non-libc++ standard libraries? The comments in #8303 strongly suggest we can just remove this completely.

Maybe the test added in minchopaskal@9903286#diff-2f6bf948cfb0de9574a698d2a6fc79359d333c73fb62a9d357ace4bc2d86a4c3 would be enough to give us confidence?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: New

Development

Successfully merging this pull request may close these issues.

DirectXShaderCompiler vendored in SDL_shadercross fails to build with Xcode 26.4 / Apple clang 21 on macOS

4 participants