swiftlang / swift

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

Invalid use of variadic generics crashes compiler #74858

Open hamishknight opened 1 week ago

hamishknight commented 1 week ago

This crashes the compiler:

struct S<each T> {}
typealias U<each T> = S<>

func foo(_ x: U<>.Type) {
  let y = x<Int>.self
}
Stack dump:
0.      Program arguments: /Users/hamish/src/swift-dev/build/Release/swift-macosx-arm64/bin/swift-frontend -typecheck /Users/hamish/src/swift-test-arena/main.swift -sdk /Users/hamish/src/MacOSX.sdk -debug-diagnostic-names
1.      Swift version 6.0-dev (LLVM 7a0ecf027d00801, Swift 02a8f24406e348f)
2.      Compiling with effective version 5.10
3.      While evaluating request TypeCheckSourceFileRequest(source_file "/Users/hamish/src/swift-test-arena/main.swift")
4.      While evaluating request TypeCheckFunctionBodyRequest(main.(file).foo@/Users/hamish/src/swift-test-arena/main.swift:140:6)
5.      While type-checking statement at [/Users/hamish/src/swift-test-arena/main.swift:140:25 - line:142:1] RangeText="{
  let y = x<Int>.self
"
6.      While type-checking declaration 0x133831358 (at /Users/hamish/src/swift-test-arena/main.swift:141:3)
7.      While evaluating request PatternBindingEntryRequest((unknown decl)@/Users/hamish/src/swift-test-arena/main.swift:141:3, 0)
8.      While type-checking expression at [/Users/hamish/src/swift-test-arena/main.swift:141:11 - line:141:18] RangeText="x<Int>."
9.      While type-checking-target starting at /Users/hamish/src/swift-test-arena/main.swift:141:12
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           0x000000010a11ca98 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x000000010a11ade4 llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x000000010a11d120 SignalHandler(int) + 352
3  libsystem_platform.dylib 0x0000000180ce9a24 _sigtramp + 56
4  swift-frontend           0x0000000105930a84 swift::constraints::ConstraintSystem::simplifyExplicitGenericArgumentsConstraint(swift::Type, swift::Type, swift::optionset::OptionSet<swift::constraints::ConstraintSystem::TypeMatchFlags, unsigned int>, swift::constraints::ConstraintLocatorBuilder) + 408
5  swift-frontend           0x0000000105934ac0 swift::constraints::ConstraintSystem::addConstraintImpl(swift::constraints::ConstraintKind, swift::Type, swift::Type, swift::constraints::ConstraintLocatorBuilder, bool) + 1024
6  swift-frontend           0x000000010590ff64 swift::constraints::ConstraintSystem::addConstraint(swift::constraints::ConstraintKind, swift::Type, swift::Type, swift::constraints::ConstraintLocatorBuilder, bool) + 76
7  swift-frontend           0x00000001058f9880 (anonymous namespace)::ConstraintGenerator::addSpecializationConstraint(swift::constraints::ConstraintLocator*, swift::Type, llvm::ArrayRef<swift::TypeRepr*>) + 616
8  swift-frontend           0x00000001058f2508 (anonymous namespace)::ConstraintGenerator::visitUnresolvedSpecializeExpr(swift::UnresolvedSpecializeExpr*) + 612
9  swift-frontend           0x00000001058edab8 (anonymous namespace)::ConstraintWalker::walkToExprPost(swift::Expr*) + 752
10 swift-frontend           0x0000000105e3adb0 (anonymous namespace)::Traversal::doIt(swift::Expr*) + 232
11 swift-frontend           0x0000000105e3ad80 (anonymous namespace)::Traversal::doIt(swift::Expr*) + 184
12 swift-frontend           0x0000000105e3acbc swift::Expr::walk(swift::ASTWalker&) + 32
13 swift-frontend           0x00000001058e9704 swift::constraints::ConstraintSystem::generateConstraints(swift::Expr*, swift::DeclContext*) + 104
14 swift-frontend           0x00000001058e8a1c swift::constraints::ConstraintSystem::generateConstraints(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 432
15 swift-frontend           0x000000010594d61c swift::constraints::ConstraintSystem::solveImpl(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 392
16 swift-frontend           0x000000010594cee8 swift::constraints::ConstraintSystem::solve(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 144
17 swift-frontend           0x0000000105ad2950 swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 296
18 swift-frontend           0x0000000105ad27d0 swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 184
19 swift-frontend           0x0000000105ad38c0 swift::TypeChecker::typeCheckBinding(swift::Pattern*&, swift::Expr*&, swift::DeclContext*, swift::Type, swift::PatternBindingDecl*, unsigned int, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 120
20 swift-frontend           0x0000000105ad3af8 swift::TypeChecker::typeCheckPatternBinding(swift::PatternBindingDecl*, unsigned int, swift::Type, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 248
21 swift-frontend           0x0000000105baa974 swift::PatternBindingEntryRequest::evaluate(swift::Evaluator&, swift::PatternBindingDecl*, unsigned int) const + 1800
22 swift-frontend           0x0000000105ec85e0 swift::PatternBindingEntryRequest::OutputType swift::Evaluator::getResultUncached<swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType)::'lambda'()>(swift::PatternBindingEntryRequest const&, swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType)::'lambda'()) + 212
23 swift-frontend           0x0000000105e98180 swift::PatternBindingDecl::getCheckedPatternBindingEntry(unsigned int) const + 124
24 swift-frontend           0x0000000105b1d178 (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 1104
25 swift-frontend           0x0000000105b1cd10 swift::TypeChecker::typeCheckDecl(swift::Decl*) + 116
26 swift-frontend           0x0000000105ba2330 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 144
27 swift-frontend           0x0000000105ba0968 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 136
28 swift-frontend           0x0000000105ba0104 (anonymous namespace)::StmtChecker::typeCheckBody(swift::BraceStmt*&) + 32
29 swift-frontend           0x0000000105b9ff24 swift::TypeCheckFunctionBodyRequest::evaluate(swift::Evaluator&, swift::AbstractFunctionDecl*) const + 1032
30 swift-frontend           0x0000000105f3c7c0 swift::TypeCheckFunctionBodyRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType)::'lambda'()>(swift::TypeCheckFunctionBodyRequest const&, swift::TypeCheckFunctionBodyRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType)::'lambda'()) + 224
31 swift-frontend           0x0000000105eaea9c swift::AbstractFunctionDecl::getTypecheckedBody() const + 112
32 swift-frontend           0x0000000105fe1dbc swift::SourceFile::typeCheckDelayedFunctions() + 96
33 swift-frontend           0x0000000105bdcf74 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 240
34 swift-frontend           0x0000000105bde8f0 swift::TypeCheckSourceFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()>(swift::TypeCheckSourceFileRequest const&, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()) + 216
35 swift-frontend           0x0000000105bdce5c swift::performTypeChecking(swift::SourceFile&) + 84
36 swift-frontend           0x0000000104b430bc bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_0>(long, swift::SourceFile&) + 16
37 swift-frontend           0x0000000104b3cc28 swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) + 156
38 swift-frontend           0x0000000104b3cb6c swift::CompilerInstance::performSema() + 76
39 swift-frontend           0x00000001048ec3ac withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 60
40 swift-frontend           0x00000001048e1a6c performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 700
41 swift-frontend           0x00000001048e1214 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2288
42 swift-frontend           0x000000010471e6f4 swift::mainEntry(int, char const**) + 3060
43 dyld                     0x0000000180941058 start + 2224
fish: Job 1, './swift -frontend -typecheck ~/…' terminated by signal SIGSEGV (Address boundary error)
AnthonyLatsis commented 6 days ago

Here’s a simpler example:

typealias U<T> = Int

func foo(_ x: U<Int>.Type) {
  let y = x<Int>.self
}