Merge remote-tracking branch 'origin/swift-4.0-branch' into stable
diff --git a/include/clang/APINotes/Types.h b/include/clang/APINotes/Types.h
index b81d273..725711e 100644
--- a/include/clang/APINotes/Types.h
+++ b/include/clang/APINotes/Types.h
@@ -215,6 +215,9 @@
unsigned SwiftImportAsNonGenericSpecified : 1;
unsigned SwiftImportAsNonGeneric : 1;
+ unsigned SwiftObjCMembersSpecified : 1;
+ unsigned SwiftObjCMembers : 1;
+
public:
ObjCContextInfo()
: CommonTypeInfo(),
@@ -222,7 +225,9 @@
DefaultNullability(0),
HasDesignatedInits(0),
SwiftImportAsNonGenericSpecified(false),
- SwiftImportAsNonGeneric(false)
+ SwiftImportAsNonGeneric(false),
+ SwiftObjCMembersSpecified(false),
+ SwiftObjCMembers(false)
{ }
/// Determine the default nullability for properties and methods of this
@@ -260,6 +265,16 @@
}
}
+ Optional<bool> getSwiftObjCMembers() const {
+ if (SwiftObjCMembersSpecified)
+ return SwiftObjCMembers;
+ return None;
+ }
+ void setSwiftObjCMembers(Optional<bool> value) {
+ SwiftObjCMembersSpecified = value.hasValue();
+ SwiftObjCMembers = value.hasValue() ? *value : false;
+ }
+
/// Strip off any information within the class information structure that is
/// module-local, such as 'audited' flags.
void stripModuleLocalInfo() {
@@ -271,7 +286,9 @@
return static_cast<const CommonTypeInfo &>(lhs) == rhs &&
lhs.getDefaultNullability() == rhs.getDefaultNullability() &&
lhs.HasDesignatedInits == rhs.HasDesignatedInits &&
- lhs.getSwiftImportAsNonGeneric() == rhs.getSwiftImportAsNonGeneric();
+ lhs.getSwiftImportAsNonGeneric() ==
+ rhs.getSwiftImportAsNonGeneric() &&
+ lhs.getSwiftObjCMembers() == rhs.getSwiftObjCMembers();
}
friend bool operator!=(const ObjCContextInfo &lhs, const ObjCContextInfo &rhs) {
@@ -296,6 +313,11 @@
lhs.SwiftImportAsNonGeneric = rhs.SwiftImportAsNonGeneric;
}
+ if (!lhs.SwiftObjCMembersSpecified && rhs.SwiftObjCMembersSpecified) {
+ lhs.SwiftObjCMembersSpecified = true;
+ lhs.SwiftObjCMembers = rhs.SwiftObjCMembers;
+ }
+
lhs.HasDesignatedInits |= rhs.HasDesignatedInits;
return lhs;
diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
index 593a4ed..1b8ed9a 100644
--- a/include/clang/Basic/Attr.td
+++ b/include/clang/Basic/Attr.td
@@ -1473,6 +1473,12 @@
let Documentation = [SwiftBridgeDocs];
}
+def SwiftObjCMembers : Attr {
+ let Spellings = [GNU<"swift_objc_members">];
+ let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
+ let Documentation = [SwiftObjCMembersDocs];
+}
+
def SwiftError : InheritableAttr {
let Spellings = [GCC<"swift_error">];
let Args = [EnumArgument<"Convention", "ConventionKind",
diff --git a/include/clang/Basic/AttrDocs.td b/include/clang/Basic/AttrDocs.td
index 205546c..e5aa67e 100644
--- a/include/clang/Basic/AttrDocs.td
+++ b/include/clang/Basic/AttrDocs.td
@@ -2449,6 +2449,13 @@
}];
}
+def SwiftObjCMembersDocs : Documentation {
+ let Category = SwiftDocs;
+ let Content = [{
+The ``swift_objc_members`` attribute maps to the Swift ``@objcMembers`` attribute, which indicates that Swift members of this class, its subclasses, and all of the extensions thereof, will implicitly be exposed back to Objective-C.
+ }];
+}
+
def SwiftErrorDocs : Documentation {
let Category = SwiftDocs;
let Heading = "swift_error";
diff --git a/lib/APINotes/APINotesFormat.h b/lib/APINotes/APINotesFormat.h
index 1e257f3..5a0cdbd 100644
--- a/lib/APINotes/APINotesFormat.h
+++ b/lib/APINotes/APINotesFormat.h
@@ -36,7 +36,7 @@
/// API notes file minor version number.
///
/// When the format changes IN ANY WAY, this number should be incremented.
-const uint16_t VERSION_MINOR = 22; // SwiftImportAsNonGeneric
+const uint16_t VERSION_MINOR = 23; // SwiftObjCMembers
using IdentifierID = PointerEmbeddedInt<unsigned, 31>;
using IdentifierIDField = BCVBR<16>;
diff --git a/lib/APINotes/APINotesReader.cpp b/lib/APINotes/APINotesReader.cpp
index 587903f..d9a4297 100644
--- a/lib/APINotes/APINotesReader.cpp
+++ b/lib/APINotes/APINotesReader.cpp
@@ -256,6 +256,10 @@
payload >>= 3;
if (payload & (1 << 1))
+ info.setSwiftObjCMembers(payload & 1);
+ payload >>= 2;
+
+ if (payload & (1 << 1))
info.setSwiftImportAsNonGeneric(payload & 1);
return info;
diff --git a/lib/APINotes/APINotesWriter.cpp b/lib/APINotes/APINotesWriter.cpp
index 65edaf9..2331cd3 100644
--- a/lib/APINotes/APINotesWriter.cpp
+++ b/lib/APINotes/APINotesWriter.cpp
@@ -587,6 +587,10 @@
if (auto swiftImportAsNonGeneric = info.getSwiftImportAsNonGeneric()) {
payload |= (0x01 << 1) | swiftImportAsNonGeneric.getValue();
}
+ payload <<= 2;
+ if (auto swiftObjCMembers = info.getSwiftObjCMembers()) {
+ payload |= (0x01 << 1) | swiftObjCMembers.getValue();
+ }
payload <<= 3;
if (auto nullable = info.getDefaultNullability()) {
payload |= (0x01 << 2) | static_cast<uint8_t>(*nullable);
diff --git a/lib/APINotes/APINotesYAMLCompiler.cpp b/lib/APINotes/APINotesYAMLCompiler.cpp
index c967646..02b2ba1 100644
--- a/lib/APINotes/APINotesYAMLCompiler.cpp
+++ b/lib/APINotes/APINotesYAMLCompiler.cpp
@@ -217,6 +217,7 @@
Optional<StringRef> SwiftBridge;
Optional<StringRef> NSErrorDomain;
Optional<bool> SwiftImportAsNonGeneric;
+ Optional<bool> SwiftObjCMembers;
MethodsSeq Methods;
PropertiesSeq Properties;
};
@@ -447,6 +448,7 @@
io.mapOptional("SwiftBridge", c.SwiftBridge);
io.mapOptional("NSErrorDomain", c.NSErrorDomain);
io.mapOptional("SwiftImportAsNonGeneric", c.SwiftImportAsNonGeneric);
+ io.mapOptional("SwiftObjCMembers", c.SwiftObjCMembers);
io.mapOptional("Methods", c.Methods);
io.mapOptional("Properties", c.Properties);
}
@@ -756,6 +758,8 @@
cInfo.setDefaultNullability(*DefaultNullability);
if (cl.SwiftImportAsNonGeneric)
cInfo.setSwiftImportAsNonGeneric(*cl.SwiftImportAsNonGeneric);
+ if (cl.SwiftObjCMembers)
+ cInfo.setSwiftObjCMembers(*cl.SwiftObjCMembers);
ContextID clID = Writer->addObjCContext(cl.Name, isClass, cInfo,
swiftVersion);
@@ -1106,6 +1110,7 @@
handleCommonType(record, info);
record.SwiftImportAsNonGeneric = info.getSwiftImportAsNonGeneric();
+ record.SwiftObjCMembers = info.getSwiftObjCMembers();
if (info.getDefaultNullability()) {
record.AuditedForNullability = true;
diff --git a/lib/Sema/SemaAPINotes.cpp b/lib/Sema/SemaAPINotes.cpp
index f586911..5901628 100644
--- a/lib/Sema/SemaAPINotes.cpp
+++ b/lib/Sema/SemaAPINotes.cpp
@@ -610,6 +610,13 @@
});
}
+ if (auto objcMembers = info.getSwiftObjCMembers()) {
+ handleAPINotedAttribute<SwiftObjCMembersAttr>(S, D, *objcMembers,
+ metadata, [&] {
+ return SwiftObjCMembersAttr::CreateImplicit(S.Context);
+ });
+ }
+
// Handle information common to Objective-C classes and protocols.
ProcessAPINotes(S, static_cast<clang::ObjCContainerDecl *>(D), info,
metadata);
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index d271565..c9fe7a0 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -6794,6 +6794,9 @@
case AttributeList::AT_SwiftBridge:
handleSwiftBridgeAttr(S, D, Attr);
break;
+ case AttributeList::AT_SwiftObjCMembers:
+ handleSimpleAttribute<SwiftObjCMembersAttr>(S, D, Attr);
+ break;
case AttributeList::AT_SwiftNewtype:
handleSwiftNewtypeAttr(S, D, Attr);
break;
diff --git a/test/APINotes/Inputs/Frameworks/VersionedKit.framework/Headers/VersionedKit.apinotes b/test/APINotes/Inputs/Frameworks/VersionedKit.framework/Headers/VersionedKit.apinotes
index bd09953..394b156 100644
--- a/test/APINotes/Inputs/Frameworks/VersionedKit.framework/Headers/VersionedKit.apinotes
+++ b/test/APINotes/Inputs/Frameworks/VersionedKit.framework/Headers/VersionedKit.apinotes
@@ -1,6 +1,7 @@
Name: VersionedKit
Classes:
- Name: TestProperties
+ SwiftObjCMembers: true
Properties:
- Name: accessorsOnly
PropertyKind: Instance
@@ -22,6 +23,7 @@
- Name: TestGenericDUMP
SwiftImportAsNonGeneric: true
- Name: TestProperties
+ SwiftObjCMembers: false
Properties:
- Name: accessorsOnlyInVersion3
PropertyKind: Instance
diff --git a/test/APINotes/Inputs/roundtrip.apinotes b/test/APINotes/Inputs/roundtrip.apinotes
index 4895060..3b493e1 100644
--- a/test/APINotes/Inputs/roundtrip.apinotes
+++ b/test/APINotes/Inputs/roundtrip.apinotes
@@ -10,6 +10,7 @@
SwiftPrivate: false
SwiftName: ''
SwiftImportAsNonGeneric: true
+ SwiftObjCMembers: false
Methods:
- Selector: 'cellWithImage:'
MethodKind: Class
@@ -61,6 +62,7 @@
SwiftPrivate: false
SwiftName: ''
SwiftBridge: View
+ SwiftObjCMembers: true
Methods:
- Selector: 'addSubview:'
MethodKind: Instance
diff --git a/test/APINotes/versioned.m b/test/APINotes/versioned.m
index 29800b6..21a783e 100644
--- a/test/APINotes/versioned.m
+++ b/test/APINotes/versioned.m
@@ -54,3 +54,8 @@
// CHECK-VERSIONED: void privateFunc();
// CHECK-VERSIONED: typedef double MyDoubleWrapper;
+
+// CHECK-UNVERSIONED: __attribute__((swift_objc_members)
+// CHECK-UNVERSIONED-NEXT: @interface TestProperties
+// CHECK-VERSIONED-NOT: __attribute__((swift_objc_members)
+// CHECK-VERSIONED: @interface TestProperties
diff --git a/test/SemaObjC/attr-swift_objc_members.m b/test/SemaObjC/attr-swift_objc_members.m
new file mode 100644
index 0000000..c8781f8
--- /dev/null
+++ b/test/SemaObjC/attr-swift_objc_members.m
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -verify -fsyntax-only %s
+
+#if !__has_attribute(swift_objc_members)
+# error Cannot query presence of swift_objc_members attribute.
+#endif
+
+__attribute__((swift_objc_members))
+__attribute__((objc_root_class))
+@interface A
+@end
+
+__attribute__((swift_objc_members)) // expected-error{{'swift_objc_members' attribute only applies to Objective-C interfaces}}
+@protocol P
+@end
+
+__attribute__((swift_objc_members)) // expected-error{{'swift_objc_members' attribute only applies to Objective-C interfaces}}
+extern void foo(void);