@@ -1526,7 +1526,8 @@ createArgument(const Record &Arg, StringRef Attr,
15261526
15271527 if (!Ptr) {
15281528 // Search in reverse order so that the most-derived type is handled first.
1529- for (const auto &[Base, _] : reverse (Search->getSuperClasses ())) {
1529+ std::vector<const Record *> SCs = Search->getSuperClasses ();
1530+ for (const Record *Base : reverse (SCs)) {
15301531 if ((Ptr = createArgument (Arg, Attr, Base)))
15311532 break ;
15321533 }
@@ -1856,17 +1857,16 @@ static LateAttrParseKind getLateAttrParseKind(const Record *Attr) {
18561857 auto *LAPK = Attr->getValueAsDef (LateParsedStr);
18571858
18581859 // Typecheck the `LateParsed` field.
1859- SmallVector<const Record *, 1 > SuperClasses;
1860- LAPK->getDirectSuperClasses (SuperClasses);
1861- if (SuperClasses.size () != 1 )
1860+ if (LAPK->getDirectSuperClasses ().size () != 1 )
18621861 PrintFatalError (Attr, " Field `" + Twine (LateParsedStr) +
18631862 " `should only have one super class" );
18641863
1865- if (SuperClasses[0 ]->getName () != LateAttrParseKindStr)
1864+ const Record *SuperClass = LAPK->getDirectSuperClasses ()[0 ].first ;
1865+ if (SuperClass->getName () != LateAttrParseKindStr)
18661866 PrintFatalError (
18671867 Attr, " Field `" + Twine (LateParsedStr) + " `should only have type `" +
18681868 Twine (LateAttrParseKindStr) + " ` but found type `" +
1869- SuperClasses[ 0 ] ->getName () + " `" );
1869+ SuperClass ->getName () + " `" );
18701870
18711871 // Get Kind and verify the enum name matches the name in `Attr.td`.
18721872 unsigned Kind = LAPK->getValueAsInt (KindFieldStr);
@@ -2465,8 +2465,8 @@ static void emitStringSwitchCases(std::map<StringRef, FSIVecTy> &Map,
24652465}
24662466
24672467static bool isTypeArgument (const Record *Arg) {
2468- return !Arg->getSuperClasses ().empty () &&
2469- Arg->getSuperClasses ().back ().first ->getName () == " TypeArgument" ;
2468+ return !Arg->getDirectSuperClasses ().empty () &&
2469+ Arg->getDirectSuperClasses ().back ().first ->getName () == " TypeArgument" ;
24702470}
24712471
24722472// / Emits the first-argument-is-type property for attributes.
@@ -2507,42 +2507,45 @@ static void emitClangAttrArgContextList(const RecordKeeper &Records,
25072507}
25082508
25092509static bool isIdentifierArgument (const Record *Arg) {
2510- return !Arg->getSuperClasses ().empty () &&
2511- StringSwitch<bool >(Arg->getSuperClasses ().back ().first ->getName ())
2510+ return !Arg->getDirectSuperClasses ().empty () &&
2511+ StringSwitch<bool >(
2512+ Arg->getDirectSuperClasses ().back ().first ->getName ())
25122513 .Case (" IdentifierArgument" , true )
25132514 .Case (" EnumArgument" , true )
25142515 .Case (" VariadicEnumArgument" , true )
25152516 .Default (false );
25162517}
25172518
25182519static bool isVariadicIdentifierArgument (const Record *Arg) {
2519- return !Arg->getSuperClasses ().empty () &&
2520- StringSwitch<bool >(Arg->getSuperClasses ().back ().first ->getName ())
2520+ return !Arg->getDirectSuperClasses ().empty () &&
2521+ StringSwitch<bool >(
2522+ Arg->getDirectSuperClasses ().back ().first ->getName ())
25212523 .Case (" VariadicIdentifierArgument" , true )
25222524 .Case (" VariadicParamOrParamIdxArgument" , true )
25232525 .Default (false );
25242526}
25252527
25262528static bool isVariadicExprArgument (const Record *Arg) {
2527- return !Arg->getSuperClasses ().empty () &&
2528- StringSwitch<bool >(Arg->getSuperClasses ().back ().first ->getName ())
2529+ return !Arg->getDirectSuperClasses ().empty () &&
2530+ StringSwitch<bool >(
2531+ Arg->getDirectSuperClasses ().back ().first ->getName ())
25292532 .Case (" VariadicExprArgument" , true )
25302533 .Default (false );
25312534}
25322535
25332536static bool isStringLiteralArgument (const Record *Arg) {
2534- if (Arg->getSuperClasses ().empty ())
2537+ if (Arg->getDirectSuperClasses ().empty ())
25352538 return false ;
2536- StringRef ArgKind = Arg->getSuperClasses ().back ().first ->getName ();
2539+ StringRef ArgKind = Arg->getDirectSuperClasses ().back ().first ->getName ();
25372540 if (ArgKind == " EnumArgument" )
25382541 return Arg->getValueAsBit (" IsString" );
25392542 return ArgKind == " StringArgument" ;
25402543}
25412544
25422545static bool isVariadicStringLiteralArgument (const Record *Arg) {
2543- if (Arg->getSuperClasses ().empty ())
2546+ if (Arg->getDirectSuperClasses ().empty ())
25442547 return false ;
2545- StringRef ArgKind = Arg->getSuperClasses ().back ().first ->getName ();
2548+ StringRef ArgKind = Arg->getDirectSuperClasses ().back ().first ->getName ();
25462549 if (ArgKind == " VariadicEnumArgument" )
25472550 return Arg->getValueAsBit (" IsString" );
25482551 return ArgKind == " VariadicStringArgument" ;
@@ -2631,8 +2634,9 @@ static void emitClangAttrStrictIdentifierArgList(const RecordKeeper &Records,
26312634}
26322635
26332636static bool keywordThisIsaIdentifierInArgument (const Record *Arg) {
2634- return !Arg->getSuperClasses ().empty () &&
2635- StringSwitch<bool >(Arg->getSuperClasses ().back ().first ->getName ())
2637+ return !Arg->getDirectSuperClasses ().empty () &&
2638+ StringSwitch<bool >(
2639+ Arg->getDirectSuperClasses ().back ().first ->getName ())
26362640 .Case (" VariadicParamOrParamIdxArgument" , true )
26372641 .Default (false );
26382642}
@@ -2718,11 +2722,11 @@ static void emitAttributes(const RecordKeeper &Records, raw_ostream &OS,
27182722 if (!R.getValueAsBit (" ASTNode" ))
27192723 continue ;
27202724
2721- ArrayRef< std::pair <const Record *, SMRange> > Supers = R.getSuperClasses ();
2725+ std::vector <const Record *> Supers = R.getSuperClasses ();
27222726 assert (!Supers.empty () && " Forgot to specify a superclass for the attr" );
27232727 std::string SuperName;
27242728 bool Inheritable = false ;
2725- for (const auto &[R, _] : reverse (Supers)) {
2729+ for (const Record *R : reverse (Supers)) {
27262730 if (R->getName () != " TargetSpecificAttr" &&
27272731 R->getName () != " DeclOrTypeAttr" && SuperName.empty ())
27282732 SuperName = R->getName ().str ();
@@ -3419,10 +3423,10 @@ namespace {
34193423 AttrClass *findSuperClass (const Record *R) const {
34203424 // TableGen flattens the superclass list, so we just need to walk it
34213425 // in reverse.
3422- auto SuperClasses = R->getSuperClasses ();
3423- for (signed i = 0 , e = SuperClasses. size (); i != e; ++i ) {
3424- auto SuperClass = findClassByRecord (SuperClasses[e - i - 1 ]. first );
3425- if (SuperClass) return SuperClass;
3426+ std::vector< const Record *> SuperClasses = R->getSuperClasses ();
3427+ for (const Record *R : reverse (SuperClasses) ) {
3428+ if (AttrClass * SuperClass = findClassByRecord (R))
3429+ return SuperClass;
34263430 }
34273431 return nullptr ;
34283432 }
@@ -4661,8 +4665,9 @@ static void GenerateHandleDeclAttribute(const Record &Attr, raw_ostream &OS) {
46614665}
46624666
46634667static bool isParamExpr (const Record *Arg) {
4664- return !Arg->getSuperClasses ().empty () &&
4665- StringSwitch<bool >(Arg->getSuperClasses ().back ().first ->getName ())
4668+ return !Arg->getDirectSuperClasses ().empty () &&
4669+ StringSwitch<bool >(
4670+ Arg->getDirectSuperClasses ().back ().first ->getName ())
46664671 .Case (" ExprArgument" , true )
46674672 .Case (" VariadicExprArgument" , true )
46684673 .Default (false );
@@ -4785,7 +4790,7 @@ void EmitClangAttrParsedAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
47854790 if (Arg->getValueAsBitOrUnset (" Fake" , UnusedUnset))
47864791 continue ;
47874792 ArgNames.push_back (Arg->getValueAsString (" Name" ).str ());
4788- for (const auto &[ Class, _] : Arg->getSuperClasses ()) {
4793+ for (const Record * Class : Arg->getSuperClasses ()) {
47894794 if (Class->getName ().starts_with (" Variadic" )) {
47904795 ArgNames.back ().append (" ..." );
47914796 break ;
0 commit comments