[clang] 1694175 - [Clang][Modules] Merge availability attributes on imported decls

Michael Spencer via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 15 17:46:55 PDT 2022


Author: Michael Spencer
Date: 2022-06-15T17:46:16-07:00
New Revision: 169417531578501e955f12c79ecb8ff05333ae15

URL: https://github.com/llvm/llvm-project/commit/169417531578501e955f12c79ecb8ff05333ae15
DIFF: https://github.com/llvm/llvm-project/commit/169417531578501e955f12c79ecb8ff05333ae15.diff

LOG: [Clang][Modules] Merge availability attributes on imported decls

Currently we do not in general merge attributes when importing decls from modules. This patch handles availability, but long term we need to properly handle all attributes.

I tried to use Sema::mergeDeclAttributes, but it caused test crashes as I don't think it expects to be called in this context. We really shouldn't have duplicate code for merging attributes long term, but for now this fixes availability. There's already a TODO for this in the declaration of ASTDeclReader::mergeInheritableAttributes.

Differential Revision: https://reviews.llvm.org/D127182

rdar://85820301

Added: 
    clang/test/Modules/decl-attr-merge.mm

Modified: 
    clang/lib/Serialization/ASTReaderDecl.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 86a9c7733069e..ae298557ee49c 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -3296,6 +3296,13 @@ void ASTDeclReader::mergeInheritableAttributes(ASTReader &Reader, Decl *D,
     NewAttr->setInherited(true);
     D->addAttr(NewAttr);
   }
+
+  const auto *AA = Previous->getAttr<AvailabilityAttr>();
+  if (AA && !D->hasAttr<AvailabilityAttr>()) {
+    NewAttr = AA->clone(Context);
+    NewAttr->setInherited(true);
+    D->addAttr(NewAttr);
+  }
 }
 
 template<typename DeclT>

diff  --git a/clang/test/Modules/decl-attr-merge.mm b/clang/test/Modules/decl-attr-merge.mm
new file mode 100644
index 0000000000000..57f3f93df480e
--- /dev/null
+++ b/clang/test/Modules/decl-attr-merge.mm
@@ -0,0 +1,41 @@
+// RUN: rm -rf %t.dir
+// RUN: split-file %s %t.dir
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps \
+// RUN:   -fmodules-cache-path=%t.dir/cache -triple x86_64-apple-macosx10.11.0 \
+// RUN:   -I%t.dir/headers %t.dir/main.m -emit-llvm -o %t.dir/main.ll
+// RUN: cat %t.dir/main.ll | FileCheck %s
+
+//--- headers/a.h
+
+__attribute__((availability(macos,introduced=10.16)))
+ at interface INIntent
+- (instancetype)self;
+ at end
+
+//--- headers/b.h
+
+ at class INIntent;
+
+//--- headers/module.modulemap
+
+module A {
+  header "a.h"
+}
+
+module B {
+  header "b.h"
+}
+
+//--- main.m
+
+#import <a.h>
+#import <b.h> // NOTE: Non attributed decl imported after one with attrs.
+
+void F(id);
+
+int main() {
+  if (@available(macOS 11.0, *))
+    F([INIntent self]);
+}
+
+// CHECK: @"OBJC_CLASS_$_INIntent" = extern_weak


        


More information about the cfe-commits mailing list