Skip to content

Commit f157e71

Browse files
committed
[cxx-interop] Honor default expressions for unnamed arguments
We stumbled upon an old workaround that disabled the synthesis of Swift default expressions for C++ function parameters that don't have a name. This change removes the workaround. rdar://162310543
1 parent 3ce1d11 commit f157e71

File tree

5 files changed

+15
-4
lines changed

5 files changed

+15
-4
lines changed

lib/ClangImporter/SwiftDeclSynthesizer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,10 +2549,6 @@ SwiftDeclSynthesizer::makeDefaultArgument(const clang::ParmVarDecl *param,
25492549
const swift::Type &swiftParamTy,
25502550
SourceLoc paramLoc) {
25512551
assert(param->hasDefaultArg() && "must have a C++ default argument");
2552-
if (!param->getIdentifier())
2553-
// Work around an assertion failure in CXXNameMangler::mangleUnqualifiedName
2554-
// when mangling std::__fs::filesystem::path::format.
2555-
return nullptr;
25562552

25572553
ASTContext &ctx = ImporterImpl.SwiftContext;
25582554
clang::ASTContext &clangCtx = param->getASTContext();

test/Interop/Cxx/function/Inputs/default-arguments.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ inline int ambiguous(int a) { return a; }
126126
inline int nonTrailing(int a, int b = 2) { return a + b; }
127127
inline int nonTrailing(int a = 1, int b);
128128

129+
inline int takesUnnamedParam(int = 123) { return 456; }
130+
129131
// MARK: - Un-instantiatable default expressions
130132

131133
class NoDefinition;

test/Interop/Cxx/function/default-arguments-module-interface.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666

6767
// CHECK: func nonTrailing(_ a: Int32 = cxxDefaultArg, _ b: Int32 = cxxDefaultArg) -> Int32
6868

69+
// CHECK: func takesUnnamedParam(_: Int32 = cxxDefaultArg) -> Int32
70+
6971
// CHECK: struct InvalidStruct<NoDefinition> {
7072
// CHECK: func invalidDefaultExprMethod(_ x: Base<NoDefinition>)
7173
// CHECK: }

test/Interop/Cxx/function/default-arguments-typechecker.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,6 @@ let _ = ambiguous(1, 2)
7171
let _ = nonTrailing()
7272
let _ = nonTrailing(1)
7373
let _ = nonTrailing(1, 2)
74+
75+
let _ = takesUnnamedParam()
76+
let _ = takesUnnamedParam(789)

test/Interop/Cxx/function/default-arguments.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ DefaultArgTestSuite.test("func with non-trailing argument") {
6666
expectEqual(11, t1)
6767
}
6868

69+
DefaultArgTestSuite.test("func with unnamed argument") {
70+
let t0 = takesUnnamedParam()
71+
expectEqual(456, t0)
72+
73+
let t1 = takesUnnamedParam(321)
74+
expectEqual(456, t1)
75+
}
76+
6977
DefaultArgTestSuite.test("method with integer parameter") {
7078
let s = HasMethodWithDefaultArg()
7179
let z0 = s.isZero()

0 commit comments

Comments
 (0)