Merge pull request #10200 from slavapestov/default-args-tweak
Don't emit some unnecessary kinds of default argument generators
diff --git a/lib/SILGen/SILGen.cpp b/lib/SILGen/SILGen.cpp
index 66db8bd..5a5ea2a 100644
--- a/lib/SILGen/SILGen.cpp
+++ b/lib/SILGen/SILGen.cpp
@@ -916,15 +916,33 @@
}
}
-void SILGenModule::emitDefaultArgGenerator(SILDeclRef constant, Expr *arg) {
+void SILGenModule::emitDefaultArgGenerator(SILDeclRef constant, Expr *arg,
+ DefaultArgumentKind kind) {
+ switch (kind) {
+ case DefaultArgumentKind::None:
+ llvm_unreachable("No default argument here?");
+
+ case DefaultArgumentKind::Normal:
+ break;
+
+ case DefaultArgumentKind::Inherited:
+ return;
+
+ case DefaultArgumentKind::Column:
+ case DefaultArgumentKind::File:
+ case DefaultArgumentKind::Line:
+ case DefaultArgumentKind::Function:
+ case DefaultArgumentKind::DSOHandle:
+ case DefaultArgumentKind::Nil:
+ case DefaultArgumentKind::EmptyArray:
+ case DefaultArgumentKind::EmptyDictionary:
+ return;
+ }
+
emitOrDelayFunction(*this, constant, [this,constant,arg](SILFunction *f) {
preEmitFunction(constant, arg, f, arg);
PrettyStackTraceSILFunction X("silgen emitDefaultArgGenerator ", f);
SILGenFunction SGF(*this, *f);
- // Override location for #file, #line etc. to an invalid one so that we
- // don't put extra strings into the default argument generator function that
- // is not going to be ever used anyway.
- SGF.overrideLocationForMagicIdentifiers = SourceLoc();
SGF.emitGeneratorFunction(constant, arg);
postEmitFunction(constant, f);
});
@@ -1004,7 +1022,7 @@
for (auto param : *paramList) {
if (auto defaultArg = param->getDefaultValue())
emitDefaultArgGenerator(SILDeclRef::getDefaultArgGenerator(decl, index),
- defaultArg);
+ defaultArg, param->getDefaultArgumentKind());
++index;
}
}
diff --git a/lib/SILGen/SILGen.h b/lib/SILGen/SILGen.h
index 3dab57f..b7d6d4e 100644
--- a/lib/SILGen/SILGen.h
+++ b/lib/SILGen/SILGen.h
@@ -264,7 +264,8 @@
void emitEnumConstructor(EnumElementDecl *decl);
/// Emits the default argument generator with the given expression.
- void emitDefaultArgGenerator(SILDeclRef constant, Expr *arg);
+ void emitDefaultArgGenerator(SILDeclRef constant, Expr *arg,
+ DefaultArgumentKind kind);
/// Emits the stored property initializer for the given pattern.
void emitStoredPropertyInitialization(PatternBindingDecl *pd, unsigned i);
diff --git a/lib/SILGen/SILGenApply.cpp b/lib/SILGen/SILGenApply.cpp
index a79cf6a..80956bb 100644
--- a/lib/SILGen/SILGenApply.cpp
+++ b/lib/SILGen/SILGenApply.cpp
@@ -4758,14 +4758,7 @@
init = stringLiteral->getInitializer();
} else {
ASTContext &ctx = getASTContext();
- SourceLoc loc;
-
- // If "overrideLocationForMagicIdentifiers" is set, then we use it as the
- // location point for these magic identifiers.
- if (overrideLocationForMagicIdentifiers)
- loc = overrideLocationForMagicIdentifiers.getValue();
- else
- loc = literal->getStartLoc();
+ SourceLoc loc = literal->getStartLoc();
auto magicLiteral = cast<MagicIdentifierLiteralExpr>(literal);
switch (magicLiteral->getKind()) {
diff --git a/lib/SILGen/SILGenExpr.cpp b/lib/SILGen/SILGenExpr.cpp
index e5f0598..e627745 100644
--- a/lib/SILGen/SILGenExpr.cpp
+++ b/lib/SILGen/SILGenExpr.cpp
@@ -2933,14 +2933,7 @@
visitMagicIdentifierLiteralExpr(MagicIdentifierLiteralExpr *E, SGFContext C) {
ASTContext &Ctx = SGF.getASTContext();
SILType Ty = SGF.getLoweredLoadableType(E->getType());
- SourceLoc Loc;
-
- // If "overrideLocationForMagicIdentifiers" is set, then we use it as the
- // location point for these magic identifiers.
- if (SGF.overrideLocationForMagicIdentifiers)
- Loc = SGF.overrideLocationForMagicIdentifiers.getValue();
- else
- Loc = E->getStartLoc();
+ SourceLoc Loc = E->getStartLoc();
switch (E->getKind()) {
case MagicIdentifierLiteralExpr::File:
diff --git a/lib/SILGen/SILGenFunction.h b/lib/SILGen/SILGenFunction.h
index c477eb9..ef39b34 100644
--- a/lib/SILGen/SILGenFunction.h
+++ b/lib/SILGen/SILGenFunction.h
@@ -470,12 +470,6 @@
/// function is valid.
bool allowsVoidReturn() const { return ReturnDest.getBlock()->args_empty(); }
- /// This location, when set, is used as an override location for magic
- /// identifier expansion (e.g. #file). This allows default argument
- /// expansion to report the location of the call, instead of the location
- /// of the original expr.
- Optional<SourceLoc> overrideLocationForMagicIdentifiers;
-
/// Emit code to increment a counter for profiling.
void emitProfilerIncrement(ASTNode N) {
if (SGM.Profiler && SGM.Profiler->hasRegionCounters())
diff --git a/test/SILGen/default_arguments.swift b/test/SILGen/default_arguments.swift
index d045faa..0c144ef 100644
--- a/test/SILGen/default_arguments.swift
+++ b/test/SILGen/default_arguments.swift
@@ -1,4 +1,5 @@
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -emit-silgen %s | %FileCheck %s
+// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -emit-silgen %s | %FileCheck %s --check-prefix=NEGATIVE
// __FUNCTION__ used as top-level parameter produces the module name.
// CHECK-LABEL: sil @main
@@ -74,17 +75,13 @@
// Check that default argument generator functions don't leak information about
// user's source.
//
-// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA_
-// CHECK: string_literal utf16 ""
+// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA_
//
-// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA0_
-// CHECK: string_literal utf16 ""
+// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA0_
//
-// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA1_
-// CHECK: integer_literal $Builtin.Int2048, 0
+// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA1_
//
-// CHECK-LABEL: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA2_
-// CHECK: integer_literal $Builtin.Int2048, 0
+// NEGATIVE-NOT: sil hidden @_T017default_arguments17testMagicLiteralsySS4file_SS8functionSi4lineSi6columntFfA2_
func closure(_: () -> ()) {}
func autoclosure(_: @autoclosure () -> ()) {}
diff --git a/test/SILGen/dso_handle.swift b/test/SILGen/dso_handle.swift
index 37b7340..cf8e7b4 100644
--- a/test/SILGen/dso_handle.swift
+++ b/test/SILGen/dso_handle.swift
@@ -8,16 +8,9 @@
// CHECK-NEXT: [[DSOPtr:%[0-9]+]] = address_to_pointer [[DSOAddr]] : $*Builtin.RawPointer to $Builtin.RawPointer
// CHECK-NEXT: [[DSOPtrStruct:[0-9]+]] = struct $UnsafeRawPointer ([[DSOPtr]] : $Builtin.RawPointer)
-
-// CHECK-LABEL: sil hidden @_T010dso_handle14printDSOHandleS2V0A0_tFfA_
-// CHECK: [[DSOAddr:%[0-9]+]] = global_addr [[DSO]] : $*Builtin.RawPointer
-// CHECK-NEXT: [[DSOPtr:%[0-9]+]] = address_to_pointer [[DSOAddr]] : $*Builtin.RawPointer to $Builtin.RawPointer
-// CHECK-NEXT: [[DSOPtrStruct:%[0-9]+]] = struct $UnsafeRawPointer ([[DSOPtr]] : $Builtin.RawPointer)
-// CHECK-NEXT: return [[DSOPtrStruct]] : $UnsafeRawPointer
func printDSOHandle(dso: UnsafeRawPointer = #dsohandle) -> UnsafeRawPointer {
print(dso)
return dso
}
_ = printDSOHandle()
-