Skip to content

Commit 04d3d43

Browse files
committed
RequirementMachine: Better assertion when root type parameter is invalid
Previously getReducedType() would dump debug info if we had an invalid dependent member type, but an invalid root type parameter would cause a segfault. Fix this.
1 parent 9e13db0 commit 04d3d43

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

lib/AST/RequirementMachine/GenericSignatureQueries.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,9 @@ Type RequirementMachine::getReducedType(
419419

420420
// Get a type (concrete or dependent) for U.
421421
auto prefixType = [&]() -> Type {
422+
if (prefix.empty())
423+
return Type();
424+
422425
verify(prefix);
423426

424427
auto *props = Map.lookUpProperties(prefix);
@@ -461,13 +464,25 @@ Type RequirementMachine::getReducedType(
461464

462465
// If U is not concrete, we have an invalid member type of a dependent
463466
// type, which is not valid in this generic signature. Give up.
464-
if (prefixType->isTypeParameter()) {
465-
llvm::errs() << "Invalid type parameter in getReducedType()\n";
466-
llvm::errs() << "Original type: " << type << "\n";
467-
llvm::errs() << "Simplified term: " << term << "\n";
468-
llvm::errs() << "Longest valid prefix: " << prefix << "\n";
469-
llvm::errs() << "Prefix type: " << prefixType << "\n";
467+
if (prefix.empty() || prefixType->isTypeParameter()) {
470468
llvm::errs() << "\n";
469+
llvm::errs() << "getReducedType() was called\n";
470+
llvm::errs() << " with " << Sig << ",\n";
471+
llvm::errs() << " and " << type << ".\n\n";
472+
llvm::errs() << "This type contains the type parameter " << t << ".\n\n";
473+
if (prefix.empty()) {
474+
llvm::errs() << "This type parameter contains the generic parameter "
475+
<< Type(t->getRootGenericParam()) << ".\n\n";
476+
llvm::errs() << "This generic parameter is not part of the given "
477+
<< "generic signature.\n\n";
478+
} else {
479+
llvm::errs() << "This type parameter's reduced term is " << term << ".\n\n";
480+
llvm::errs() << "This is not a valid term, because " << prefix << " does not "
481+
<< "have a member type named " << term[prefix.size()] << ".\n\n";
482+
}
483+
llvm::errs() << "This usually indicates the caller passed the wrong type or "
484+
<< "generic signature to getReducedType().\n\n";
485+
471486
dump(llvm::errs());
472487
abort();
473488
}

0 commit comments

Comments
 (0)