@@ -410,6 +410,34 @@ static void ProcessAPINotes(Sema &S, Decl *D,
410
410
}
411
411
412
412
/* 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
+ }
413
441
static void applyBoundsSafety (Sema &S, ValueDecl *D,
414
442
const api_notes::BoundsSafetyInfo &Info,
415
443
VersionedInfoMetadata Metadata) {
@@ -420,41 +448,29 @@ static void applyBoundsSafety(Sema &S, ValueDecl *D,
420
448
if (auto ParmDecl = dyn_cast<ParmVarDecl>(ScopeDecl)) {
421
449
ScopeDecl = dyn_cast<FunctionDecl>(ParmDecl->getDeclContext ());
422
450
}
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;
430
451
assert (*Info.getKind () >= BoundsSafetyKind::CountedBy);
431
452
assert (*Info.getKind () <= BoundsSafetyKind::EndedBy);
453
+ AttributeCommonInfo::Kind Kind;
432
454
switch (*Info.getKind ()) {
433
455
case BoundsSafetyKind::CountedBy:
434
- AttrName = " __counted_by" ;
435
456
Kind = AttributeCommonInfo::AT_CountedBy;
436
457
break ;
437
458
case BoundsSafetyKind::CountedByOrNull:
438
- AttrName = " __counted_by_or_null" ;
439
459
Kind = AttributeCommonInfo::AT_CountedByOrNull;
440
460
break ;
441
461
case BoundsSafetyKind::SizedBy:
442
- AttrName = " __sized_by" ;
443
462
Kind = AttributeCommonInfo::AT_SizedBy;
444
463
break ;
445
464
case BoundsSafetyKind::SizedByOrNull:
446
- AttrName = " __sized_by_or_null" ;
447
465
Kind = AttributeCommonInfo::AT_SizedByOrNull;
448
466
break ;
449
467
case BoundsSafetyKind::EndedBy:
450
- AttrName = " __ended_by" ;
451
468
Kind = AttributeCommonInfo::AT_PtrEndedBy;
452
469
break ;
453
470
}
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});
458
474
}
459
475
}
460
476
/* TO_UPSTREAM(BoundsSafety) OFF */
@@ -597,6 +613,14 @@ static void ProcessAPINotes(Sema &S, FunctionOrMethod AnyFunc,
597
613
}
598
614
}
599
615
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
+
600
624
// If the result type or any of the parameter types changed for a function
601
625
// declaration, we have to rebuild the type.
602
626
if (FD && AnyTypeChanged) {
0 commit comments