@@ -8519,7 +8519,8 @@ template <typename T> struct AttrArgArrayImporter {
8519
8519
};
8520
8520
8521
8521
class AttrImporter {
8522
- Error Err = Error::success();
8522
+ Error Err{Error::success ()};
8523
+ Attr *ToAttr = nullptr ;
8523
8524
ASTImporter &Importer;
8524
8525
ASTNodeImporter NImporter;
8525
8526
@@ -8528,15 +8529,14 @@ class AttrImporter {
8528
8529
8529
8530
// Create an "importer" for an attribute parameter.
8530
8531
// Result of the 'value()' of that object is to be passed to the function
8531
- // 'createImpoprtedAttr', in the order that is expected by the attribute
8532
- // class.
8532
+ // 'importAttr', in the order that is expected by the attribute class.
8533
8533
template <class T > AttrArgImporter<T> importArg (const T &From) {
8534
8534
return AttrArgImporter<T>(NImporter, Err, From);
8535
8535
}
8536
8536
8537
8537
// Create an "importer" for an attribute parameter that has array type.
8538
8538
// Result of the 'value()' of that object is to be passed to the function
8539
- // 'createImpoprtedAttr ', then the size of the array as next argument.
8539
+ // 'importAttr ', then the size of the array as next argument.
8540
8540
template <typename T>
8541
8541
AttrArgArrayImporter<T> importArrayArg (const llvm::iterator_range<T *> &From,
8542
8542
unsigned ArraySize) {
@@ -8549,10 +8549,13 @@ class AttrImporter {
8549
8549
// (The 'Create' with 'ASTContext' first and 'AttributeCommonInfo' last is
8550
8550
// used here.) As much data is copied or imported from the old attribute
8551
8551
// as possible. The passed arguments should be already imported.
8552
+ // If an import error happens, the internal error is set to it, and any
8553
+ // further import attempt is ignored.
8552
8554
template <typename T, typename ... Arg>
8553
- Expected<Attr *> createImportedAttr (const T *FromAttr, Arg &&...ImportedArg) {
8555
+ void importAttr (const T *FromAttr, Arg &&...ImportedArg) {
8554
8556
static_assert (std::is_base_of<Attr, T>::value,
8555
8557
" T should be subclass of Attr." );
8558
+ assert (!ToAttr && " Use one AttrImporter to import one Attribute object." );
8556
8559
8557
8560
const IdentifierInfo *ToAttrName = Importer.Import (FromAttr->getAttrName ());
8558
8561
const IdentifierInfo *ToScopeName =
@@ -8563,262 +8566,177 @@ class AttrImporter {
8563
8566
NImporter.importChecked (Err, FromAttr->getScopeLoc ());
8564
8567
8565
8568
if (Err)
8566
- return std::move (Err) ;
8569
+ return ;
8567
8570
8568
8571
AttributeCommonInfo ToI (ToAttrName, ToScopeName, ToAttrRange, ToScopeLoc,
8569
8572
FromAttr->getParsedKind (), FromAttr->getSyntax (),
8570
8573
FromAttr->getAttributeSpellingListIndex ());
8571
8574
// The "SemanticSpelling" is not needed to be passed to the constructor.
8572
8575
// That value is recalculated from the SpellingListIndex if needed.
8573
- T * ToAttr = T::Create (Importer.getToContext (),
8574
- std::forward<Arg>(ImportedArg)..., ToI);
8576
+ ToAttr = T::Create (Importer.getToContext (),
8577
+ std::forward<Arg>(ImportedArg)..., ToI);
8575
8578
8576
8579
ToAttr->setImplicit (FromAttr->isImplicit ());
8577
8580
ToAttr->setPackExpansion (FromAttr->isPackExpansion ());
8578
8581
if (auto *ToInheritableAttr = dyn_cast<InheritableAttr>(ToAttr))
8579
8582
ToInheritableAttr->setInherited (FromAttr->isInherited ());
8583
+ }
8584
+
8585
+ // Create a clone of the 'FromAttr' and import its source range only.
8586
+ // This causes objects with invalid references to be created if the 'FromAttr'
8587
+ // contains other data that should be imported.
8588
+ void cloneAttr (const Attr *FromAttr) {
8589
+ assert (!ToAttr && " Use one AttrImporter to import one Attribute object." );
8580
8590
8591
+ SourceRange ToRange = NImporter.importChecked (Err, FromAttr->getRange ());
8592
+ if (Err)
8593
+ return ;
8594
+
8595
+ ToAttr = FromAttr->clone (Importer.getToContext ());
8596
+ ToAttr->setRange (ToRange);
8597
+ }
8598
+
8599
+ // Get the result of the previous import attempt (can be used only once).
8600
+ llvm::Expected<Attr *> getResult () && {
8601
+ if (Err)
8602
+ return std::move (Err);
8603
+ assert (ToAttr && " Attribute should be created." );
8581
8604
return ToAttr;
8582
8605
}
8583
8606
};
8584
8607
8585
8608
Expected<Attr *> ASTImporter::Import (const Attr *FromAttr) {
8586
- Attr *ToAttr = nullptr ;
8587
- // FIXME: Use AttrImporter as much as possible, try to remove the import
8588
- // of range from here.
8589
- SourceRange ToRange;
8590
- if (Error Err = importInto (ToRange, FromAttr->getRange ()))
8591
- return std::move (Err);
8609
+ AttrImporter AI (*this );
8592
8610
8593
8611
// FIXME: Is there some kind of AttrVisitor to use here?
8594
8612
switch (FromAttr->getKind ()) {
8595
8613
case attr::Aligned: {
8596
8614
auto *From = cast<AlignedAttr>(FromAttr);
8597
- AlignedAttr *To;
8598
- auto CreateAlign = [&](bool IsAlignmentExpr, void *Alignment) {
8599
- return AlignedAttr::Create (ToContext, IsAlignmentExpr, Alignment, ToRange,
8600
- From->getSyntax (),
8601
- From->getSemanticSpelling ());
8602
- };
8603
- if (From->isAlignmentExpr ()) {
8604
- if (auto ToEOrErr = Import (From->getAlignmentExpr ()))
8605
- To = CreateAlign (true , *ToEOrErr);
8606
- else
8607
- return ToEOrErr.takeError ();
8608
- } else {
8609
- if (auto ToTOrErr = Import (From->getAlignmentType ()))
8610
- To = CreateAlign (false , *ToTOrErr);
8611
- else
8612
- return ToTOrErr.takeError ();
8613
- }
8614
- To->setInherited (From->isInherited ());
8615
- To->setPackExpansion (From->isPackExpansion ());
8616
- To->setImplicit (From->isImplicit ());
8617
- ToAttr = To;
8615
+ if (From->isAlignmentExpr ())
8616
+ AI.importAttr (From, true , AI.importArg (From->getAlignmentExpr ()).value ());
8617
+ else
8618
+ AI.importAttr (From, false ,
8619
+ AI.importArg (From->getAlignmentType ()).value ());
8618
8620
break ;
8619
8621
}
8622
+
8620
8623
case attr::Format: {
8621
8624
const auto *From = cast<FormatAttr>(FromAttr);
8622
- FormatAttr *To;
8623
- IdentifierInfo *ToAttrType = Import (From->getType ());
8624
- To = FormatAttr::Create (ToContext, ToAttrType, From->getFormatIdx (),
8625
- From->getFirstArg (), ToRange, From->getSyntax ());
8626
- To->setInherited (From->isInherited ());
8627
- ToAttr = To;
8625
+ AI.importAttr (From, Import (From->getType ()), From->getFormatIdx (),
8626
+ From->getFirstArg ());
8628
8627
break ;
8629
8628
}
8630
8629
8631
8630
case attr::AssertCapability: {
8632
8631
const auto *From = cast<AssertCapabilityAttr>(FromAttr);
8633
- AttrImporter AI (*this );
8634
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8635
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8636
- From->args_size ());
8637
- if (ToAttrOrErr)
8638
- ToAttr = *ToAttrOrErr;
8639
- else
8640
- return ToAttrOrErr.takeError ();
8632
+ AI.importAttr (From,
8633
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8634
+ From->args_size ());
8641
8635
break ;
8642
8636
}
8643
8637
case attr::AcquireCapability: {
8644
8638
const auto *From = cast<AcquireCapabilityAttr>(FromAttr);
8645
- AttrImporter AI (*this );
8646
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8647
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8648
- From->args_size ());
8649
- if (ToAttrOrErr)
8650
- ToAttr = *ToAttrOrErr;
8651
- else
8652
- return ToAttrOrErr.takeError ();
8639
+ AI.importAttr (From,
8640
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8641
+ From->args_size ());
8653
8642
break ;
8654
8643
}
8655
8644
case attr::TryAcquireCapability: {
8656
8645
const auto *From = cast<TryAcquireCapabilityAttr>(FromAttr);
8657
- AttrImporter AI (*this );
8658
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8659
- From, AI.importArg (From->getSuccessValue ()).value (),
8660
- AI.importArrayArg (From->args (), From->args_size ()).value (),
8661
- From->args_size ());
8662
- if (ToAttrOrErr)
8663
- ToAttr = *ToAttrOrErr;
8664
- else
8665
- return ToAttrOrErr.takeError ();
8646
+ AI.importAttr (From, AI.importArg (From->getSuccessValue ()).value (),
8647
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8648
+ From->args_size ());
8666
8649
break ;
8667
8650
}
8668
8651
case attr::ReleaseCapability: {
8669
8652
const auto *From = cast<ReleaseCapabilityAttr>(FromAttr);
8670
- AttrImporter AI (*this );
8671
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8672
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8673
- From->args_size ());
8674
- if (ToAttrOrErr)
8675
- ToAttr = *ToAttrOrErr;
8676
- else
8677
- return ToAttrOrErr.takeError ();
8653
+ AI.importAttr (From,
8654
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8655
+ From->args_size ());
8678
8656
break ;
8679
8657
}
8680
8658
case attr::RequiresCapability: {
8681
8659
const auto *From = cast<RequiresCapabilityAttr>(FromAttr);
8682
- AttrImporter AI (*this );
8683
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8684
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8685
- From->args_size ());
8686
- if (ToAttrOrErr)
8687
- ToAttr = *ToAttrOrErr;
8688
- else
8689
- return ToAttrOrErr.takeError ();
8660
+ AI.importAttr (From,
8661
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8662
+ From->args_size ());
8690
8663
break ;
8691
8664
}
8692
8665
case attr::GuardedBy: {
8693
8666
const auto *From = cast<GuardedByAttr>(FromAttr);
8694
- AttrImporter AI (*this );
8695
- Expected<Attr *> ToAttrOrErr =
8696
- AI.createImportedAttr (From, AI.importArg (From->getArg ()).value ());
8697
- if (ToAttrOrErr)
8698
- ToAttr = *ToAttrOrErr;
8699
- else
8700
- return ToAttrOrErr.takeError ();
8667
+ AI.importAttr (From, AI.importArg (From->getArg ()).value ());
8701
8668
break ;
8702
8669
}
8703
8670
case attr::PtGuardedBy: {
8704
8671
const auto *From = cast<PtGuardedByAttr>(FromAttr);
8705
- AttrImporter AI (*this );
8706
- Expected<Attr *> ToAttrOrErr =
8707
- AI.createImportedAttr (From, AI.importArg (From->getArg ()).value ());
8708
- if (ToAttrOrErr)
8709
- ToAttr = *ToAttrOrErr;
8710
- else
8711
- return ToAttrOrErr.takeError ();
8672
+ AI.importAttr (From, AI.importArg (From->getArg ()).value ());
8712
8673
break ;
8713
8674
}
8714
8675
case attr::AcquiredAfter: {
8715
8676
const auto *From = cast<AcquiredAfterAttr>(FromAttr);
8716
- AttrImporter AI (*this );
8717
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8718
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8719
- From->args_size ());
8720
- if (ToAttrOrErr)
8721
- ToAttr = *ToAttrOrErr;
8722
- else
8723
- return ToAttrOrErr.takeError ();
8677
+ AI.importAttr (From,
8678
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8679
+ From->args_size ());
8724
8680
break ;
8725
8681
}
8726
8682
case attr::AcquiredBefore: {
8727
8683
const auto *From = cast<AcquiredBeforeAttr>(FromAttr);
8728
- AttrImporter AI (*this );
8729
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8730
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8731
- From->args_size ());
8732
- if (ToAttrOrErr)
8733
- ToAttr = *ToAttrOrErr;
8734
- else
8735
- return ToAttrOrErr.takeError ();
8684
+ AI.importAttr (From,
8685
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8686
+ From->args_size ());
8736
8687
break ;
8737
8688
}
8738
8689
case attr::AssertExclusiveLock: {
8739
8690
const auto *From = cast<AssertExclusiveLockAttr>(FromAttr);
8740
- AttrImporter AI (*this );
8741
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8742
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8743
- From->args_size ());
8744
- if (ToAttrOrErr)
8745
- ToAttr = *ToAttrOrErr;
8746
- else
8747
- return ToAttrOrErr.takeError ();
8691
+ AI.importAttr (From,
8692
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8693
+ From->args_size ());
8748
8694
break ;
8749
8695
}
8750
8696
case attr::AssertSharedLock: {
8751
8697
const auto *From = cast<AssertSharedLockAttr>(FromAttr);
8752
- AttrImporter AI (*this );
8753
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8754
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8755
- From->args_size ());
8756
- if (ToAttrOrErr)
8757
- ToAttr = *ToAttrOrErr;
8758
- else
8759
- return ToAttrOrErr.takeError ();
8698
+ AI.importAttr (From,
8699
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8700
+ From->args_size ());
8760
8701
break ;
8761
8702
}
8762
8703
case attr::ExclusiveTrylockFunction: {
8763
8704
const auto *From = cast<ExclusiveTrylockFunctionAttr>(FromAttr);
8764
- AttrImporter AI (*this );
8765
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8766
- From, AI.importArg (From->getSuccessValue ()).value (),
8767
- AI.importArrayArg (From->args (), From->args_size ()).value (),
8768
- From->args_size ());
8769
- if (ToAttrOrErr)
8770
- ToAttr = *ToAttrOrErr;
8771
- else
8772
- return ToAttrOrErr.takeError ();
8705
+ AI.importAttr (From, AI.importArg (From->getSuccessValue ()).value (),
8706
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8707
+ From->args_size ());
8773
8708
break ;
8774
8709
}
8775
8710
case attr::SharedTrylockFunction: {
8776
8711
const auto *From = cast<SharedTrylockFunctionAttr>(FromAttr);
8777
- AttrImporter AI (*this );
8778
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8779
- From, AI.importArg (From->getSuccessValue ()).value (),
8780
- AI.importArrayArg (From->args (), From->args_size ()).value (),
8781
- From->args_size ());
8782
- if (ToAttrOrErr)
8783
- ToAttr = *ToAttrOrErr;
8784
- else
8785
- return ToAttrOrErr.takeError ();
8712
+ AI.importAttr (From, AI.importArg (From->getSuccessValue ()).value (),
8713
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8714
+ From->args_size ());
8786
8715
break ;
8787
8716
}
8788
8717
case attr::LockReturned: {
8789
8718
const auto *From = cast<LockReturnedAttr>(FromAttr);
8790
- AttrImporter AI (*this );
8791
- Expected<Attr *> ToAttrOrErr =
8792
- AI.createImportedAttr (From, AI.importArg (From->getArg ()).value ());
8793
- if (ToAttrOrErr)
8794
- ToAttr = *ToAttrOrErr;
8795
- else
8796
- return ToAttrOrErr.takeError ();
8719
+ AI.importAttr (From, AI.importArg (From->getArg ()).value ());
8797
8720
break ;
8798
8721
}
8799
8722
case attr::LocksExcluded: {
8800
8723
const auto *From = cast<LocksExcludedAttr>(FromAttr);
8801
- AttrImporter AI (*this );
8802
- Expected<Attr *> ToAttrOrErr = AI.createImportedAttr (
8803
- From, AI.importArrayArg (From->args (), From->args_size ()).value (),
8804
- From->args_size ());
8805
- if (ToAttrOrErr)
8806
- ToAttr = *ToAttrOrErr;
8807
- else
8808
- return ToAttrOrErr.takeError ();
8724
+ AI.importAttr (From,
8725
+ AI.importArrayArg (From->args (), From->args_size ()).value (),
8726
+ From->args_size ());
8809
8727
break ;
8810
8728
}
8811
8729
8812
- default :
8813
- // FIXME: 'clone' copies every member but some of them should be imported .
8814
- // Handle other Attrs that have parameters that should be imported.
8815
- ToAttr = FromAttr-> clone (ToContext);
8816
- ToAttr-> setRange (ToRange );
8730
+ default : {
8731
+ // The default branch works for attributes that have no arguments to import .
8732
+ // FIXME: Handle every attribute type that has arguments of type to import
8733
+ // (most often Expr* or Decl* or type) in the switch above.
8734
+ AI. cloneAttr (FromAttr );
8817
8735
break ;
8818
8736
}
8819
- assert (ToAttr && " Attribute should be created. " );
8820
-
8821
- return ToAttr ;
8737
+ }
8738
+
8739
+ return std::move (AI). getResult () ;
8822
8740
}
8823
8741
8824
8742
Decl *ASTImporter::GetAlreadyImportedOrNull (const Decl *FromD) const {
0 commit comments