[6.2][cxx-interop] Fix duplicate symbol error with default arguments

Explanation: We synthesize a Swift function that only calls a C++ funtion that produces the default argument. We produce this function for each module that imports the C++ function with the default argument. This symbol needs to be public as it is created in the context of the Clang module and used from the Swift module. To avoid the linker errors, we always emit this function into the client which is also the right thing to do as the whole body is a single function call.
Issues: rdar://160182651
Original PRs: #82333
Risk: Low, this is merged to main in early July and no one complained
yet. And the change is straightforward.
Testing: Added a compiler test.
Reviewers: @egorzhdan
This commit is contained in:
Gábor Horváth
2025-07-01 13:50:00 +02:00
committed by Gabor Horvath
parent 90ee0973f5
commit 67bc46d0d0
3 changed files with 55 additions and 0 deletions

View File

@@ -12,6 +12,7 @@
#include "SwiftDeclSynthesizer.h"
#include "swift/AST/ASTMangler.h"
#include "swift/AST/Attr.h"
#include "swift/AST/AttrKind.h"
#include "swift/AST/Builtins.h"
#include "swift/AST/Decl.h"
@@ -2522,6 +2523,8 @@ SwiftDeclSynthesizer::makeDefaultArgument(const clang::ParmVarDecl *param,
ImporterImpl.ImportedHeaderUnit);
funcDecl->setBodySynthesizer(synthesizeDefaultArgumentBody, (void *)param);
funcDecl->setAccess(AccessLevel::Public);
funcDecl->getAttrs().add(new (ctx)
AlwaysEmitIntoClientAttr(/*IsImplicit=*/true));
ImporterImpl.defaultArgGenerators[param] = funcDecl;