[API Notes] Attach API notes to forward declarations of tags (#149951)
Forward declarations can still have useful API notes applied to them. When the use of the tag is not a definition, apply the API notes immediately. Fixes rdar://156288588.
This commit is contained in:
parent
726502d668
commit
8c26858f1a
@ -18476,6 +18476,10 @@ CreateNewDecl:
|
||||
// record.
|
||||
AddPushedVisibilityAttribute(New);
|
||||
|
||||
// If this is not a definition, process API notes for it now.
|
||||
if (TUK != TagUseKind::Definition)
|
||||
ProcessAPINotes(New);
|
||||
|
||||
if (isMemberSpecialization && !New->isInvalidDecl())
|
||||
CompleteMemberSpecialization(New, Previous);
|
||||
|
||||
|
@ -19,6 +19,10 @@ Tags:
|
||||
SwiftReleaseOp: release
|
||||
SwiftRetainOp: retain
|
||||
SwiftDefaultOwnership: unretained
|
||||
- Name: OpaqueRefCountedType
|
||||
SwiftImportAs: reference
|
||||
SwiftReleaseOp: ORCRelease
|
||||
SwiftRetainOp: ORCRetain
|
||||
- Name: NonCopyableType
|
||||
SwiftCopyable: false
|
||||
SwiftConformsTo: MySwiftModule.MySwiftNonCopyableProtocol
|
||||
|
@ -23,3 +23,9 @@ struct EscapableType { int value; };
|
||||
struct RefCountedTypeWithDefaultConvention {};
|
||||
inline void retain(RefCountedType *x) {}
|
||||
inline void release(RefCountedType *x) {}
|
||||
|
||||
struct OpaqueRefCountedType;
|
||||
struct OpaqueRefCountedType; // redeclaration
|
||||
|
||||
inline void ORCRetain(struct OpaqueRefCountedType *x);
|
||||
inline void ORCRelease(struct OpaqueRefCountedType *x);
|
||||
|
@ -3,6 +3,7 @@
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter ImmortalRefType | FileCheck -check-prefix=CHECK-IMMORTAL %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter RefCountedType | FileCheck -check-prefix=CHECK-REF-COUNTED %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter RefCountedTypeWithDefaultConvention | FileCheck -check-prefix=CHECK-REF-COUNTED-DEFAULT %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter OpaqueRefCountedType | FileCheck -check-prefix=CHECK-OPAQUE-REF-COUNTED %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter NonCopyableType | FileCheck -check-prefix=CHECK-NON-COPYABLE %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter CopyableType | FileCheck -check-prefix=CHECK-COPYABLE %s
|
||||
// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers %s -x c++ -ast-dump -ast-dump-filter NonEscapableType | FileCheck -check-prefix=CHECK-NON-ESCAPABLE %s
|
||||
@ -34,6 +35,20 @@
|
||||
// CHECK-REF-COUNTED-DEFAULT: SwiftAttrAttr {{.+}} <<invalid sloc>> "release:release"
|
||||
// CHECK-REF-COUNTED-DEFAULT: SwiftAttrAttr {{.+}} <<invalid sloc>> "returned_as_unretained_by_default"
|
||||
|
||||
// CHECK-OPAQUE-REF-COUNTED: Dumping OpaqueRefCountedType:
|
||||
// CHECK-OPAQUE-REF-COUNTED-NEXT: CXXRecordDecl {{.+}} imported in SwiftImportAs{{.*}}struct OpaqueRefCountedType
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "import_reference"
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "retain:ORCRetain"
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "release:ORCRelease"
|
||||
// CHECK-OPAQUE-REF-COUNTED-NOT: SwiftAttrAttr {{.+}} <<invalid sloc>> "release:ORCRelease"
|
||||
|
||||
// CHECK-OPAQUE-REF-COUNTED: Dumping OpaqueRefCountedType:
|
||||
// CHECK-OPAQUE-REF-COUNTED-NEXT: CXXRecordDecl {{.+}} imported in SwiftImportAs{{.*}}struct OpaqueRefCountedType
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "import_reference"
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "retain:ORCRetain"
|
||||
// CHECK-OPAQUE-REF-COUNTED: SwiftAttrAttr {{.+}} <<invalid sloc>> "release:ORCRelease"
|
||||
|
||||
// CHECK-OPAQUE-REF-COUNTED-NOT: SwiftAttrAttr {{.+}} <<invalid sloc>> "release:
|
||||
// CHECK-NON-COPYABLE: Dumping NonCopyableType:
|
||||
// CHECK-NON-COPYABLE-NEXT: CXXRecordDecl {{.+}} imported in SwiftImportAs {{.+}} struct NonCopyableType
|
||||
// CHECK-NON-COPYABLE: SwiftAttrAttr {{.+}} <<invalid sloc>> "conforms_to:MySwiftModule.MySwiftNonCopyableProtocol"
|
||||
|
Loading…
x
Reference in New Issue
Block a user