swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.28k stars 10.33k forks source link

Segmentation fault on propertyWrapper attributes in init parameter #60825

Open swiftty opened 2 years ago

swiftty commented 2 years ago

Describe the bug This code causes segmentation fault.

@propertyWrapper
struct Wrapper<Value> {
    var wrappedValue: Value
    var projectedValue: Wrapper<Value> {
        get { self }
        set { self = newValue }
    }

    init(wrappedValue: Value) {
        self.wrappedValue = wrappedValue
    }
    init(projectedValue: Wrapper<Value>) {
        self = projectedValue
    }
}

struct Foo {
    init(@Wrapper val: Int) {}
}

let foo = Foo(val: 10)
Stack dump:
0.  Program arguments: /Applications/Xcode-13.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -interpret main.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode-13.4.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk -color-diagnostics -new-driver-path /Applications/Xcode-13.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -resource-dir /Applications/Xcode-13.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name main -target-sdk-version 12.3
1.  Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12)
2.  Compiling with the current language version
3.  While evaluating request ASTLoweringRequest(Lowering AST to SIL for module main)
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000108fc7078 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000108fc608c llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000108fc7708 SignalHandler(int) + 344
3  libsystem_platform.dylib 0x00000001b279b4a4 _sigtramp + 56
4  swift-frontend           0x0000000104aa2a40 swift::Lowering::TypeConverter::getTypeLowering(swift::Lowering::AbstractionPattern, swift::Type, swift::TypeExpansionContext) + 76
5  swift-frontend           0x0000000104f1c428 swift::ASTVisitor<(anonymous namespace)::RValueEmitter, swift::Lowering::RValue, void, void, void, void, void, swift::Lowering::SGFContext>::visit(swift::Expr*, swift::Lowering::SGFContext) + 11492
6  swift-frontend           0x0000000104f0fed0 swift::Lowering::SILGenFunction::emitRValueAsSingleValue(swift::Expr*, swift::Lowering::SGFContext) + 40
7  swift-frontend           0x0000000104ec5444 (anonymous namespace)::ArgEmitter::emit(swift::Lowering::ArgumentSource&&, swift::Lowering::AbstractionPattern) + 3356
8  swift-frontend           0x0000000104eb394c (anonymous namespace)::ArgEmitter::emitSingleArg(swift::Lowering::ArgumentSource&&, swift::Lowering::AbstractionPattern) + 200
9  swift-frontend           0x0000000104ecd590 (anonymous namespace)::CallSite::emit(swift::Lowering::SILGenFunction&, swift::Lowering::AbstractionPattern, swift::CanTypeWrapper<swift::SILFunctionType>, (anonymous namespace)::ParamLowering&, llvm::SmallVectorImpl<swift::Lowering::ManagedValue>&, llvm::SmallVectorImpl<(anonymous namespace)::DelayedArgument>&, swift::ForeignInfo const&) && + 524
10 swift-frontend           0x0000000104ecd0dc (anonymous namespace)::CallEmission::emitArgumentsForNormalApply(swift::Lowering::AbstractionPattern, swift::CanTypeWrapper<swift::SILFunctionType>, swift::ForeignInfo const&, llvm::SmallVectorImpl<swift::Lowering::ManagedValue>&, llvm::Optional<swift::SILLocation>&) + 932
11 swift-frontend           0x0000000104eb857c (anonymous namespace)::CallEmission::apply(swift::Lowering::SGFContext) + 2272
12 swift-frontend           0x0000000104eb6100 swift::Lowering::SILGenFunction::emitApplyExpr(swift::ApplyExpr*, swift::Lowering::SGFContext) + 2160
13 swift-frontend           0x0000000104f0d354 swift::Lowering::SILGenFunction::emitExprInto(swift::Expr*, swift::Lowering::Initialization*, llvm::Optional<swift::SILLocation>) + 80
14 swift-frontend           0x0000000104efce74 swift::Lowering::SILGenFunction::emitPatternBinding(swift::PatternBindingDecl*, unsigned int) + 2236
15 swift-frontend           0x0000000104eaa9cc swift::ASTVisitor<swift::Lowering::SILGenFunction, void, void, void, void, void, void>::visit(swift::Decl*) + 148
16 swift-frontend           0x0000000104eacdc0 swift::ASTVisitor<swift::Lowering::SILGenModule, void, void, void, void, void, void>::visit(swift::Decl*) + 332
17 swift-frontend           0x0000000104eab724 swift::ASTLoweringRequest::evaluate(swift::Evaluator&, swift::ASTLoweringDescriptor) const + 3396
18 swift-frontend           0x0000000104f770d0 swift::SimpleRequest<swift::ASTLoweringRequest, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> > (swift::ASTLoweringDescriptor), (swift::RequestFlags)9>::evaluateRequest(swift::ASTLoweringRequest const&, swift::Evaluator&) + 216
19 swift-frontend           0x0000000104eaec08 llvm::Expected<swift::ASTLoweringRequest::OutputType> swift::Evaluator::getResultUncached<swift::ASTLoweringRequest>(swift::ASTLoweringRequest const&) + 608
20 swift-frontend           0x0000000104869018 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 6700
21 swift-frontend           0x00000001048303c4 swift::mainEntry(int, char const**) + 808
22 dyld                     0x000000010b86d08c start + 520
[1]    21484 segmentation fault  swift main.swift

Expected behavior shows diagnose error such as error: property wrapper attribute on parameter not yet supported on subscript or passes value normally.

Environment (please fill out the following information)

Additional context If you comment out init(projectedValue:), there is no problem.

//    init(projectedValue: Wrapper<Value>) {
//        self = projectedValue
//    }

rdar://100220156

pyrtsa commented 1 year ago

I have a similar repro case where the property wrapper only allows init(projectedValue:) initialisation and not init(wrappedValue:) (reading SE-0293 I believe it's allowed!).

Here, the compiler fails to generate the correct diagnostic if forgetting the $ prefix at the call site:

@propertyWrapper
struct First<T> {
    var projectedValue: [T]
    var wrappedValue: T? { projectedValue.first }
}

func repro(@First arg: Int?) {}

repro(arg: 1)  // 💥

Expected result:

repro(arg: 1)
//   ^~~~ error: incorrect argument label in call (have 'arg:', expected '$arg:')

Actual result:

Stack dump:
0.  Program arguments: /Applications/Xcode-14.1-beta-3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -c -primary-file crash.swift -target x86_64-apple-macosx12.0 -enable-objc-interop -stack-check -sdk /Applications/Xcode-14.1-beta-3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk -color-diagnostics -new-driver-path /Applications/Xcode-14.1-beta-3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -empty-abi-descriptor -resource-dir /Applications/Xcode-14.1-beta-3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name crash -disable-clang-spi -target-sdk-version 13.0 -o /var/folders/gp/hp3vxx4979j5mzbr_l6pzcgdyt2rgg/T/TemporaryDirectory.11kn67/crash-1.o
1.  Apple Swift version 5.7.1 (swiftlang-5.7.1.134.3 clang-1400.0.29.51)
2.  Compiling with the current language version
3.  While evaluating request TypeCheckSourceFileRequest(source_file "crash.swift")
4.  While type-checking statement at [crash.swift:9:1 - line:9:13] RangeText="repro(arg: 1"
5.  While type-checking expression at [crash.swift:9:1 - line:9:13] RangeText="repro(arg: 1"
6.  While type-checking-target starting at crash.swift:9:1
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x00000001059d3027 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 39
1  swift-frontend           0x00000001059d2058 llvm::sys::RunSignalHandlers() + 248
2  swift-frontend           0x00000001059d3640 SignalHandler(int) + 288
3  libsystem_platform.dylib 0x00007ff813c0fdfd _sigtramp + 29
4  libsystem_platform.dylib 0x00007ff7bfaf2928 _sigtramp + 18446744072299096904
5  swift-frontend           0x000000010123281f (anonymous namespace)::ExprRewriter::finishApply(swift::ApplyExpr*, swift::Type, swift::constraints::ConstraintLocatorBuilder, swift::constraints::ConstraintLocatorBuilder) + 8831
6  swift-frontend           0x000000010123b5c6 (anonymous namespace)::ExprRewriter::visitApplyExpr(swift::ApplyExpr*) + 502
7  swift-frontend           0x000000010120f5b2 (anonymous namespace)::ExprWalker::walkToExprPost(swift::Expr*) + 18
8  swift-frontend           0x0000000101202e15 (anonymous namespace)::ExprWalker::rewriteTarget(swift::constraints::SolutionApplicationTarget) + 469
9  swift-frontend           0x0000000101202866 swift::constraints::ConstraintSystem::applySolution(swift::constraints::Solution&, swift::constraints::SolutionApplicationTarget) + 6806
10 swift-frontend           0x00000001014b3efc swift::TypeChecker::typeCheckTarget(swift::constraints::SolutionApplicationTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 716
11 swift-frontend           0x00000001014b3bc1 swift::TypeChecker::typeCheckExpression(swift::constraints::SolutionApplicationTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 417
12 swift-frontend           0x000000010159ce00 (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) + 272
13 swift-frontend           0x00000001015a075c swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 124
14 swift-frontend           0x000000010159f308 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 296
15 swift-frontend           0x000000010159f402 swift::TypeChecker::typeCheckTopLevelCodeDecl(swift::TopLevelCodeDecl*) + 98
16 swift-frontend           0x00000001015e1e1c swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 604
17 swift-frontend           0x00000001015e4f9d llvm::Expected<swift::TypeCheckSourceFileRequest::OutputType> swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest>(swift::TypeCheckSourceFileRequest const&) + 669
18 swift-frontend           0x00000001015e1b72 swift::performTypeChecking(swift::SourceFile&) + 114
19 swift-frontend           0x0000000100608939 swift::CompilerInstance::performSema() + 217
20 swift-frontend           0x000000010058bd67 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4711
21 swift-frontend           0x000000010052206a swift::mainEntry(int, char const**) + 3082
22 dyld                     0x000000010b74452e start + 462