Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -4683,8 +4683,13 @@ } // Weak properties are inferred to be nullable. - if (state.getDeclarator().isObjCWeakProperty() && inAssumeNonNullRegion) { - inferNullability = NullabilityKind::Nullable; + if (state.getDeclarator().isObjCWeakProperty()) { + // Weak properties cannot be nonnull, and should not complain about + // missing nullable attributes during completeness checks. + complainAboutMissingNullability = CAMN_No; + if (inAssumeNonNullRegion) { + inferNullability = NullabilityKind::Nullable; + } break; } Index: clang/test/SemaObjCXX/Inputs/nullability-consistency-2.h =================================================================== --- clang/test/SemaObjCXX/Inputs/nullability-consistency-2.h +++ clang/test/SemaObjCXX/Inputs/nullability-consistency-2.h @@ -19,13 +19,9 @@ @property (retain,nullable) SomeClass *property2; - (nullable SomeClass *)method1; - (void)method2:(nonnull SomeClass *)param; -@property (readonly, weak) SomeClass *property3; // expected-warning{{missing a nullability type specifier}} -// expected-note@-1 {{insert '_Nullable' if the pointer may be null}} -// expected-note@-2 {{insert '_Nonnull' if the pointer should never be null}} +@property (readonly, weak) SomeClass *property3; @end @interface SomeClass () -@property (readonly, weak) SomeClass *property4; // expected-warning{{missing a nullability type specifier}} -// expected-note@-1 {{insert '_Nullable' if the pointer may be null}} -// expected-note@-2 {{insert '_Nonnull' if the pointer should never be null}} +@property (readonly, weak) SomeClass *property4; @end