Use extern "C++" scopes for explicit specializations after P2615R1 Meaningful Exports
#6074
+17
−9
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
WG21-P2615R1 Meaningful Exports forbids
extern "C++"from being directly applied to an explicit specialization. Now, every declaration is either a name-declaration or a special-declaration. An explicit-specialization is considered a special-declaration. But when directly applyingextern "C++", the grammar for linkage-specialization requires that theexternstring-literal name-declaration syntax cannot accept a special-declaration.Clang 17 implemented P2615R1 as a DR in C++20 mode, but as of Clang 20 they don't enforce this rule (yet?). @xiangfan-ms brought this to my attention as he was implementing P2615R1 in MSVC.
The fix is simple: use
extern "C++" { ... }scopes.I am allowing the
_Codecvt_guardhelper to permanently remain in this scope, as it's not harmful, and I didn't think it was worth the effort to pull outside of the scope. (Indeed, right now the entire STL is marked withextern "C++"as a workaround.)