diff --git a/include/swift/AST/DeclContext.h b/include/swift/AST/DeclContext.h index e1208c307098e..a5e9c57d5ca2b 100644 --- a/include/swift/AST/DeclContext.h +++ b/include/swift/AST/DeclContext.h @@ -198,7 +198,11 @@ class alignas(1 << DeclContextAlignInBits) DeclContext { friend struct ::llvm::cast_convert_val; static DeclContext *castDeclToDeclContext(const Decl *D); - + + /// If this DeclContext is a GenericType declaration or an + /// extension thereof, return the GenericTypeDecl. + GenericTypeDecl *getAsTypeOrTypeExtensionContext() const; + public: DeclContext(DeclContextKind Kind, DeclContext *Parent) : ParentAndKind(Parent, Kind) { @@ -232,20 +236,13 @@ class alignas(1 << DeclContextAlignInBits) DeclContext { /// \returns true if this is a type context, e.g., a struct, a class, an /// enum, a protocol, or an extension. - bool isTypeContext() const { - return getContextKind() == DeclContextKind::GenericTypeDecl || - getContextKind() == DeclContextKind::ExtensionDecl; - } + bool isTypeContext() const; /// \brief Determine whether this is an extension context. bool isExtensionContext() const { return getContextKind() == DeclContextKind::ExtensionDecl; } - /// If this DeclContext is a GenericType declaration or an - /// extension thereof, return the GenericTypeDecl. - GenericTypeDecl *getAsGenericTypeOrGenericTypeExtensionContext() const; - /// If this DeclContext is a NominalType declaration or an /// extension thereof, return the NominalTypeDecl. NominalTypeDecl *getAsNominalTypeOrNominalTypeExtensionContext() const; diff --git a/lib/AST/ConformanceLookupTable.cpp b/lib/AST/ConformanceLookupTable.cpp index dc9ef3c112b90..1d72183ae718a 100644 --- a/lib/AST/ConformanceLookupTable.cpp +++ b/lib/AST/ConformanceLookupTable.cpp @@ -801,8 +801,7 @@ ProtocolConformance *ConformanceLookupTable::getConformance( return nullptr; auto *conformingNominal = - cast(conformingDC-> - getAsGenericTypeOrGenericTypeExtensionContext()); + conformingDC->getAsNominalTypeOrNominalTypeExtensionContext(); // Form the conformance. Type type = entry->getDeclContext()->getDeclaredTypeInContext(); diff --git a/lib/AST/DeclContext.cpp b/lib/AST/DeclContext.cpp index 590fac1eed69f..7de508034fbeb 100644 --- a/lib/AST/DeclContext.cpp +++ b/lib/AST/DeclContext.cpp @@ -40,7 +40,7 @@ ASTContext &DeclContext::getASTContext() const { } GenericTypeDecl * -DeclContext::getAsGenericTypeOrGenericTypeExtensionContext() const { +DeclContext::getAsTypeOrTypeExtensionContext() const { switch (getContextKind()) { case DeclContextKind::Module: case DeclContextKind::FileUnit: @@ -78,32 +78,28 @@ DeclContext::getAsGenericTypeOrGenericTypeExtensionContext() const { /// extension thereof, return the NominalTypeDecl. NominalTypeDecl *DeclContext:: getAsNominalTypeOrNominalTypeExtensionContext() const { - auto decl = getAsGenericTypeOrGenericTypeExtensionContext(); + auto decl = getAsTypeOrTypeExtensionContext(); return dyn_cast_or_null(decl); } ClassDecl *DeclContext::getAsClassOrClassExtensionContext() const { - return dyn_cast_or_null( - getAsGenericTypeOrGenericTypeExtensionContext()); + return dyn_cast_or_null(getAsTypeOrTypeExtensionContext()); } EnumDecl *DeclContext::getAsEnumOrEnumExtensionContext() const { - return dyn_cast_or_null( - getAsGenericTypeOrGenericTypeExtensionContext()); + return dyn_cast_or_null(getAsTypeOrTypeExtensionContext()); } ProtocolDecl *DeclContext::getAsProtocolOrProtocolExtensionContext() const { - return dyn_cast_or_null( - getAsGenericTypeOrGenericTypeExtensionContext()); + return dyn_cast_or_null(getAsTypeOrTypeExtensionContext()); } ProtocolDecl *DeclContext::getAsProtocolExtensionContext() const { if (getContextKind() != DeclContextKind::ExtensionDecl) return nullptr; - return dyn_cast_or_null( - getAsGenericTypeOrGenericTypeExtensionContext()); + return dyn_cast_or_null(getAsTypeOrTypeExtensionContext()); } GenericTypeParamType *DeclContext::getProtocolSelfType() const { @@ -357,6 +353,11 @@ AbstractFunctionDecl *DeclContext::getInnermostMethodContext() { } } +bool DeclContext::isTypeContext() const { + return isa(this) || + getContextKind() == DeclContextKind::ExtensionDecl; +} + DeclContext *DeclContext::getInnermostTypeContext() { DeclContext *Result = this; while (true) { @@ -374,8 +375,14 @@ DeclContext *DeclContext::getInnermostTypeContext() { case DeclContextKind::FileUnit: return nullptr; - case DeclContextKind::ExtensionDecl: case DeclContextKind::GenericTypeDecl: + if (isa(Result)) { + Result = Result->getParent(); + continue; + } + return Result; + + case DeclContextKind::ExtensionDecl: return Result; } } diff --git a/lib/AST/NameLookup.cpp b/lib/AST/NameLookup.cpp index b62a28f1d6c32..a011f11106263 100644 --- a/lib/AST/NameLookup.cpp +++ b/lib/AST/NameLookup.cpp @@ -787,7 +787,8 @@ UnqualifiedLookup::UnqualifiedLookup(DeclName Name, DeclContext *DC, DC = I->getParent()->getParent(); continue; } else { - assert(isa(DC) || isa(DC)); + assert(isa(DC) || isa(DC) || + isa(DC)); if (!isCascadingUse.hasValue()) isCascadingUse = DC->isCascadingContextForLookup(false); } diff --git a/lib/IDE/CodeCompletion.cpp b/lib/IDE/CodeCompletion.cpp index 63ff9003d6792..95baeddec610d 100644 --- a/lib/IDE/CodeCompletion.cpp +++ b/lib/IDE/CodeCompletion.cpp @@ -4069,9 +4069,9 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { void addAccessControl(const ValueDecl *VD, CodeCompletionResultBuilder &Builder) { - assert(CurrDeclContext->getAsGenericTypeOrGenericTypeExtensionContext()); + assert(CurrDeclContext->getAsNominalTypeOrNominalTypeExtensionContext()); auto AccessibilityOfContext = - CurrDeclContext->getAsGenericTypeOrGenericTypeExtensionContext() + CurrDeclContext->getAsNominalTypeOrNominalTypeExtensionContext() ->getFormalAccess(); auto Access = std::min(VD->getFormalAccess(), AccessibilityOfContext); // Only emit 'public', not needed otherwise. @@ -4309,7 +4309,7 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { } void getOverrideCompletions(SourceLoc Loc) { - if (!CurrDeclContext->getAsGenericTypeOrGenericTypeExtensionContext()) + if (!CurrDeclContext->getAsNominalTypeOrNominalTypeExtensionContext()) return; Type CurrTy = CurrDeclContext->getDeclaredTypeInContext(); diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index c1b86b38cd99a..be445e59d65e9 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -3827,7 +3827,6 @@ void Parser::ParsedAccessors::record(Parser &P, AbstractStorageDecl *storage, SmallVectorImpl &decls) { auto flagInvalidAccessor = [&](FuncDecl *&func) { if (func) { - func->setInterfaceType(ErrorType::get(P.Context)); func->setInvalid(); } }; diff --git a/lib/Sema/CSApply.cpp b/lib/Sema/CSApply.cpp index a6e44a0e00e77..c7d01f8eb2891 100644 --- a/lib/Sema/CSApply.cpp +++ b/lib/Sema/CSApply.cpp @@ -704,7 +704,7 @@ namespace { if (!isa(fn)) return false; auto *parent = - fn->getParent()->getAsGenericTypeOrGenericTypeExtensionContext(); + fn->getParent()->getAsNominalTypeOrNominalTypeExtensionContext(); return parent && (isa(parent) || isa(parent)); } diff --git a/lib/Sema/CSDiag.cpp b/lib/Sema/CSDiag.cpp index 462947f8a9094..692e783e56850 100644 --- a/lib/Sema/CSDiag.cpp +++ b/lib/Sema/CSDiag.cpp @@ -4671,8 +4671,8 @@ static bool diagnoseImplicitSelfErrors(Expr *fnExpr, Expr *argExpr, }; auto getBaseName = [](DeclContext *context) -> DeclName { - if (context->isTypeContext()) { - auto generic = context->getAsGenericTypeOrGenericTypeExtensionContext(); + if (auto generic = + context->getAsNominalTypeOrNominalTypeExtensionContext()) { return generic->getName(); } else if (context->isModuleScopeContext()) return context->getParentModule()->getName(); diff --git a/lib/Sema/GenericTypeResolver.h b/lib/Sema/GenericTypeResolver.h index 1ae12eeeb3406..fb06dc945b4f6 100644 --- a/lib/Sema/GenericTypeResolver.h +++ b/lib/Sema/GenericTypeResolver.h @@ -159,35 +159,6 @@ class GenericTypeToArchetypeResolver : public GenericTypeResolver { virtual void recordParamType(ParamDecl *decl, Type ty); }; -/// Generic type resolver that maps any generic type parameter type that -/// has an underlying archetype to its corresponding archetype. -/// -/// This generic type resolver replaces generic type parameter types that -/// have archetypes with their archetypes, and leaves all other generic -/// type parameter types unchanged. It is used for the initial type-checks of -/// generic functions (and other generic declarations). -/// -/// FIXME: This is not a long-term solution. -class PartialGenericTypeToArchetypeResolver : public GenericTypeResolver { -public: - virtual Type resolveGenericTypeParamType(GenericTypeParamType *gp); - - virtual Type resolveDependentMemberType(Type baseTy, - DeclContext *DC, - SourceRange baseRange, - ComponentIdentTypeRepr *ref); - - virtual Type resolveSelfAssociatedType(Type selfTy, - DeclContext *DC, - AssociatedTypeDecl *assocType); - - virtual Type resolveTypeOfContext(DeclContext *dc, bool wantSelf=false); - - virtual Type resolveTypeOfDecl(TypeDecl *decl); - - virtual void recordParamType(ParamDecl *decl, Type ty); -}; - /// Generic type resolver that performs complete resolution of dependent /// types based on a given archetype builder. /// diff --git a/lib/Sema/ITCDecl.cpp b/lib/Sema/ITCDecl.cpp index 241d969da66c9..d7c7e796e8b25 100644 --- a/lib/Sema/ITCDecl.cpp +++ b/lib/Sema/ITCDecl.cpp @@ -103,7 +103,7 @@ void IterativeTypeChecker::processResolveInheritedClauseEntry( // Validate the type of this inherited clause entry. // FIXME: Recursion into existing type checker. - PartialGenericTypeToArchetypeResolver resolver; + GenericTypeToArchetypeResolver resolver(dc); if (TC.validateType(*inherited, dc, options, &resolver)) { inherited->setInvalidType(getASTContext()); } @@ -314,9 +314,10 @@ void IterativeTypeChecker::processResolveTypeDecl( // Note: recursion into old type checker is okay when passing in an // unsatisfied-dependency callback. + GenericTypeToArchetypeResolver resolver(typeAliasDecl); if (TC.validateType(typeAliasDecl->getUnderlyingTypeLoc(), typeAliasDecl->getDeclContext(), - options, nullptr, &unsatisfiedDependency)) { + options, &resolver, &unsatisfiedDependency)) { typeAliasDecl->setInvalid(); typeAliasDecl->setInterfaceType(ErrorType::get(getASTContext())); typeAliasDecl->getUnderlyingTypeLoc().setInvalidType(getASTContext()); diff --git a/lib/Sema/TypeCheckConstraints.cpp b/lib/Sema/TypeCheckConstraints.cpp index 1d797325c82f9..1ff2775c7cf10 100644 --- a/lib/Sema/TypeCheckConstraints.cpp +++ b/lib/Sema/TypeCheckConstraints.cpp @@ -937,8 +937,7 @@ bool PreCheckExpression::walkToClosureExprPre(ClosureExpr *closure) { options |= TR_InExpression; bool hadParameterError = false; - GenericTypeToArchetypeResolver resolver( - closure->getGenericEnvironmentOfContext()); + GenericTypeToArchetypeResolver resolver(closure); if (TC.typeCheckParameterList(PL, DC, options, resolver)) { closure->setType(ErrorType::get(TC.Context)); diff --git a/lib/Sema/TypeCheckDecl.cpp b/lib/Sema/TypeCheckDecl.cpp index 1b1e1d9d6ea45..d57c64a7dccf7 100644 --- a/lib/Sema/TypeCheckDecl.cpp +++ b/lib/Sema/TypeCheckDecl.cpp @@ -295,7 +295,9 @@ void TypeChecker::checkInheritanceClause(Decl *decl, } // Establish a default generic type resolver. - PartialGenericTypeToArchetypeResolver defaultResolver; + auto genericEnv = + decl->getInnermostDeclContext()->getGenericEnvironmentOfContext(); + GenericTypeToArchetypeResolver defaultResolver(genericEnv); if (!resolver) resolver = &defaultResolver; @@ -730,11 +732,18 @@ TypeChecker::handleSILGenericParams(GenericParamList *genericParams, revertGenericParamList(genericParams); ArchetypeBuilder builder(*DC->getParentModule()); + CompleteGenericTypeResolver completeResolver(*this, builder); checkGenericParamList(&builder, genericParams, parentSig, parentEnv, - nullptr); + &completeResolver); parentSig = genericSig; parentEnv = builder.getGenericEnvironment(parentSig); recordArchetypeContexts(parentSig, parentEnv, DC); + + // Compute the final set of archetypes. + revertGenericParamList(genericParams); + GenericTypeToArchetypeResolver archetypeResolver(parentEnv); + checkGenericParamList(nullptr, genericParams, parentSig, parentEnv, + &archetypeResolver); } return parentEnv; @@ -1123,12 +1132,15 @@ static void configureImplicitSelf(TypeChecker &tc, selfDecl->setLet(!selfIfaceTy->is()); selfDecl->setInterfaceType(selfIfaceTy); +} - // FIXME: Wrong DeclContext used for mapTypeIntoContext(), because - // 'func' doesn't have a generic environment yet. +/// Record the context type of 'self' after the generic environment of +/// the function has been determined. +static void recordSelfContextType(AbstractFunctionDecl *func) { + auto selfDecl = func->getImplicitSelfDecl(); Type selfTy = func->computeInterfaceSelfType(/*isInitializingCtor*/true, /*wantDynamicSelf*/true); - selfTy = func->getDeclContext()->mapTypeIntoContext(selfTy); + selfTy = func->mapTypeIntoContext(selfTy); selfDecl->setType(selfTy); } @@ -3878,8 +3890,7 @@ class DeclChecker : public DeclVisitor { if (TAD->getDeclContext()->isModuleScopeContext()) { IterativeTypeChecker ITC(TC); ITC.satisfy(requestResolveTypeDecl(TAD)); - } else if (TC.validateType(TAD->getUnderlyingTypeLoc(), - TAD->getDeclContext(), options)) { + } else if (TC.validateType(TAD->getUnderlyingTypeLoc(), TAD, options)) { TAD->setInvalid(); TAD->setInterfaceType(ErrorType::get(TC.Context)); TAD->getUnderlyingTypeLoc().setInvalidType(TC.Context); @@ -4797,6 +4808,10 @@ class DeclChecker : public DeclVisitor { } } + // Set the context type of 'self'. + if (FD->getDeclContext()->isTypeContext()) + recordSelfContextType(FD); + // Type check the parameters and return type again, now with archetypes. GenericTypeToArchetypeResolver resolver(FD); if (semaFuncDecl(FD, resolver)) @@ -6417,6 +6432,9 @@ class DeclChecker : public DeclVisitor { CD->getDeclContext()->getGenericEnvironmentOfContext()); } + // Set the context type of 'self'. + recordSelfContextType(CD); + { CD->setIsBeingTypeChecked(true); SWIFT_DEFER { CD->setIsBeingTypeChecked(false); }; @@ -6568,6 +6586,9 @@ class DeclChecker : public DeclVisitor { DD->getDeclContext()->getGenericEnvironmentOfContext()); } + // Set the context type of 'self'. + recordSelfContextType(DD); + GenericTypeToArchetypeResolver resolver(DD); if (semaFuncParamPatterns(DD, resolver)) { DD->setInterfaceType(ErrorType::get(TC.Context)); @@ -7010,6 +7031,10 @@ void TypeChecker::validateDecl(ValueDecl *D, bool resolveTypeParams) { return; proto->computeType(); + auto iBTC = proto->isBeingTypeChecked(); + proto->setIsBeingTypeChecked(); + SWIFT_DEFER { proto->setIsBeingTypeChecked(iBTC); }; + // Resolve the inheritance clauses for each of the associated // types. for (auto member : proto->getMembers()) { @@ -7063,12 +7088,18 @@ void TypeChecker::validateDecl(ValueDecl *D, bool resolveTypeParams) { ValidatedTypes.insert(proto); break; } - + case DeclKind::Var: case DeclKind::Param: { auto VD = cast(D); if (!VD->hasType()) { - if (PatternBindingDecl *PBD = VD->getParentPatternBinding()) { + if (VD->isSelfParameter()) { + if (!VD->hasInterfaceType()) { + VD->setInterfaceType(ErrorType::get(Context)); + VD->setInvalid(); + } + recordSelfContextType(cast(VD->getDeclContext())); + } else if (PatternBindingDecl *PBD = VD->getParentPatternBinding()) { if (PBD->isBeingTypeChecked()) { diagnose(VD, diag::pattern_used_in_type, VD->getName()); @@ -7379,16 +7410,28 @@ checkExtensionGenericParams(TypeChecker &tc, ExtensionDecl *ext, Type type, /*allowConcreteGenericParams=*/true, inferExtendedTypeReqs); - // Validate the generic parameters for the last time. + // Validate the generic parameters for the penultimate time to get an + // environment where we have the parent archetypes. tc.revertGenericParamList(genericParams); ArchetypeBuilder builder = tc.createArchetypeBuilder(ext->getModuleContext()); - tc.checkGenericParamList(&builder, genericParams, parentSig, parentEnv, nullptr); + DependentGenericTypeResolver completeResolver(builder); + tc.checkGenericParamList(&builder, genericParams, parentSig, parentEnv, + &completeResolver); inferExtendedTypeReqs(builder); + (void)builder.finalize(genericParams->getSourceRange().Start, + /*allowConcreteGenericParams=*/true); auto *env = builder.getGenericEnvironment(sig); - tc.recordArchetypeContexts(sig, env, ext); + // Validate the generic parameters for the last time, to splat down + // actual archetypes. + tc.revertGenericParamList(genericParams); + GenericTypeToArchetypeResolver archetypeResolver(env); + tc.checkGenericParamList(nullptr, genericParams, parentSig, parentEnv, + &archetypeResolver); + + // Compute the final extended type. Type resultType; diff --git a/lib/Sema/TypeCheckGeneric.cpp b/lib/Sema/TypeCheckGeneric.cpp index 657b29daeb3d3..c17b9bf328d2d 100644 --- a/lib/Sema/TypeCheckGeneric.cpp +++ b/lib/Sema/TypeCheckGeneric.cpp @@ -87,13 +87,14 @@ Type GenericTypeToArchetypeResolver::resolveGenericTypeParamType( // Hack: See parseGenericParameters(). When the issue there is fixed, // we won't need the isInvalid() check anymore. - if (gpDecl->isInvalid()) + if (gpDecl->isInvalid() || !GenericEnv) return ErrorType::get(gpDecl->getASTContext()); - if (auto *Env = GenericEnv) - return Env->mapTypeIntoContext(gp); + auto type = GenericEnv->getMappingIfPresent(gp); + if (!type) + return ErrorType::get(gpDecl->getASTContext());; - return ErrorType::get(gpDecl->getASTContext()); + return *type; } Type GenericTypeToArchetypeResolver::resolveDependentMemberType( @@ -113,6 +114,10 @@ Type GenericTypeToArchetypeResolver::resolveSelfAssociatedType( Type GenericTypeToArchetypeResolver::resolveTypeOfContext(DeclContext *dc, bool wantSelf) { + // FIXME: Fallback case. + if (dc->isGenericContext() && !dc->isValidGenericContext()) + return getTypeOfContext(dc, wantSelf); + return ArchetypeBuilder::mapTypeIntoContext( dc->getParentModule(), GenericEnv, getTypeOfContext(dc, wantSelf)); @@ -149,72 +154,6 @@ void GenericTypeToArchetypeResolver::recordParamType(ParamDecl *decl, Type type) type)); } -Type PartialGenericTypeToArchetypeResolver::resolveGenericTypeParamType( - GenericTypeParamType *gp) { - auto gpDecl = gp->getDecl(); - if (!gpDecl) - return Type(gp); - - // Hack: See parseGenericParameters(). When the issue there is fixed, - // we won't need the isInvalid() check anymore. - if (gpDecl->isInvalid()) - return ErrorType::get(gpDecl->getASTContext()); - - if (!gpDecl->getDeclContext()->isValidGenericContext()) - return Type(gp); - - auto *genericEnv = gpDecl->getDeclContext()->getGenericEnvironmentOfContext(); - return genericEnv->mapTypeIntoContext(gp); -} - -Type PartialGenericTypeToArchetypeResolver::resolveDependentMemberType( - Type baseTy, - DeclContext *DC, - SourceRange baseRange, - ComponentIdentTypeRepr *ref) { - // We don't have enough information to find the associated type. - // FIXME: Nonsense, but we shouldn't need this code anyway. - return DependentMemberType::get(baseTy, ref->getIdentifier()); -} - -Type PartialGenericTypeToArchetypeResolver::resolveSelfAssociatedType( - Type selfTy, - DeclContext *DC, - AssociatedTypeDecl *assocType) { - // We don't have enough information to find the associated type. - // FIXME: Nonsense, but we shouldn't need this code anyway. - return DependentMemberType::get(selfTy, assocType); -} - -Type -PartialGenericTypeToArchetypeResolver::resolveTypeOfContext(DeclContext *dc, - bool wantSelf) { - if (dc->isGenericContext() && dc->isValidGenericContext()) - return dc->mapTypeIntoContext(getTypeOfContext(dc, wantSelf)); - return getTypeOfContext(dc, wantSelf); -} - -Type -PartialGenericTypeToArchetypeResolver::resolveTypeOfDecl(TypeDecl *decl) { - // Hack for 'out of context' GenericTypeParamDecls when resolving - // a generic typealias - if (auto *paramDecl = dyn_cast(decl)) { - return decl->getDeclContext()->getGenericEnvironmentOfContext() - ->mapTypeIntoContext(paramDecl->getDeclaredInterfaceType() - ->castTo()); - } - - auto *aliasDecl = cast(decl); - if (aliasDecl->isInvalid()) - return ErrorType::get(aliasDecl->getASTContext()); - return aliasDecl->getAliasType(); -} - -void -PartialGenericTypeToArchetypeResolver::recordParamType(ParamDecl *decl, Type type) { - // Do nothing -} - Type CompleteGenericTypeResolver::resolveGenericTypeParamType( GenericTypeParamType *gp) { auto gpDecl = gp->getDecl(); @@ -898,7 +837,9 @@ void TypeChecker::validateGenericTypeSignature(GenericTypeDecl *typeDecl) { createArchetypeBuilder(typeDecl->getModuleContext()); auto *parentSig = dc->getGenericSignatureOfContext(); auto *parentEnv = dc->getGenericEnvironmentOfContext(); - checkGenericParamList(&builder, gp, parentSig, parentEnv, nullptr); + + DependentGenericTypeResolver resolver(builder); + checkGenericParamList(&builder, gp, parentSig, parentEnv, &resolver); auto *env = builder.getGenericEnvironment(sig); typeDecl->setGenericEnvironment(env); diff --git a/lib/Sema/TypeCheckProtocol.cpp b/lib/Sema/TypeCheckProtocol.cpp index 2fef9b5ae3172..f16534016cb00 100644 --- a/lib/Sema/TypeCheckProtocol.cpp +++ b/lib/Sema/TypeCheckProtocol.cpp @@ -2349,8 +2349,7 @@ static void diagnoseNoWitness(ValueDecl *Requirement, Type RequirementType, Accessibility Access = std::min( /* Access of the context */ - Adopter - ->getAsGenericTypeOrGenericTypeExtensionContext()->getFormalAccess(), + Adopter->getAsNominalTypeOrNominalTypeExtensionContext()->getFormalAccess(), /* Access of the protocol */ Requirement->getDeclContext() ->getAsProtocolOrProtocolExtensionContext()->getFormalAccess()); diff --git a/lib/Sema/TypeCheckType.cpp b/lib/Sema/TypeCheckType.cpp index 5b8e224486a90..8f531fa066d5f 100644 --- a/lib/Sema/TypeCheckType.cpp +++ b/lib/Sema/TypeCheckType.cpp @@ -201,7 +201,7 @@ Type TypeChecker::resolveTypeInContext( bool isSpecialized, GenericTypeResolver *resolver, UnsatisfiedDependency *unsatisfiedDependency) { - PartialGenericTypeToArchetypeResolver defaultResolver; + GenericTypeToArchetypeResolver defaultResolver(fromDC); if (!resolver) resolver = &defaultResolver; @@ -528,7 +528,7 @@ Type TypeChecker::applyUnboundGenericArguments( "invalid arguments, use applyGenericArguments for diagnostic emitting"); // Make sure we always have a resolver to use. - PartialGenericTypeToArchetypeResolver defaultResolver; + GenericTypeToArchetypeResolver defaultResolver(dc); if (!resolver) resolver = &defaultResolver; @@ -1611,7 +1611,7 @@ Type TypeChecker::resolveType(TypeRepr *TyR, DeclContext *DC, PrettyStackTraceTypeRepr stackTrace(Context, "resolving", TyR); // Make sure we always have a resolver to use. - PartialGenericTypeToArchetypeResolver defaultResolver; + GenericTypeToArchetypeResolver defaultResolver(DC); if (!resolver) resolver = &defaultResolver; diff --git a/lib/Sema/TypeChecker.cpp b/lib/Sema/TypeChecker.cpp index 0787c376fff85..145529e407062 100644 --- a/lib/Sema/TypeChecker.cpp +++ b/lib/Sema/TypeChecker.cpp @@ -693,11 +693,12 @@ void swift::performWholeModuleTypeChecking(SourceFile &SF) { bool swift::performTypeLocChecking(ASTContext &Ctx, TypeLoc &T, DeclContext *DC, bool ProduceDiagnostics) { - return performTypeLocChecking(Ctx, T, - /*isSILMode=*/false, - /*isSILType=*/false, - /*GenericEnv=*/nullptr, - DC, ProduceDiagnostics); + return performTypeLocChecking( + Ctx, T, + /*isSILMode=*/false, + /*isSILType=*/false, + /*GenericEnv=*/DC->getGenericEnvironmentOfContext(), + DC, ProduceDiagnostics); } bool swift::performTypeLocChecking(ASTContext &Ctx, TypeLoc &T, @@ -715,20 +716,15 @@ bool swift::performTypeLocChecking(ASTContext &Ctx, TypeLoc &T, if (isSILType) options |= TR_SILType; - // FIXME: Get rid of PartialGenericTypeToArchetypeResolver GenericTypeToArchetypeResolver contextResolver(GenericEnv); - PartialGenericTypeToArchetypeResolver defaultResolver; - - GenericTypeResolver *resolver = - (GenericEnv ? (GenericTypeResolver *) &contextResolver - : (GenericTypeResolver *) &defaultResolver); if (ProduceDiagnostics) { - return TypeChecker(Ctx).validateType(T, DC, options, resolver); + return TypeChecker(Ctx).validateType(T, DC, options, &contextResolver); } else { // Set up a diagnostics engine that swallows diagnostics. DiagnosticEngine Diags(Ctx.SourceMgr); - return TypeChecker(Ctx, Diags).validateType(T, DC, options, resolver); + return TypeChecker(Ctx, Diags).validateType(T, DC, options, + &contextResolver); } } diff --git a/lib/Sema/TypeChecker.h b/lib/Sema/TypeChecker.h index 695f8156ca9cd..8c512d382a05e 100644 --- a/lib/Sema/TypeChecker.h +++ b/lib/Sema/TypeChecker.h @@ -726,7 +726,7 @@ class TypeChecker final : public LazyResolver { /// \param options Options that alter type resolution. /// /// \param resolver A resolver for generic types. If none is supplied, this - /// routine will create a \c PartialGenericTypeToArchetypeResolver to use. + /// routine will create a \c GenericTypeToArchetypeResolver to use. /// /// \returns true if type validation failed, or false otherwise. bool validateType(TypeLoc &Loc, DeclContext *DC, @@ -756,7 +756,7 @@ class TypeChecker final : public LazyResolver { /// \param options Options that alter type resolution. /// /// \param resolver A resolver for generic types. If none is supplied, this - /// routine will create a \c PartialGenericTypeToArchetypeResolver to use. + /// routine will create a \c GenericTypeToArchetypeResolver to use. /// /// \param unsatisfiedDependency When non-null, used to check whether /// dependencies have been satisfied appropriately. diff --git a/test/Generics/same_type_constraints.swift b/test/Generics/same_type_constraints.swift index 0030cf61d2ab8..a5801b25dad41 100644 --- a/test/Generics/same_type_constraints.swift +++ b/test/Generics/same_type_constraints.swift @@ -329,7 +329,6 @@ protocol P9 { struct X7 where T.A : C { } extension X7 where T.A == Int { } // expected-error 2{{'T.A' requires that 'Int' inherit from 'C'}} - struct X8 { } extension X8 where T == Int { } // expected-error 2{{'T' requires that 'Int' inherit from 'C'}} diff --git a/test/decl/ext/generic.swift b/test/decl/ext/generic.swift index 4bf1a79b6f6b8..a70281dbcca1e 100644 --- a/test/decl/ext/generic.swift +++ b/test/decl/ext/generic.swift @@ -151,4 +151,4 @@ struct S4: P4 { init(_: Q) { } } -extension S4 where T : P5 {} // expected-error{{type 'T' in conformance requirement does not refer to a generic parameter or associated type}} +extension S4 where T : P5 {} diff --git a/test/decl/var/properties.swift b/test/decl/var/properties.swift index 1aa4e820d77db..604248c7ef9e4 100644 --- a/test/decl/var/properties.swift +++ b/test/decl/var/properties.swift @@ -268,7 +268,7 @@ var computed_prop_with_init_1: X { // FIXME: Redundant error below var x2 { // expected-error{{computed property must have an explicit type}} expected-error{{type annotation missing in pattern}} get { - return _x + return _x // expected-error{{unexpected non-void return value in void function}} } } diff --git a/validation-test/IDE/crashers/032-swift-expr-propagatelvalueaccesskind.swift b/validation-test/IDE/crashers/032-swift-expr-propagatelvalueaccesskind.swift index f7bf01e7ca10e..7166355870978 100644 --- a/validation-test/IDE/crashers/032-swift-expr-propagatelvalueaccesskind.swift +++ b/validation-test/IDE/crashers/032-swift-expr-propagatelvalueaccesskind.swift @@ -1,3 +1,2 @@ // RUN: not --crash %target-swift-ide-test -code-completion -code-completion-token=A -source-filename=%s -// REQUIRES: asserts {()=(var a{#^A^# diff --git a/validation-test/compiler_crashers/28209-swift-protocoldecl-requiresclassslow.swift b/validation-test/compiler_crashers_fixed/28209-swift-protocoldecl-requiresclassslow.swift similarity index 79% rename from validation-test/compiler_crashers/28209-swift-protocoldecl-requiresclassslow.swift rename to validation-test/compiler_crashers_fixed/28209-swift-protocoldecl-requiresclassslow.swift index 96632c787838c..6722f2ecdf875 100644 --- a/validation-test/compiler_crashers/28209-swift-protocoldecl-requiresclassslow.swift +++ b/validation-test/compiler_crashers_fixed/28209-swift-protocoldecl-requiresclassslow.swift @@ -1,4 +1,4 @@ -// RUN: not --crash %target-swift-frontend %s -typecheck +// RUN: not %target-swift-frontend %s -typecheck // REQUIRES: asserts // Distributed under the terms of the MIT license diff --git a/validation-test/compiler_crashers/28351-swift-functiontype-get.swift b/validation-test/compiler_crashers_fixed/28351-swift-functiontype-get.swift similarity index 87% rename from validation-test/compiler_crashers/28351-swift-functiontype-get.swift rename to validation-test/compiler_crashers_fixed/28351-swift-functiontype-get.swift index ddfbc85ec5529..cebd12d520ec6 100644 --- a/validation-test/compiler_crashers/28351-swift-functiontype-get.swift +++ b/validation-test/compiler_crashers_fixed/28351-swift-functiontype-get.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 -typecheck +// RUN: not %target-swift-frontend %s -typecheck extension A{{}protocol A}protocol A:class{protocol A{}typealias e:A diff --git a/validation-test/compiler_crashers/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift b/validation-test/compiler_crashers_fixed/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift similarity index 89% rename from validation-test/compiler_crashers/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift rename to validation-test/compiler_crashers_fixed/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift index 545651a9cf3c6..54a182bef1213 100644 --- a/validation-test/compiler_crashers/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift +++ b/validation-test/compiler_crashers_fixed/28392-swift-dependentgenerictyperesolver-resolveselfassociatedtype.swift @@ -5,7 +5,7 @@ // 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 -typecheck +// RUN: not %target-swift-frontend %s -typecheck // REQUIRES: asserts { class A{ diff --git a/validation-test/compiler_crashers/28408-swift-typechecker-checkinheritanceclause.swift b/validation-test/compiler_crashers_fixed/28408-swift-typechecker-checkinheritanceclause.swift similarity index 89% rename from validation-test/compiler_crashers/28408-swift-typechecker-checkinheritanceclause.swift rename to validation-test/compiler_crashers_fixed/28408-swift-typechecker-checkinheritanceclause.swift index 985fc54a30d7a..624a4684226f5 100644 --- a/validation-test/compiler_crashers/28408-swift-typechecker-checkinheritanceclause.swift +++ b/validation-test/compiler_crashers_fixed/28408-swift-typechecker-checkinheritanceclause.swift @@ -5,7 +5,7 @@ // 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 -typecheck +// RUN: not %target-swift-frontend %s -typecheck // REQUIRES: asserts class A{{ { diff --git a/validation-test/compiler_crashers/28423-swift-typechecker-validatedecl.swift b/validation-test/compiler_crashers_fixed/28423-swift-typechecker-validatedecl.swift similarity index 88% rename from validation-test/compiler_crashers/28423-swift-typechecker-validatedecl.swift rename to validation-test/compiler_crashers_fixed/28423-swift-typechecker-validatedecl.swift index d2db33d49c342..0818a1c742db6 100644 --- a/validation-test/compiler_crashers/28423-swift-typechecker-validatedecl.swift +++ b/validation-test/compiler_crashers_fixed/28423-swift-typechecker-validatedecl.swift @@ -5,7 +5,7 @@ // 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 -typecheck +// RUN: not %target-swift-frontend %s -typecheck // REQUIRES: asserts protocol a protocol a{ diff --git a/validation-test/compiler_crashers/28435-swift-genericenvironment-maptypeintocontext.swift b/validation-test/compiler_crashers_fixed/28435-swift-genericenvironment-maptypeintocontext.swift similarity index 88% rename from validation-test/compiler_crashers/28435-swift-genericenvironment-maptypeintocontext.swift rename to validation-test/compiler_crashers_fixed/28435-swift-genericenvironment-maptypeintocontext.swift index cc294ba3d9d45..10118dab66bf0 100644 --- a/validation-test/compiler_crashers/28435-swift-genericenvironment-maptypeintocontext.swift +++ b/validation-test/compiler_crashers_fixed/28435-swift-genericenvironment-maptypeintocontext.swift @@ -5,7 +5,7 @@ // 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 -typecheck +// RUN: not %target-swift-frontend %s -typecheck enum ST:d protocol a{typealias d:A.B{ { diff --git a/validation-test/compiler_crashers/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift b/validation-test/compiler_crashers_fixed/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift similarity index 89% rename from validation-test/compiler_crashers/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift rename to validation-test/compiler_crashers_fixed/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift index d56d2ac701ad7..36fc317cecc42 100644 --- a/validation-test/compiler_crashers/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift +++ b/validation-test/compiler_crashers_fixed/28453-found-interfacetoarchetypemap-end-missing-generic-parameter-failed.swift @@ -5,7 +5,7 @@ // 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 // REQUIRES: asserts protocol a{}protocol a{ typealias e=a diff --git a/validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift~13e17147798fd3fdc17a53aabf4fe6450eb7c91e b/validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift~13e17147798fd3fdc17a53aabf4fe6450eb7c91e new file mode 100644 index 0000000000000..ff2d2222361f6 --- /dev/null +++ b/validation-test/compiler_crashers_fixed/28466-segfault-0xc27624-0xc2741f-0xc25bb5-0xbcdbbb.swift~13e17147798fd3fdc17a53aabf4fe6450eb7c91e @@ -0,0 +1,9 @@ +// This source file is part of the Swift.org open source project +// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors + +// RUN: not %target-swift-frontend %s -emit-ir +{associatedtype bfunc c:[T diff --git a/validation-test/compiler_crashers/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift b/validation-test/compiler_crashers_fixed/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift similarity index 88% rename from validation-test/compiler_crashers/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift rename to validation-test/compiler_crashers_fixed/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift index daa3a459981d6..d8ce8eb157165 100644 --- a/validation-test/compiler_crashers/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift +++ b/validation-test/compiler_crashers_fixed/28471-anonymous-namespace-verifier-verifychecked-swift-type-llvm-smallptrset-swift-arc.swift @@ -5,7 +5,7 @@ // 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 guard{protocol A{ protocol a{}protocol a{typealias d:A{}typealias e class A{ diff --git a/validation-test/compiler_crashers/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift b/validation-test/compiler_crashers_fixed/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift similarity index 87% rename from validation-test/compiler_crashers/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift rename to validation-test/compiler_crashers_fixed/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift index 3148a608aaa0a..ddf31588d4286 100644 --- a/validation-test/compiler_crashers/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift +++ b/validation-test/compiler_crashers_fixed/28545-swift-archetypebuilder-potentialarchetype-gettype-swift-archetypebuilder.swift @@ -5,7 +5,7 @@ // 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 struct B<>:A protocol A{ typealias d:A.B