@@ -410,6 +410,34 @@ static void ProcessAPINotes(Sema &S, Decl *D,
410410}
411411
412412/* TO_UPSTREAM(BoundsSafety) ON */
413+ void Sema::CompleteBoundsAttribute (Expr *ParsedExpr,
414+ IncompleteBoundsAttributeInfo Info) {
415+ assert (ParsedExpr);
416+ std::string AttrName;
417+ switch (Info.Kind ) {
418+ case AttributeCommonInfo::AT_CountedBy:
419+ AttrName = " __counted_by" ;
420+ break ;
421+ case AttributeCommonInfo::AT_CountedByOrNull:
422+ AttrName = " __counted_by_or_null" ;
423+ break ;
424+ case AttributeCommonInfo::AT_SizedBy:
425+ AttrName = " __sized_by" ;
426+ break ;
427+ case AttributeCommonInfo::AT_SizedByOrNull:
428+ AttrName = " __sized_by_or_null" ;
429+ break ;
430+ case AttributeCommonInfo::AT_PtrEndedBy:
431+ AttrName = " __ended_by" ;
432+ break ;
433+ default :
434+ llvm_unreachable (" invalid bounds attribute kind in API notes" );
435+ }
436+ applyPtrCountedByEndedByAttr (Info.D , Info.Level , Info.Kind , ParsedExpr,
437+ Info.D ->getLocation (), Info.D ->getSourceRange (),
438+ AttrName,
439+ /* originates in API notes */ true );
440+ }
413441static void applyBoundsSafety (Sema &S, ValueDecl *D,
414442 const api_notes::BoundsSafetyInfo &Info,
415443 VersionedInfoMetadata Metadata) {
@@ -420,41 +448,29 @@ static void applyBoundsSafety(Sema &S, ValueDecl *D,
420448 if (auto ParmDecl = dyn_cast<ParmVarDecl>(ScopeDecl)) {
421449 ScopeDecl = dyn_cast<FunctionDecl>(ParmDecl->getDeclContext ());
422450 }
423- auto ParsedExpr = S.ParseBoundsAttributeArgFromStringCallback (
424- Info.ExternalBounds , " <API Notes>" , ScopeDecl, D->getLocation ());
425- if (ParsedExpr.isInvalid ())
426- return ;
427-
428- std::string AttrName;
429- AttributeCommonInfo::Kind Kind;
430451 assert (*Info.getKind () >= BoundsSafetyKind::CountedBy);
431452 assert (*Info.getKind () <= BoundsSafetyKind::EndedBy);
453+ AttributeCommonInfo::Kind Kind;
432454 switch (*Info.getKind ()) {
433455 case BoundsSafetyKind::CountedBy:
434- AttrName = " __counted_by" ;
435456 Kind = AttributeCommonInfo::AT_CountedBy;
436457 break ;
437458 case BoundsSafetyKind::CountedByOrNull:
438- AttrName = " __counted_by_or_null" ;
439459 Kind = AttributeCommonInfo::AT_CountedByOrNull;
440460 break ;
441461 case BoundsSafetyKind::SizedBy:
442- AttrName = " __sized_by" ;
443462 Kind = AttributeCommonInfo::AT_SizedBy;
444463 break ;
445464 case BoundsSafetyKind::SizedByOrNull:
446- AttrName = " __sized_by_or_null" ;
447465 Kind = AttributeCommonInfo::AT_SizedByOrNull;
448466 break ;
449467 case BoundsSafetyKind::EndedBy:
450- AttrName = " __ended_by" ;
451468 Kind = AttributeCommonInfo::AT_PtrEndedBy;
452469 break ;
453470 }
454-
455- S.applyPtrCountedByEndedByAttr (
456- D, *Info.getLevel (), Kind, ParsedExpr.get (), D->getLocation (),
457- D->getSourceRange (), AttrName, /* originates in API notes */ true );
471+ S.ParseBoundsAttributeArgFromStringCallback (
472+ Info.ExternalBounds , " <API Notes>" , ScopeDecl, D->getLocation (),
473+ {Kind, *Info.getLevel (), D});
458474 }
459475}
460476/* TO_UPSTREAM(BoundsSafety) OFF */
@@ -597,6 +613,14 @@ static void ProcessAPINotes(Sema &S, FunctionOrMethod AnyFunc,
597613 }
598614 }
599615
616+ /* TO_UPSTREAM(BoundsSafety) ON */
617+ // FIXME(hnrklssn): apply to ObjC methods when support has landed
618+ if (FD && Info.ReturnBoundsSafety .has_value ())
619+ // applyPtrCountedByEndedByAttr rebuilds FunctionType,
620+ // no need to set AnyTypeChanged
621+ applyBoundsSafety (S, FD, *Info.ReturnBoundsSafety , Metadata);
622+ /* TO_UPSTREAM(BoundsSafety) OFF */
623+
600624 // If the result type or any of the parameter types changed for a function
601625 // declaration, we have to rebuild the type.
602626 if (FD && AnyTypeChanged) {
0 commit comments