================
@@ -0,0 +1,47 @@
+// RUN: %clang_cc1 -triple arm64-apple-ios12.0 -emit-llvm -o - %s | FileCheck 
%s
+
+// Test that isWeakImported() correctly traverses the redeclaration chain
+// to find availability attributes, even when a forward declaration (@class)
+// without availability attributes becomes the most recent declaration.
+
+// Case 1: @interface (with availability) first, then @class (without 
availability).
+// The @class becomes getMostRecentDecl(). Without the fix, isWeakImported()
+// would only check the @class's attributes and miss the availability 
attribute,
+// resulting in strong linkage instead of extern_weak.
+
+__attribute__((availability(ios,introduced=14.0)))
+@interface WeakRedecl1
+@end
+
+@class WeakRedecl1;
+
+@implementation WeakRedecl1 (TestCategory1)
+@end
+
+// CHECK: @"OBJC_CLASS_$_WeakRedecl1" = extern_weak global
----------------
kevinlzh1108 wrote:

You're absolutely right — the single-file test was not a valid reduction. 
Within a single TU, Sema's mergeDeclAttributes() automatically copies the 
availability attribute from @interface to @class, so 
getMostRecentDecl()->attrs() already finds
   it. The test passed with or without the fix.

  I've replaced it with a Clang Modules test 
(clang/test/Modules/availability-redecl-weak.m) that reproduces the actual bug. 
The key insight is that it requires multiple availability attributes (e.g., 
macos before ios), because cross-PCM
  mergeInheritableAttributes uses getAttr<AvailabilityAttr>() which only copies 
the first one. So the @class ends up with only the inherited macos attr, losing 
ios — which is exactly what happens with UTType in practice.

  The test covers both import orders, and I've verified that the bug-triggering 
order (@import InterfaceMod → @import ForwardMod) produces strong linkage 
without the fix and extern_weak with it.


https://github.com/llvm/llvm-project/pull/181482
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to