From 25e623addbe2a6ddda585263dc3a2d9ba906a4b0 Mon Sep 17 00:00:00 2001 From: David Farler Date: Mon, 5 Dec 2016 19:34:02 -0800 Subject: [PATCH] Don't resolve a generic type parameter type from null environments The generic environment of a GenericTypeToArchetypeResolver may be `nullptr`, as returned by DeclContext::getGenericEnvironmentOfContext, during prechecking of closure expressions at the necessarily non-generic top level. Fixes a couple of crashers. --- lib/Sema/TypeCheckGeneric.cpp | 5 ++++- .../099-swift-genericenvironment-maptypeintocontext.swift | 8 -------- .../099-swift-genericenvironment-maptypeintocontext.swift | 7 +++++++ ...466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 validation-test/IDE/crashers/099-swift-genericenvironment-maptypeintocontext.swift create mode 100644 validation-test/IDE/crashers_fixed/099-swift-genericenvironment-maptypeintocontext.swift rename validation-test/{compiler_crashers => compiler_crashers_fixed}/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift (87%) diff --git a/lib/Sema/TypeCheckGeneric.cpp b/lib/Sema/TypeCheckGeneric.cpp index d7a48d67cb778..657b29daeb3d3 100644 --- a/lib/Sema/TypeCheckGeneric.cpp +++ b/lib/Sema/TypeCheckGeneric.cpp @@ -90,7 +90,10 @@ Type GenericTypeToArchetypeResolver::resolveGenericTypeParamType( if (gpDecl->isInvalid()) return ErrorType::get(gpDecl->getASTContext()); - return GenericEnv->mapTypeIntoContext(gp); + if (auto *Env = GenericEnv) + return Env->mapTypeIntoContext(gp); + + return ErrorType::get(gpDecl->getASTContext()); } Type GenericTypeToArchetypeResolver::resolveDependentMemberType( diff --git a/validation-test/IDE/crashers/099-swift-genericenvironment-maptypeintocontext.swift b/validation-test/IDE/crashers/099-swift-genericenvironment-maptypeintocontext.swift deleted file mode 100644 index 9da90e1fa9d4a..0000000000000 --- a/validation-test/IDE/crashers/099-swift-genericenvironment-maptypeintocontext.swift +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not --crash %target-swift-ide-test -code-completion -code-completion-token=A -source-filename=%s -// REQUIRES: asserts -a{ -protocol e{ -typealias e -extension{ -let b{let a={ -#^A^#func f:e \ No newline at end of file diff --git a/validation-test/IDE/crashers_fixed/099-swift-genericenvironment-maptypeintocontext.swift b/validation-test/IDE/crashers_fixed/099-swift-genericenvironment-maptypeintocontext.swift new file mode 100644 index 0000000000000..37ac009d4a4a2 --- /dev/null +++ b/validation-test/IDE/crashers_fixed/099-swift-genericenvironment-maptypeintocontext.swift @@ -0,0 +1,7 @@ +// RUN: %target-swift-ide-test -code-completion -code-completion-token=A -source-filename=%s +a{ +protocol e{ +typealias e +extension{ +let b{let a={ +#^A^#func f:e diff --git a/validation-test/compiler_crashers/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift b/validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift similarity index 87% rename from validation-test/compiler_crashers/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift rename to validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift index 74e4a168b2e0d..ff2d2222361f6 100644 --- a/validation-test/compiler_crashers/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift +++ b/validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift @@ -5,5 +5,5 @@ // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors -// RUN: not --crash %target-swift-frontend %s -emit-ir +// RUN: not %target-swift-frontend %s -emit-ir {associatedtype bfunc c:[T