Merge pull request #7650 from kballard/urlerror_swift_cases
[swift-3.1-branch][SDK] Convert URLError.Code to a struct and add missing cases
diff --git a/include/swift/AST/Decl.h b/include/swift/AST/Decl.h
index dd20760..bc41986 100644
--- a/include/swift/AST/Decl.h
+++ b/include/swift/AST/Decl.h
@@ -504,8 +504,11 @@
/// it is implicit. This bit is used during parsing and type-checking to
/// control inserting the implicit destructor.
unsigned HasDestructorDecl : 1;
+
+ /// Whether the class has @objc ancestry.
+ unsigned ObjCClassKind : 3;
};
- enum { NumClassDeclBits = NumNominalTypeDeclBits + 8 };
+ enum { NumClassDeclBits = NumNominalTypeDeclBits + 11 };
static_assert(NumClassDeclBits <= 32, "fits in an unsigned");
class StructDeclBitfields {
@@ -2062,6 +2065,11 @@
/// swift code.
bool isDefinition() const;
+ /// \brief Return true if this protocol member is a protocol requirement.
+ ///
+ /// Asserts if this is not a member of a protocol.
+ bool isProtocolRequirement() const;
+
/// Determine whether we have already checked whether this
/// declaration is a redeclaration.
bool alreadyCheckedRedeclaration() const {
diff --git a/include/swift/AST/ProtocolConformance.h b/include/swift/AST/ProtocolConformance.h
index 4069fcb..aad9daa 100644
--- a/include/swift/AST/ProtocolConformance.h
+++ b/include/swift/AST/ProtocolConformance.h
@@ -218,11 +218,9 @@
if (!valueReq || isa<AssociatedTypeDecl>(valueReq) ||
valueReq->isInvalid())
continue;
-
- // Ignore accessors.
- if (auto *FD = dyn_cast<FuncDecl>(valueReq))
- if (FD->isAccessor())
- continue;
+
+ if (!valueReq->isProtocolRequirement())
+ continue;
// If we don't have and cannot resolve witnesses, skip it.
if (!resolver && !hasWitness(valueReq))
diff --git a/lib/AST/ArchetypeBuilder.cpp b/lib/AST/ArchetypeBuilder.cpp
index c793f0d..a44a351 100644
--- a/lib/AST/ArchetypeBuilder.cpp
+++ b/lib/AST/ArchetypeBuilder.cpp
@@ -513,7 +513,9 @@
// of one of the protocols to which the parent potential
// archetype conforms.
for (auto &conforms : ConformsTo) {
- for (auto member : conforms.first->lookupDirect(nestedName)) {
+ auto *proto = conforms.first;
+
+ for (auto member : proto->lookupDirect(nestedName)) {
PotentialArchetype *pa;
if (auto assocType = dyn_cast<AssociatedTypeDecl>(member)) {
@@ -529,6 +531,11 @@
continue;
auto type = alias->getDeclaredInterfaceType();
+ TypeSubstitutionMap subs;
+ subs[cast<GenericTypeParamType>(proto->getSelfInterfaceType()->getCanonicalType())]
+ = getDependentType({}, true);
+ type = type.subst(QueryTypeSubstitutionMap{subs},
+ builder.Impl->LookupConformance);
if (auto existingPA = builder.resolveArchetype(type)) {
builder.addSameTypeRequirementBetweenArchetypes(pa, existingPA,
redundantSource);
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index 3daf7f1..b46922c 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -1673,6 +1673,18 @@
return NTD->getSatisfiedProtocolRequirementsForMember(this, Sorted);
}
+bool ValueDecl::isProtocolRequirement() const {
+ assert(isa<ProtocolDecl>(getDeclContext()));
+
+ if (auto *FD = dyn_cast<FuncDecl>(this))
+ if (FD->isAccessor())
+ return false;
+ if (isa<TypeAliasDecl>(this) ||
+ isa<NominalTypeDecl>(this))
+ return false;
+ return true;
+}
+
bool ValueDecl::hasInterfaceType() const {
return !TypeAndAccess.getPointer().isNull();
}
@@ -2407,6 +2419,7 @@
= static_cast<unsigned>(StoredInheritsSuperclassInits::Unchecked);
ClassDeclBits.RawForeignKind = 0;
ClassDeclBits.HasDestructorDecl = 0;
+ ClassDeclBits.ObjCClassKind = 0;
}
DestructorDecl *ClassDecl::getDestructor() {
@@ -2500,6 +2513,10 @@
}
ObjCClassKind ClassDecl::checkObjCAncestry() const {
+ // See if we've already computed this.
+ if (ClassDeclBits.ObjCClassKind)
+ return ObjCClassKind(ClassDeclBits.ObjCClassKind - 1);
+
llvm::SmallPtrSet<const ClassDecl *, 8> visited;
bool genericAncestry = false, isObjC = false;
const ClassDecl *CD = this;
@@ -2526,14 +2543,18 @@
break;
}
+ ObjCClassKind kind = ObjCClassKind::ObjC;
if (!isObjC)
- return ObjCClassKind::NonObjC;
- if (genericAncestry)
- return ObjCClassKind::ObjCMembers;
- if (CD == this || !CD->isObjC())
- return ObjCClassKind::ObjCWithSwiftRoot;
+ kind = ObjCClassKind::NonObjC;
+ else if (genericAncestry)
+ kind = ObjCClassKind::ObjCMembers;
+ else if (CD == this || !CD->isObjC())
+ kind = ObjCClassKind::ObjCWithSwiftRoot;
- return ObjCClassKind::ObjC;
+ // Save the result for later.
+ const_cast<ClassDecl *>(this)->ClassDeclBits.ObjCClassKind
+ = unsigned(kind) + 1;
+ return kind;
}
/// Mangle the name of a protocol or class for use in the Objective-C
diff --git a/lib/AST/ProtocolConformance.cpp b/lib/AST/ProtocolConformance.cpp
index 3bb2ffb..c0c2e86 100644
--- a/lib/AST/ProtocolConformance.cpp
+++ b/lib/AST/ProtocolConformance.cpp
@@ -320,6 +320,8 @@
Witness NormalProtocolConformance::getWitness(ValueDecl *requirement,
LazyResolver *resolver) const {
assert(!isa<AssociatedTypeDecl>(requirement) && "Request type witness");
+ assert(requirement->isProtocolRequirement() && "Not a requirement");
+
if (Resolver)
resolveLazyInfo();
diff --git a/lib/ClangImporter/ImportDecl.cpp b/lib/ClangImporter/ImportDecl.cpp
index 5f836c3..51ce7cb 100644
--- a/lib/ClangImporter/ImportDecl.cpp
+++ b/lib/ClangImporter/ImportDecl.cpp
@@ -4027,18 +4027,8 @@
}
Decl *VisitObjCInterfaceDecl(const clang::ObjCInterfaceDecl *decl) {
- Optional<ImportedName> correctSwiftName;
- auto importedName = importFullName(decl, correctSwiftName);
- if (!importedName) return nullptr;
-
- // If we've been asked to produce a Swift 2 stub, handle it via a
- // typealias.
- if (correctSwiftName)
- return importSwift2TypeAlias(decl, importedName, *correctSwiftName);
-
- auto name = importedName.getDeclName().getBaseName();
-
- auto createRootClass = [=](DeclContext *dc = nullptr) -> ClassDecl * {
+ auto createRootClass = [=](Identifier name,
+ DeclContext *dc = nullptr) -> ClassDecl * {
if (!dc) {
dc = Impl.getClangModuleForDecl(decl->getCanonicalDecl(),
/*allowForwardDeclaration=*/true);
@@ -4073,11 +4063,26 @@
const ClassDecl *nsObjectDecl =
nsObjectTy->getClassOrBoundGenericClass();
- auto result = createRootClass(nsObjectDecl->getDeclContext());
+ auto result = createRootClass(Impl.SwiftContext.Id_Protocol,
+ nsObjectDecl->getDeclContext());
result->setForeignClassKind(ClassDecl::ForeignKind::RuntimeOnly);
return result;
}
+ if (auto *definition = decl->getDefinition())
+ decl = definition;
+
+ Optional<ImportedName> correctSwiftName;
+ auto importedName = importFullName(decl, correctSwiftName);
+ if (!importedName) return nullptr;
+
+ // If we've been asked to produce a Swift 2 stub, handle it via a
+ // typealias.
+ if (correctSwiftName)
+ return importSwift2TypeAlias(decl, importedName, *correctSwiftName);
+
+ auto name = importedName.getDeclName().getBaseName();
+
if (!decl->hasDefinition()) {
// Check if this class is implemented in its adapter.
if (auto clangModule = Impl.getClangModuleForDecl(decl, true)) {
@@ -4089,7 +4094,7 @@
if (Impl.ImportForwardDeclarations) {
// Fake it by making an unavailable opaque @objc root class.
- auto result = createRootClass();
+ auto result = createRootClass(name);
result->setImplicit();
auto attr = AvailableAttr::createPlatformAgnostic(Impl.SwiftContext,
"This Objective-C class has only been forward-declared; "
@@ -4102,9 +4107,6 @@
return nullptr;
}
- decl = decl->getDefinition();
- assert(decl);
-
auto dc =
Impl.importDeclContextOf(decl, importedName.getEffectiveContext());
if (!dc)
diff --git a/lib/Sema/CSSolver.cpp b/lib/Sema/CSSolver.cpp
index 2839b1d..fa403ed 100644
--- a/lib/Sema/CSSolver.cpp
+++ b/lib/Sema/CSSolver.cpp
@@ -2075,6 +2075,15 @@
constraintComponent[constraint] = components[i];
}
+ // Add the orphaned components to the mapping from constraints to components.
+ unsigned firstOrphanedConstraint =
+ numComponents - CG.getOrphanedConstraints().size();
+ {
+ unsigned component = firstOrphanedConstraint;
+ for (auto constraint : CG.getOrphanedConstraints())
+ constraintComponent[constraint] = component++;
+ }
+
// Sort the constraints into buckets based on component number.
std::unique_ptr<ConstraintList[]> constraintBuckets(
new ConstraintList[numComponents]);
@@ -2084,6 +2093,9 @@
constraintBuckets[constraintComponent[constraint]].push_back(constraint);
}
+ // Remove all of the orphaned constraints; we'll introduce them as needed.
+ auto allOrphanedConstraints = CG.takeOrphanedConstraints();
+
// Function object that returns all constraints placed into buckets
// back to the list of constraints.
auto returnAllConstraints = [&] {
@@ -2092,6 +2104,7 @@
InactiveConstraints.splice(InactiveConstraints.end(),
constraintBuckets[component]);
}
+ CG.setOrphanedConstraints(std::move(allOrphanedConstraints));
};
// Compute the partial solutions produced for each connected component.
@@ -2104,24 +2117,31 @@
++solverState->NumComponentsSplit;
// Collect the constraints for this component.
- InactiveConstraints.splice(InactiveConstraints.end(),
+ InactiveConstraints.splice(InactiveConstraints.end(),
constraintBuckets[component]);
- // Collect the type variables that are not part of a different
- // component; this includes type variables that are part of the
- // component as well as already-resolved type variables.
- // FIXME: The latter could be avoided if we had already
- // substituted all of those other type variables through.
- llvm::SmallVector<TypeVariableType *, 16> allTypeVariables
+ llvm::SmallVector<TypeVariableType *, 16> allTypeVariables
= std::move(TypeVariables);
- for (auto typeVar : allTypeVariables) {
- auto known = typeVarComponent.find(typeVar);
- if (known != typeVarComponent.end() && known->second != component)
- continue;
- TypeVariables.push_back(typeVar);
+ Constraint *orphaned = nullptr;
+ if (component < firstOrphanedConstraint) {
+ // Collect the type variables that are not part of a different
+ // component; this includes type variables that are part of the
+ // component as well as already-resolved type variables.
+ for (auto typeVar : allTypeVariables) {
+ auto known = typeVarComponent.find(typeVar);
+ if (known != typeVarComponent.end() && known->second != component)
+ continue;
+
+ TypeVariables.push_back(typeVar);
+ }
+ } else {
+ // Get the orphaned constraint.
+ assert(InactiveConstraints.size() == 1 && "supposed to be an orphan!");
+ orphaned = &InactiveConstraints.front();
}
-
+ CG.setOrphanedConstraint(orphaned);
+
// Solve for this component. If it fails, we're done.
bool failed;
if (TC.getLangOpts().DebugConstraintSolver) {
diff --git a/lib/Sema/CodeSynthesis.cpp b/lib/Sema/CodeSynthesis.cpp
index 9ff6f65..b689c6d 100644
--- a/lib/Sema/CodeSynthesis.cpp
+++ b/lib/Sema/CodeSynthesis.cpp
@@ -262,12 +262,31 @@
AbstractStorageDecl *storage,
TypeChecker &TC) {
auto *DC = storage->getDeclContext();
- if (isa<ProtocolDecl>(DC) || isa<ClassDecl>(DC))
+ auto *nominalDecl = DC->getAsNominalTypeOrNominalTypeExtensionContext();
+
+ // Global variable accessors are not @_transparent.
+ if (!nominalDecl)
return;
- auto *nominal = DC->getAsNominalTypeOrNominalTypeExtensionContext();
- if (nominal && nominal->hasFixedLayout())
- accessor->getAttrs().add(new (TC.Context) TransparentAttr(IsImplicit));
+ // Accessors for stored properties of resilient types are not
+ // @_transparent.
+ if (!nominalDecl->hasFixedLayout())
+ return;
+
+ // Accessors for protocol storage requirements are never @_transparent
+ // since they do not have bodies.
+ //
+ // FIXME: Revisit this if we ever get 'real' default implementations.
+ if (isa<ProtocolDecl>(nominalDecl))
+ return;
+
+ // Accessors for classes with @objc ancestry are not @_transparent,
+ // since they use a field offset variable which is not exported.
+ if (auto *classDecl = dyn_cast<ClassDecl>(nominalDecl))
+ if (classDecl->checkObjCAncestry() != ObjCClassKind::NonObjC)
+ return;
+
+ accessor->getAttrs().add(new (TC.Context) TransparentAttr(IsImplicit));
}
static FuncDecl *createMaterializeForSetPrototype(AbstractStorageDecl *storage,
diff --git a/lib/Sema/ConstraintGraph.cpp b/lib/Sema/ConstraintGraph.cpp
index 016be84..d4ddce5 100644
--- a/lib/Sema/ConstraintGraph.cpp
+++ b/lib/Sema/ConstraintGraph.cpp
@@ -349,6 +349,12 @@
}
}
+ // If the constraint doesn't reference any type variables, it's orphaned;
+ // track it as such.
+ if (referencedTypeVars.empty()) {
+ OrphanedConstraints.push_back(constraint);
+ }
+
// Record the change, if there are active scopes.
if (ActiveScope)
Changes.push_back(Change::addedConstraint(constraint));
@@ -375,6 +381,16 @@
}
}
+ // If this is an orphaned constraint, remove it from the list.
+ if (referencedTypeVars.empty()) {
+ auto known = std::find(OrphanedConstraints.begin(),
+ OrphanedConstraints.end(),
+ constraint);
+ assert(known != OrphanedConstraints.end() && "missing orphaned constraint");
+ *known = OrphanedConstraints.back();
+ OrphanedConstraints.pop_back();
+ }
+
// Record the change, if there are active scopes.
if (ActiveScope)
Changes.push_back(Change::removedConstraint(constraint));
@@ -578,9 +594,9 @@
if (CS.getFixedType(TypeVariables[i]))
continue;
- // If we only care about a subset, and this type variable isn't in that
- // subset, skip it.
- if (!typeVarSubset.empty() && typeVarSubset.count(TypeVariables[i]) == 0)
+ // If this type variable isn't in the subset of type variables we care
+ // about, skip it.
+ if (typeVarSubset.count(TypeVariables[i]) == 0)
continue;
componentHasUnboundTypeVar[components[i]] = true;
@@ -611,7 +627,7 @@
}
components.erase(components.begin() + outIndex, components.end());
- return numComponents;
+ return numComponents + getOrphanedConstraints().size();
}
@@ -861,6 +877,7 @@
void ConstraintGraph::printConnectedComponents(llvm::raw_ostream &out) {
SmallVector<TypeVariableType *, 16> typeVars;
+ typeVars.append(TypeVariables.begin(), TypeVariables.end());
SmallVector<unsigned, 16> components;
unsigned numComponents = computeConnectedComponents(typeVars, components);
for (unsigned component = 0; component != numComponents; ++component) {
diff --git a/lib/Sema/ConstraintGraph.h b/lib/Sema/ConstraintGraph.h
index b065e0f..e34d6a5 100644
--- a/lib/Sema/ConstraintGraph.h
+++ b/lib/Sema/ConstraintGraph.h
@@ -237,18 +237,47 @@
/// Compute the connected components of the graph.
///
- /// \param typeVars The type variables that occur within the
- /// connected components. If a non-empty vector is passed in, the algorithm
- /// will only consider type variables reachable from the initial set.
+ /// \param typeVars The type variables that should be included in the
+ /// set of connected components that are returned.
///
/// \param components Receives the component numbers for each type variable
/// in \c typeVars.
///
- /// \returns the number of connected components in the graph.
+ /// \returns the number of connected components in the graph, which includes
+ /// one component for each of the constraints produced by
+ /// \c getOrphanedConstraints().
unsigned computeConnectedComponents(
SmallVectorImpl<TypeVariableType *> &typeVars,
SmallVectorImpl<unsigned> &components);
+ /// Retrieve the set of "orphaned" constraints, which are known to the
+ /// constraint graph but have no type variables to anchor them.
+ ArrayRef<Constraint *> getOrphanedConstraints() const {
+ return OrphanedConstraints;
+ }
+
+ /// Replace the orphaned constraints with the constraints in the given list,
+ /// returning the old set of orphaned constraints.
+ SmallVector<Constraint *, 4> takeOrphanedConstraints() {
+ auto result = std::move(OrphanedConstraints);
+ OrphanedConstraints.clear();
+ return result;
+ }
+
+ /// Set the orphaned constraints.
+ void setOrphanedConstraints(SmallVector<Constraint *, 4> &&newConstraints) {
+ OrphanedConstraints = std::move(newConstraints);
+ }
+
+ /// Set the list of orphaned constraints to a single constraint.
+ ///
+ /// If \c orphaned is null, just clear out the list.
+ void setOrphanedConstraint(Constraint *orphaned) {
+ OrphanedConstraints.clear();
+ if (orphaned)
+ OrphanedConstraints.push_back(orphaned);
+ }
+
/// Print the graph.
void print(llvm::raw_ostream &out);
@@ -300,6 +329,9 @@
/// The type variables in this graph, in stable order.
SmallVector<TypeVariableType *, 4> TypeVariables;
+ /// Constraints that are "orphaned" because they contain no type variables.
+ SmallVector<Constraint *, 4> OrphanedConstraints;
+
/// The kind of change made to the graph.
enum class ChangeKind {
/// Added a type variable.
diff --git a/lib/Sema/TypeCheckNameLookup.cpp b/lib/Sema/TypeCheckNameLookup.cpp
index b18a75b..c088c3c 100644
--- a/lib/Sema/TypeCheckNameLookup.cpp
+++ b/lib/Sema/TypeCheckNameLookup.cpp
@@ -155,7 +155,7 @@
witness = concrete->getTypeWitnessSubstAndDecl(assocType, &TC)
.second;
- } else if (TC.isRequirement(found)) {
+ } else if (found->isProtocolRequirement()) {
witness = concrete->getWitness(found, &TC).getDecl();
}
diff --git a/lib/Sema/TypeCheckProtocol.cpp b/lib/Sema/TypeCheckProtocol.cpp
index 0210907..e724eec 100644
--- a/lib/Sema/TypeCheckProtocol.cpp
+++ b/lib/Sema/TypeCheckProtocol.cpp
@@ -4307,7 +4307,7 @@
return;
}
- if (!TC.isRequirement(requirement))
+ if (!requirement->isProtocolRequirement())
return;
// Resolve all associated types before trying to resolve this witness.
@@ -4459,7 +4459,7 @@
continue;
// Type aliases don't have requirements themselves.
- if (!TC.isRequirement(requirement))
+ if (!requirement->isProtocolRequirement())
continue;
/// Local function to finalize the witness.
@@ -5484,7 +5484,7 @@
auto proto = conformance->getProtocol();
for (auto member : proto->getMembers()) {
auto req = dyn_cast<ValueDecl>(member);
- if (!req) continue;
+ if (!req || !req->isProtocolRequirement()) continue;
// If the requirement is unsatisfied, we might want to warn
// about near misses; record it.
@@ -5936,17 +5936,6 @@
storage);
}
-// Not all protocol members are requirements.
-bool TypeChecker::isRequirement(ValueDecl *requirement) {
- if (auto *FD = dyn_cast<FuncDecl>(requirement))
- if (FD->isAccessor())
- return false;
- if (isa<TypeAliasDecl>(requirement) ||
- isa<NominalTypeDecl>(requirement))
- return false;
- return true;
-}
-
void TypeChecker::inferDefaultWitnesses(ProtocolDecl *proto) {
DefaultWitnessChecker checker(*this, proto);
@@ -5961,7 +5950,7 @@
if (isa<TypeDecl>(valueDecl))
continue;
- if (!isRequirement(valueDecl))
+ if (!valueDecl->isProtocolRequirement())
continue;
checker.resolveWitnessViaLookup(valueDecl);
diff --git a/lib/Sema/TypeChecker.h b/lib/Sema/TypeChecker.h
index 0e95e74..44681aa 100644
--- a/lib/Sema/TypeChecker.h
+++ b/lib/Sema/TypeChecker.h
@@ -1094,9 +1094,6 @@
/// Introduce the accessors for a 'lazy' variable.
void introduceLazyVarAccessors(VarDecl *var) override;
- // Not all protocol members are requirements.
- bool isRequirement(ValueDecl *requirement);
-
/// Infer default value witnesses for all requirements in the given protocol.
void inferDefaultWitnesses(ProtocolDecl *proto);
diff --git a/stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb b/stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb
index fa6c8ca..87233b9 100644
--- a/stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb
+++ b/stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb
@@ -980,6 +980,9 @@
let crashOutput = crashStdout + crashStderr
for expectedSubstring in t.crashOutputMatches {
var found = false
+ if crashOutput.isEmpty && expectedSubstring.isEmpty {
+ found = true
+ }
for s in crashOutput {
if findSubstring(s, expectedSubstring) != nil {
found = true
diff --git a/test/ClangImporter/MixedSource/Inputs/import-mixed-framework-with-forward.h b/test/ClangImporter/MixedSource/Inputs/import-mixed-framework-with-forward.h
new file mode 100644
index 0000000..0e7305e
--- /dev/null
+++ b/test/ClangImporter/MixedSource/Inputs/import-mixed-framework-with-forward.h
@@ -0,0 +1,6 @@
+@class SwiftClass, SwiftClassWithCustomName;
+
+@interface BridgingHeader
++ (void)takeForward:(SwiftClass *)class;
++ (void)takeRenamedForward:(SwiftClassWithCustomName *)class;
+@end
diff --git a/test/ClangImporter/MixedSource/Inputs/mixed-framework/Mixed.framework/Headers/Mixed.h b/test/ClangImporter/MixedSource/Inputs/mixed-framework/Mixed.framework/Headers/Mixed.h
index 56853d5..422d0ca 100644
--- a/test/ClangImporter/MixedSource/Inputs/mixed-framework/Mixed.framework/Headers/Mixed.h
+++ b/test/ClangImporter/MixedSource/Inputs/mixed-framework/Mixed.framework/Headers/Mixed.h
@@ -1,3 +1,5 @@
+// Manual PrintAsObjC for testing purposes.
+
struct PureClangType {
int x;
int y;
@@ -16,7 +18,7 @@
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
-#ifndef SWIFT_EXTENSION(X)
+#ifndef SWIFT_EXTENSION
# define SWIFT_EXTENSION(X) X##__LINE__
#endif
diff --git a/test/ClangImporter/MixedSource/Inputs/resolve-cross-language/Base.swift b/test/ClangImporter/MixedSource/Inputs/resolve-cross-language/Base.swift
index 2b4bade..631e5d5 100644
--- a/test/ClangImporter/MixedSource/Inputs/resolve-cross-language/Base.swift
+++ b/test/ClangImporter/MixedSource/Inputs/resolve-cross-language/Base.swift
@@ -32,3 +32,9 @@
@objc public func getSwiftEnum() -> SwiftEnum { return .Quux }
public init() {}
}
+
+@objc(RenamedClass) public class SwiftClass {}
+
+public func getSwiftClass() -> SwiftClass {
+ return SwiftClass()
+}
diff --git a/test/ClangImporter/MixedSource/import-mixed-framework-with-forward.swift b/test/ClangImporter/MixedSource/import-mixed-framework-with-forward.swift
new file mode 100644
index 0000000..98152ee
--- /dev/null
+++ b/test/ClangImporter/MixedSource/import-mixed-framework-with-forward.swift
@@ -0,0 +1,20 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: cp -r %S/Inputs/mixed-framework/Mixed.framework %t
+
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-module -o %t/Mixed.framework/Modules/Mixed.swiftmodule/%target-swiftmodule-name %S/Inputs/mixed-framework/Mixed.swift -import-underlying-module -F %t -module-name Mixed -disable-objc-attr-requires-foundation-module
+
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -F %t -import-objc-header %S/Inputs/import-mixed-framework-with-forward.h %s -verify
+
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-pch -F %t %S/Inputs/import-mixed-framework-with-forward.h -o %t/bridge.pch
+// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -F %t -import-objc-header %t/bridge.pch %s -verify
+
+
+// REQUIRES: objc_interop
+
+import Mixed
+
+BridgingHeader.takeForward(SwiftClass(x: 42))
+BridgingHeader.takeRenamedForward(CustomNameClass())
+
+// Check that we're compiling at all.
+BridgingHeader.takeRenamedForward(SwiftClass(x: 42)) // expected-error {{cannot convert value of type 'SwiftClass' to expected argument type 'CustomNameClass!'}}
diff --git a/test/SILGen/accessibility_warnings.swift b/test/SILGen/accessibility_warnings.swift
index d1c928a..6934798 100644
--- a/test/SILGen/accessibility_warnings.swift
+++ b/test/SILGen/accessibility_warnings.swift
@@ -123,7 +123,7 @@
// CHECK-DAG: sil hidden{{( \[.+\])*}} @_TFC22accessibility_warnings13InternalClassg9publicVarSi
public var publicVar = 0
- // CHECK-DAG: sil hidden @_TFC22accessibility_warnings13InternalClassg19publicVarPrivateSetSi
+ // CHECK-DAG: sil hidden [transparent] @_TFC22accessibility_warnings13InternalClassg19publicVarPrivateSetSi
public private(set) var publicVarPrivateSet = 0
public public(set) var publicVarPublicSet = 0
diff --git a/test/SILGen/addressors.swift b/test/SILGen/addressors.swift
index d1d73d8..92ed235 100644
--- a/test/SILGen/addressors.swift
+++ b/test/SILGen/addressors.swift
@@ -306,7 +306,8 @@
}
}
}
-// CHECK: sil hidden @_TFC10addressors1Gg5valueVs5Int32 : $@convention(method) (@guaranteed G) -> Int32 {
+
+// CHECK: sil hidden [transparent] @_TFC10addressors1Gg5valueVs5Int32 : $@convention(method) (@guaranteed G) -> Int32 {
// CHECK: bb0([[SELF:%0]] : $G):
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Glo5valueVs5Int32 : $@convention(method) (@guaranteed G) -> (UnsafePointer<Int32>, @owned Builtin.NativeObject)
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
@@ -319,7 +320,7 @@
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
// CHECK: return [[VALUE]] : $Int32
-// CHECK: sil hidden @_TFC10addressors1Gs5valueVs5Int32 : $@convention(method) (Int32, @guaranteed G) -> () {
+// CHECK: sil hidden [transparent] @_TFC10addressors1Gs5valueVs5Int32 : $@convention(method) (Int32, @guaranteed G) -> () {
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $G):
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVs5Int32 : $@convention(method) (@guaranteed G) -> (UnsafeMutablePointer<Int32>, @owned Builtin.NativeObject)
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
@@ -332,7 +333,7 @@
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
// materializeForSet for G.value
-// CHECK-LABEL: sil hidden @_TFC10addressors1Gm5valueVs5Int32 : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed G) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Gm5valueVs5Int32 : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed G) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $G):
// Call the addressor.
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVs5Int32 : $@convention(method) (@guaranteed G) -> (UnsafeMutablePointer<Int32>, @owned Builtin.NativeObject)
@@ -356,7 +357,7 @@
// CHECK: return [[RESULT]]
// materializeForSet callback for G.value
-// CHECK-LABEL: sil hidden @_TFFC10addressors1Gm5valueVs5Int32U_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout G, @thick G.Type) -> () {
+// CHECK-LABEL: sil hidden [transparent] @_TFFC10addressors1Gm5valueVs5Int32U_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout G, @thick G.Type) -> () {
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $*G, [[SELFTYPE:%3]] : $@thick G.Type):
// CHECK: [[T0:%.*]] = project_value_buffer $Builtin.NativeObject in [[STORAGE]] : $*Builtin.UnsafeValueBuffer
// CHECK: [[OWNER:%.*]] = load [[T0]]
@@ -426,7 +427,8 @@
}
}
}
-// CHECK-LABEL: sil hidden @_TFC10addressors1Ig5valueVs5Int32 : $@convention(method) (@guaranteed I) -> Int32 {
+
+// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Ig5valueVs5Int32 : $@convention(method) (@guaranteed I) -> Int32 {
// CHECK: bb0([[SELF:%0]] : $I):
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Ilp5valueVs5Int32 : $@convention(method) (@guaranteed I) -> (UnsafePointer<Int32>, @owned Optional<Builtin.NativeObject>)
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
@@ -439,7 +441,7 @@
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
// CHECK: return [[VALUE]] : $Int32
-// CHECK-LABEL: sil hidden @_TFC10addressors1Is5valueVs5Int32 : $@convention(method) (Int32, @guaranteed I) -> () {
+// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Is5valueVs5Int32 : $@convention(method) (Int32, @guaranteed I) -> () {
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $I):
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVs5Int32 : $@convention(method) (@guaranteed I) -> (UnsafeMutablePointer<Int32>, @owned Optional<Builtin.NativeObject>)
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
@@ -451,7 +453,7 @@
// CHECK: store [[VALUE]] to [[T2]] : $*Int32
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
-// CHECK-LABEL: sil hidden @_TFC10addressors1Im5valueVs5Int32 : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed I) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Im5valueVs5Int32 : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed I) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $I):
// Call the addressor.
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVs5Int32 : $@convention(method) (@guaranteed I) -> (UnsafeMutablePointer<Int32>, @owned Optional<Builtin.NativeObject>)
@@ -475,7 +477,8 @@
// CHECK: return [[RESULT]]
// materializeForSet callback for I.value
-// CHECK-LABEL: sil hidden @_TFFC10addressors1Im5valueVs5Int32U_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout I, @thick I.Type) -> () {
+
+// CHECK-LABEL: sil hidden [transparent] @_TFFC10addressors1Im5valueVs5Int32U_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout I, @thick I.Type) -> () {
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $*I, [[SELFTYPE:%3]] : $@thick I.Type):
// CHECK: [[T0:%.*]] = project_value_buffer $Optional<Builtin.NativeObject> in [[STORAGE]] : $*Builtin.UnsafeValueBuffer
// CHECK: [[OWNER:%.*]] = load [[T0]]
diff --git a/test/SILGen/dynamic.swift b/test/SILGen/dynamic.swift
index f543ec7..8b6c8d7 100644
--- a/test/SILGen/dynamic.swift
+++ b/test/SILGen/dynamic.swift
@@ -68,8 +68,8 @@
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Fooc
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foo10objcMethod
-// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foog8objcPropSi
-// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foos8objcPropSi
+// CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC7dynamic3Foog8objcPropSi
+// CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC7dynamic3Foos8objcPropSi
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foog9subscriptFT4objcPs9AnyObject__Si
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foos9subscriptFT4objcPs9AnyObject__Si
@@ -81,8 +81,8 @@
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Fooc
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foo13dynamicMethod
-// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foog11dynamicPropSi
-// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foos11dynamicPropSi
+// CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC7dynamic3Foog11dynamicPropSi
+// CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC7dynamic3Foos11dynamicPropSi
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foog9subscriptFT7dynamicSi_Si
// CHECK-LABEL: sil hidden [thunk] @_TToFC7dynamic3Foos9subscriptFT7dynamicSi_Si
diff --git a/test/SILGen/guaranteed_self.swift b/test/SILGen/guaranteed_self.swift
index bfe3bf9..94356a2 100644
--- a/test/SILGen/guaranteed_self.swift
+++ b/test/SILGen/guaranteed_self.swift
@@ -320,7 +320,7 @@
self.bas()
}
- // CHECK-LABEL: sil hidden [thunk] @_TToFC15guaranteed_self1Cg5prop1Si : $@convention(objc_method) (C) -> Int
+ // CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC15guaranteed_self1Cg5prop1Si : $@convention(objc_method) (C) -> Int
// CHECK: bb0([[SELF:%.*]] : $C):
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
// CHECK: apply {{.*}}([[SELF_COPY]])
@@ -328,7 +328,7 @@
// CHECK-NOT: destroy_value [[SELF]]
// CHECK-NOT: destroy_value [[SELF_COPY]]
- // CHECK-LABEL: sil hidden [thunk] @_TToFC15guaranteed_self1Cs5prop1Si : $@convention(objc_method) (Int, C) -> ()
+ // CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC15guaranteed_self1Cs5prop1Si : $@convention(objc_method) (Int, C) -> ()
// CHECK: bb0({{.*}} [[SELF:%.*]] : $C):
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
// CHECK: apply {{.*}} [[SELF_COPY]]
diff --git a/test/SILGen/materializeForSet.swift b/test/SILGen/materializeForSet.swift
index f1d8667..16fb2e8 100644
--- a/test/SILGen/materializeForSet.swift
+++ b/test/SILGen/materializeForSet.swift
@@ -6,7 +6,7 @@
// The ordering here is unfortunate: we generate the property
// getters and setters after we've processed the decl.
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet4Basem8computedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet4Basem8computedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
// CHECK: [[ADDR:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet4Baseg8computedSi
@@ -20,7 +20,7 @@
// CHECK: return [[T4]] : $(Builtin.RawPointer, Optional<Builtin.RawPointer>)
// CHECK: }
-// CHECK-LABEL: sil hidden @_TFFC17materializeForSet4Basem8computedSiU_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout Base, @thick Base.Type) -> () {
+// CHECK-LABEL: sil hidden [transparent] @_TFFC17materializeForSet4Basem8computedSiU_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout Base, @thick Base.Type) -> () {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $*Base, [[SELFTYPE:%.*]] : $@thick Base.Type):
// CHECK: [[T0:%.*]] = load_borrow [[SELF]]
// CHECK: [[T1:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
@@ -28,7 +28,7 @@
// CHECK: [[SETTER:%.*]] = function_ref @_TFC17materializeForSet4Bases8computedSi
// CHECK: apply [[SETTER]]([[T2]], [[T0]])
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet4Basem6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet4Basem6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $Base, #Base.stored
// CHECK: [[T1:%.*]] = address_to_pointer [[T0]] : $*Int to $Builtin.RawPointer
@@ -205,7 +205,7 @@
didSet {}
}
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet9HasDidSetm6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg6storedSi
@@ -224,7 +224,7 @@
set(value) {}
}
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet9HasDidSetm8computedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm8computedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg8computedSi
@@ -244,7 +244,7 @@
didSet {}
}
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet15HasStoredDidSetm6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasStoredDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet15HasStoredDidSetm6storedSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasStoredDidSet) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasStoredDidSet):
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet15HasStoredDidSetg6storedSi
@@ -259,7 +259,7 @@
// CHECK: }
}
-// CHECK-LABEL: sil hidden @_TFFC17materializeForSet15HasStoredDidSetm6storedSiU_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout HasStoredDidSet, @thick HasStoredDidSet.Type) -> () {
+// CHECK-LABEL: sil hidden [transparent] @_TFFC17materializeForSet15HasStoredDidSetm6storedSiU_T_ : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout HasStoredDidSet, @thick HasStoredDidSet.Type) -> () {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $*HasStoredDidSet, [[METATYPE:%.*]] : $@thick HasStoredDidSet.Type):
// CHECK: [[SELF_VALUE:%.*]] = load_borrow [[SELF]] : $*HasStoredDidSet
// CHECK: [[BUFFER_ADDR:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Int
@@ -272,7 +272,8 @@
class HasWeak {
weak var weakvar: HasWeak?
}
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet7HasWeakm7weakvarXwGSqS0__ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasWeak) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet7HasWeakm7weakvarXwGSqS0__ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasWeak) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasWeak):
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to [strict] $*Optional<HasWeak>
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $HasWeak, #HasWeak.weakvar
@@ -486,7 +487,7 @@
// Test for materializeForSet vs lazy properties of classes.
-// CHECK-LABEL: sil hidden @_TFC17materializeForSet17LazyClassPropertym3catSi
+// CHECK-LABEL: sil hidden [transparent] @_TFC17materializeForSet17LazyClassPropertym3catSi
class LazyClassProperty {
lazy var cat: Int = 5
diff --git a/test/SILGen/multi_file.swift b/test/SILGen/multi_file.swift
index 1231461..c5fa497 100644
--- a/test/SILGen/multi_file.swift
+++ b/test/SILGen/multi_file.swift
@@ -46,5 +46,7 @@
set {}
}
}
-// CHECK-LABEL: sil hidden @_TFC10multi_file19HasComputedPropertym3fooSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasComputedProperty) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+
+// CHECK-LABEL: sil hidden [transparent] @_TFC10multi_file19HasComputedPropertym3fooSi : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasComputedProperty) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC10multi_file19HasComputedPropertyS_20ProtocolWithPropertyS_FS1_m3fooSi : $@convention(witness_method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout HasComputedProperty) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+
diff --git a/test/SILGen/objc_extensions.swift b/test/SILGen/objc_extensions.swift
index adbde1b..834bb20 100644
--- a/test/SILGen/objc_extensions.swift
+++ b/test/SILGen/objc_extensions.swift
@@ -15,7 +15,7 @@
// Make sure that we are generating the @objc thunk and are calling the actual method.
//
- // CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC15objc_extensions3Subg4propGSQSS_ : $@convention(objc_method) (Sub) -> @autoreleased Optional<NSString> {
+ // CHECK-LABEL: sil hidden [thunk] @_TToFC15objc_extensions3Subg4propGSQSS_ : $@convention(objc_method) (Sub) -> @autoreleased Optional<NSString> {
// CHECK: bb0([[SELF:%.*]] : $Sub):
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
// CHECK: [[GETTER_FUNC:%.*]] = function_ref @_TFC15objc_extensions3Subg4propGSQSS_ : $@convention(method) (@guaranteed Sub) -> @owned Optional<String>
@@ -24,7 +24,7 @@
// CHECK: } // end sil function '_TToFC15objc_extensions3Subg4propGSQSS_'
// Then check the body of the getter calls the super_method.
- // CHECK-LABEL: sil hidden [transparent] @_TFC15objc_extensions3Subg4propGSQSS_ : $@convention(method) (@guaranteed Sub) -> @owned Optional<String> {
+ // CHECK-LABEL: sil hidden @_TFC15objc_extensions3Subg4propGSQSS_ : $@convention(method) (@guaranteed Sub) -> @owned Optional<String> {
// CHECK: bb0([[SELF:%.*]] : $Sub):
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
// CHECK: [[SELF_COPY_CAST:%.*]] = upcast [[SELF_COPY]] : $Sub to $Base
diff --git a/test/SILGen/objc_final.swift b/test/SILGen/objc_final.swift
index 72dbb8b..8eb656b 100644
--- a/test/SILGen/objc_final.swift
+++ b/test/SILGen/objc_final.swift
@@ -9,8 +9,8 @@
// CHECK-LABEL: sil hidden [thunk] @_TToFC10objc_final3Foo3foo
@objc var prop: Int = 0
- // CHECK-LABEL: sil hidden [thunk] @_TToFC10objc_final3Foog4propSi
- // CHECK-LABEL: sil hidden [thunk] @_TToFC10objc_final3Foos4propSi
+ // CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC10objc_final3Foog4propSi
+ // CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC10objc_final3Foos4propSi
}
// CHECK-LABEL: sil hidden @_TF10objc_final7callFooFCS_3FooT_
diff --git a/test/SILGen/objc_properties.swift b/test/SILGen/objc_properties.swift
index ef3d2c0..3c5f3b7 100644
--- a/test/SILGen/objc_properties.swift
+++ b/test/SILGen/objc_properties.swift
@@ -100,7 +100,7 @@
// Test the @NSCopying attribute.
class TestNSCopying {
- // CHECK-LABEL: sil hidden @_TFC15objc_properties13TestNSCopyings8propertyCSo8NSString : $@convention(method) (@owned NSString, @guaranteed TestNSCopying) -> ()
+ // CHECK-LABEL: sil hidden [transparent] @_TFC15objc_properties13TestNSCopyings8propertyCSo8NSString : $@convention(method) (@owned NSString, @guaranteed TestNSCopying) -> ()
// CHECK: bb0(%0 : $NSString, %1 : $TestNSCopying):
// CHECK: class_method [volatile] %0 : $NSString, #NSString.copy!1.foreign
@NSCopying var property : NSString
diff --git a/test/SILGen/objc_protocols.swift b/test/SILGen/objc_protocols.swift
index 0d8f7c8..06c0c2d 100644
--- a/test/SILGen/objc_protocols.swift
+++ b/test/SILGen/objc_protocols.swift
@@ -216,8 +216,7 @@
}
extension StoredPropertyCount: NSCounting {}
-// CHECK-LABEL: sil hidden [thunk] @_TToFC14objc_protocols19StoredPropertyCountg5countSi
-
+// CHECK-LABEL: sil hidden [transparent] [thunk] @_TToFC14objc_protocols19StoredPropertyCountg5countSi
class ComputedPropertyCount {
@objc var count: Int { return 0 }
}
diff --git a/test/SILGen/objc_witnesses.swift b/test/SILGen/objc_witnesses.swift
index 57b341f..9598596 100644
--- a/test/SILGen/objc_witnesses.swift
+++ b/test/SILGen/objc_witnesses.swift
@@ -89,5 +89,6 @@
public dynamic var spin: Float = 0.5
}
-// CHECK-LABEL: sil [transparent] [thunk] @_TTWC14objc_witnesses8PositronS_6LeptonS_FS1_g4spinSf
-// CHECK-LABEL: sil shared [transparent] [thunk] @_TTDFC14objc_witnesses8Positrong4spinSf
+// CHECK-LABEL: sil [transparent] [fragile] [thunk] @_TTWC14objc_witnesses8PositronS_6LeptonS_FS1_g4spinSf
+// CHECK-LABEL: sil shared [transparent] [fragile] [thunk] @_TTDFC14objc_witnesses8Positrong4spinSf
+
diff --git a/test/SILGen/properties.swift b/test/SILGen/properties.swift
index 521395c..0d3675a 100644
--- a/test/SILGen/properties.swift
+++ b/test/SILGen/properties.swift
@@ -1035,13 +1035,13 @@
}
}
-// CHECK-LABEL: sil hidden @_TFC10properties29BaseClassWithInternalPropertyg1xT_
+// CHECK-LABEL: sil hidden [transparent] @_TFC10properties29BaseClassWithInternalPropertyg1xT_
-// CHECK-LABEL: sil @_TFC10properties30DerivedClassWithPublicPropertyg1xT_
+// CHECK-LABEL: sil [transparent] [fragile] @_TFC10properties30DerivedClassWithPublicPropertyg1xT_
// CHECK: bb0([[SELF:%.*]] : $DerivedClassWithPublicProperty):
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]] : $DerivedClassWithPublicProperty
// CHECK-NEXT: [[SUPER:%.*]] = upcast [[SELF_COPY]] : $DerivedClassWithPublicProperty to $BaseClassWithInternalProperty
-// CHECK: [[GETTER:%.*]] = function_ref @_TFC10properties29BaseClassWithInternalPropertyg1xT_
-// CHECK-NEXT: [[RESULT:%.*]] = apply [[GETTER]]([[SUPER]]) : $@convention(method) (@guaranteed BaseClassWithInternalProperty) -> ()
+// CHECK-NEXT: [[METHOD:%.*]] = super_method [[SELF_COPY]] : $DerivedClassWithPublicProperty, #BaseClassWithInternalProperty.x!getter.1 : (BaseClassWithInternalProperty) -> () -> () , $@convention(method) (@guaranteed BaseClassWithInternalProperty) -> ()
+// CHECK-NEXT: [[RESULT:%.*]] = apply [[METHOD]]([[SUPER]]) : $@convention(method) (@guaranteed BaseClassWithInternalProperty) -> ()
// CHECK-NEXT: destroy_value [[SUPER]] : $BaseClassWithInternalProperty
// CHECK: } // end sil function '_TFC10properties30DerivedClassWithPublicPropertyg1xT_'
diff --git a/test/SILGen/specialize_attr.swift b/test/SILGen/specialize_attr.swift
index 4589e77..9a72e65 100644
--- a/test/SILGen/specialize_attr.swift
+++ b/test/SILGen/specialize_attr.swift
@@ -70,7 +70,7 @@
// CHECK-LABEL: sil [_specialize <Int>] @_TFC15specialize_attr14ASubscriptables9subscriptFSix : $@convention(method) <Element> (@in Element, Int, @guaranteed ASubscriptable<Element>) -> () {
// ASubscriptable.subscript.materializeForSet with no attribute
-// CHECK-LABEL: sil @_TFC15specialize_attr14ASubscriptablem9subscriptFSix : $@convention(method) <Element> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, Int, @guaranteed ASubscriptable<Element>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil [transparent] [fragile] @_TFC15specialize_attr14ASubscriptablem9subscriptFSix : $@convention(method) <Element> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, Int, @guaranteed ASubscriptable<Element>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
public class Addressable<Element> : TestSubscriptable {
var storage: UnsafeMutablePointer<Element>
@@ -99,10 +99,10 @@
// Addressable.subscript.getter with no attribute
-// CHECK-LABEL: sil @_TFC15specialize_attr11Addressableg9subscriptFSix : $@convention(method) <Element> (Int, @guaranteed Addressable<Element>) -> @out Element {
+// CHECK-LABEL: sil [transparent] [fragile] @_TFC15specialize_attr11Addressableg9subscriptFSix : $@convention(method) <Element> (Int, @guaranteed Addressable<Element>) -> @out Element {
// Addressable.subscript.setter with no attribute
-// CHECK-LABEL: sil @_TFC15specialize_attr11Addressables9subscriptFSix : $@convention(method) <Element> (@in Element, Int, @guaranteed Addressable<Element>) -> () {
+// CHECK-LABEL: sil [transparent] [fragile] @_TFC15specialize_attr11Addressables9subscriptFSix : $@convention(method) <Element> (@in Element, Int, @guaranteed Addressable<Element>) -> () {
// Addressable.subscript.materializeForSet with no attribute
-// CHECK-LABEL: sil @_TFC15specialize_attr11Addressablem9subscriptFSix : $@convention(method) <Element> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, Int, @guaranteed Addressable<Element>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
+// CHECK-LABEL: sil [transparent] [fragile] @_TFC15specialize_attr11Addressablem9subscriptFSix : $@convention(method) <Element> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, Int, @guaranteed Addressable<Element>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>) {
diff --git a/test/SILOptimizer/devirt_materializeForSet.swift b/test/SILOptimizer/devirt_materializeForSet.swift
index 95f1be8..59fad1c 100644
--- a/test/SILOptimizer/devirt_materializeForSet.swift
+++ b/test/SILOptimizer/devirt_materializeForSet.swift
@@ -3,7 +3,7 @@
// Check that compiler does not crash on the devirtualization of materializeForSet methods
// and produces a correct code.
-// CHECK-LABEL: sil [transparent] [thunk] @_TTWC24devirt_materializeForSet7BaseFooS_3FooS_FS1_m3barSS
+// CHECK-LABEL: sil [transparent] [fragile] [thunk] @_TTWC24devirt_materializeForSet7BaseFooS_3FooS_FS1_m3barSS
// CHECK: checked_cast_br [exact] %{{.*}} : $BaseFoo to $ChildFoo
// CHECK: thin_function_to_pointer %{{.*}} : $@convention(thin) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout ChildFoo, @thick ChildFoo.Type) -> () to $Builtin.RawPointer
// CHECK: enum $Optional<Builtin.RawPointer>, #Optional.some!enumelt.1, %{{.*}} : $Builtin.RawPointer
diff --git a/test/SourceKit/Indexing/sr_3815.swift b/test/SourceKit/Indexing/sr_3815.swift
new file mode 100644
index 0000000..d179f69
--- /dev/null
+++ b/test/SourceKit/Indexing/sr_3815.swift
@@ -0,0 +1,13 @@
+// RUN: %sourcekitd-test -req=index %s -- -serialize-diagnostics-path %t.dia %s | %sed_clean > %t.response
+// RUN: diff -u %s.response %t.response
+
+protocol P {
+ typealias Index = Int
+ func f()
+}
+
+struct S : P {
+ typealias Index = Int
+
+ func f() {}
+}
diff --git a/test/SourceKit/Indexing/sr_3815.swift.response b/test/SourceKit/Indexing/sr_3815.swift.response
new file mode 100644
index 0000000..dd37a88
--- /dev/null
+++ b/test/SourceKit/Indexing/sr_3815.swift.response
@@ -0,0 +1,101 @@
+{
+ key.hash: <hash>,
+ key.dependencies: [
+ {
+ key.kind: source.lang.swift.import.module.swift,
+ key.name: "Swift",
+ key.filepath: Swift.swiftmodule,
+ key.hash: <hash>,
+ key.is_system: 1
+ }
+ ],
+ key.entities: [
+ {
+ key.kind: source.lang.swift.decl.protocol,
+ key.name: "P",
+ key.usr: "s:P7sr_38151P",
+ key.line: 4,
+ key.column: 10,
+ key.entities: [
+ {
+ key.kind: source.lang.swift.decl.typealias,
+ key.name: "Index",
+ key.usr: "s:P7sr_38151P5Index",
+ key.line: 5,
+ key.column: 13,
+ key.entities: [
+ {
+ key.kind: source.lang.swift.ref.struct,
+ key.name: "Int",
+ key.usr: "s:Si",
+ key.line: 5,
+ key.column: 21
+ }
+ ]
+ },
+ {
+ key.kind: source.lang.swift.decl.function.method.instance,
+ key.name: "f()",
+ key.usr: "s:FP7sr_38151P1fFT_T_",
+ key.line: 6,
+ key.column: 8
+ }
+ ]
+ },
+ {
+ key.kind: source.lang.swift.decl.struct,
+ key.name: "S",
+ key.usr: "s:V7sr_38151S",
+ key.line: 9,
+ key.column: 8,
+ key.related: [
+ {
+ key.kind: source.lang.swift.ref.protocol,
+ key.name: "P",
+ key.usr: "s:P7sr_38151P",
+ key.line: 9,
+ key.column: 12
+ }
+ ],
+ key.entities: [
+ {
+ key.kind: source.lang.swift.ref.protocol,
+ key.name: "P",
+ key.usr: "s:P7sr_38151P",
+ key.line: 9,
+ key.column: 12
+ },
+ {
+ key.kind: source.lang.swift.decl.typealias,
+ key.name: "Index",
+ key.usr: "s:V7sr_38151S5Index",
+ key.line: 10,
+ key.column: 13,
+ key.entities: [
+ {
+ key.kind: source.lang.swift.ref.struct,
+ key.name: "Int",
+ key.usr: "s:Si",
+ key.line: 10,
+ key.column: 21
+ }
+ ]
+ },
+ {
+ key.kind: source.lang.swift.decl.function.method.instance,
+ key.name: "f()",
+ key.usr: "s:FV7sr_38151S1fFT_T_",
+ key.line: 12,
+ key.column: 8,
+ key.related: [
+ {
+ key.kind: source.lang.swift.ref.function.method.instance,
+ key.name: "f()",
+ key.usr: "s:FP7sr_38151P1fFT_T_"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/sil-func-extractor/basic.swift b/test/sil-func-extractor/basic.swift
index e8ed2a1..bb574cb 100644
--- a/test/sil-func-extractor/basic.swift
+++ b/test/sil-func-extractor/basic.swift
@@ -54,8 +54,8 @@
// EXTRACT-NOW-LABEL: sil hidden @_TFC5basic7Vehicle3nowfT_Si : $@convention(method) (@guaranteed Vehicle) -> Int {
// EXTRACT-NOW: bb0
-// EXTRACT-NOW: = function_ref
-// EXTRACT-NOW-NEXT: apply
+// EXTRACT-NOW: ref_element_addr
+// EXTRACT-NOW-NEXT: load
// EXTRACT-NOW-NEXT: return
struct X {
diff --git a/validation-test/Sema/explicit_coercions.swift b/validation-test/Sema/explicit_coercions.swift
new file mode 100644
index 0000000..3b3d2b8
--- /dev/null
+++ b/validation-test/Sema/explicit_coercions.swift
@@ -0,0 +1,19 @@
+// RUN: %target-swift-frontend -typecheck %s
+
+public class Foo : CustomReflectable {
+ public var booleanValue : Bool?
+ public var customMirror: Mirror {
+ return Mirror(self, children: [
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any,
+ "booleanValue": booleanValue as Bool? as Any
+ ])
+ }
+}
diff --git a/validation-test/compiler_crashers_2_fixed/0075-rdar30248571.swift b/validation-test/compiler_crashers_2_fixed/0075-rdar30248571.swift
new file mode 100644
index 0000000..0ead7fb
--- /dev/null
+++ b/validation-test/compiler_crashers_2_fixed/0075-rdar30248571.swift
@@ -0,0 +1,52 @@
+// RUN: %target-swift-frontend %s -emit-ir
+
+protocol P {
+ associatedtype A
+ associatedtype B
+}
+
+protocol Q : P {
+ associatedtype M
+ typealias A = M
+
+}
+
+
+extension Q {
+ typealias B = M
+}
+
+protocol R {
+ associatedtype S
+
+ init()
+}
+
+extension R {
+ init<V : Q>(_: V) where V.M == Self {
+ let _ = V.A.self
+ let _ = V.B.self
+ let _ = V.M.self
+ let _ = Self.self
+
+#if false
+ let _: V.M.Type = V.A.self
+ let _: V.M.Type = V.B.self
+ let _: V.M.Type = Self.self
+
+ let _: V.A.Type = V.M.self
+ let _: V.A.Type = V.B.self
+ let _: V.A.Type = Self.self
+
+ let _: V.B.Type = V.M.self
+ let _: V.B.Type = V.A.self
+ let _: V.B.Type = Self.self
+
+ let _: Self.Type = V.A.self
+ let _: Self.Type = V.B.self
+ let _: Self.Type = V.M.self
+#endif
+
+ self.init()
+ }
+}