@@ -111,42 +111,43 @@ static void checkConcrete(Record &R) {
111
111
112
112
// / Return an Init with a qualifier prefix referring
113
113
// / to CurRec's name.
114
- static Init *QualifyName (Record &CurRec, MultiClass *CurMultiClass, Init *Name,
115
- StringRef Scoper) {
114
+ static Init *QualifyName (Record &CurRec, Init *Name, bool IsMC = false ) {
116
115
RecordKeeper &RK = CurRec.getRecords ();
117
- Init *NewName = BinOpInit::getStrConcat (CurRec. getNameInit (),
118
- StringInit::get (RK, Scoper ));
116
+ Init *NewName = BinOpInit::getStrConcat (
117
+ CurRec. getNameInit (), StringInit::get (RK, IsMC ? " :: " : " : " ));
119
118
NewName = BinOpInit::getStrConcat (NewName, Name);
120
119
121
120
if (BinOpInit *BinOp = dyn_cast<BinOpInit>(NewName))
122
121
NewName = BinOp->Fold (&CurRec);
123
122
return NewName;
124
123
}
125
124
125
+ static Init *QualifyName (MultiClass *MC, Init *Name) {
126
+ return QualifyName (MC->Rec , Name, /* IsMC=*/ true );
127
+ }
128
+
126
129
// / Return the qualified version of the implicit 'NAME' template argument.
127
- static Init *QualifiedNameOfImplicitName (Record &Rec,
128
- MultiClass *MC = nullptr ) {
129
- return QualifyName (Rec, MC, StringInit::get (Rec.getRecords (), " NAME" ),
130
- MC ? " ::" : " :" );
130
+ static Init *QualifiedNameOfImplicitName (Record &Rec, bool IsMC = false ) {
131
+ return QualifyName (Rec, StringInit::get (Rec.getRecords (), " NAME" ), IsMC);
131
132
}
132
133
133
134
static Init *QualifiedNameOfImplicitName (MultiClass *MC) {
134
- return QualifiedNameOfImplicitName (MC->Rec , MC );
135
+ return QualifiedNameOfImplicitName (MC->Rec , /* IsMC= */ true );
135
136
}
136
137
137
- Init *TGVarScope::getVar (RecordKeeper &Records, MultiClass* ParsingMultiClass,
138
+ Init *TGVarScope::getVar (RecordKeeper &Records, MultiClass * ParsingMultiClass,
138
139
StringInit *Name, SMRange NameLoc,
139
140
bool TrackReferenceLocs) const {
140
141
// First, we search in local variables.
141
142
auto It = Vars.find (Name->getValue ());
142
143
if (It != Vars.end ())
143
144
return It->second ;
144
145
145
- std::function<Init * (Record *, StringInit *, StringRef)> FindValueInArgs =
146
- [&](Record *Rec, StringInit *Name, StringRef Scoper ) -> Init * {
146
+ auto FindValueInArgs = [&] (Record *Rec , StringInit *Name,
147
+ bool IsMC ) -> Init * {
147
148
if (!Rec)
148
149
return nullptr ;
149
- Init *ArgName = QualifyName (*Rec, ParsingMultiClass, Name, Scoper );
150
+ Init *ArgName = QualifyName (*Rec, Name, IsMC );
150
151
if (Rec->isTemplateArg (ArgName)) {
151
152
RecordVal *RV = Rec->getValue (ArgName);
152
153
assert (RV && " Template arg doesn't exist??" );
@@ -176,7 +177,7 @@ Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass* ParsingMultiClass,
176
177
177
178
// The variable is a class template argument?
178
179
if (CurRec->isClass ())
179
- if (auto *V = FindValueInArgs (CurRec, Name, " : " ))
180
+ if (auto *V = FindValueInArgs (CurRec, Name, /* IsMC= */ false ))
180
181
return V;
181
182
}
182
183
break ;
@@ -193,7 +194,7 @@ Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass* ParsingMultiClass,
193
194
case SK_MultiClass: {
194
195
// The variable is a multiclass template argument?
195
196
if (CurMultiClass)
196
- if (auto *V = FindValueInArgs (&CurMultiClass->Rec , Name, " :: " ))
197
+ if (auto *V = FindValueInArgs (&CurMultiClass->Rec , Name, /* IsMC= */ true ))
197
198
return V;
198
199
break ;
199
200
}
@@ -3191,8 +3192,7 @@ bool TGParser::ParseTemplateArgValueList(
3191
3192
" The name of named argument should be a valid identifier" );
3192
3193
3193
3194
auto *Name = cast<StringInit>(Value);
3194
- Init *QualifiedName =
3195
- QualifyName (*ArgsRec, CurMultiClass, Name, IsDefm ? " ::" : " :" );
3195
+ Init *QualifiedName = QualifyName (*ArgsRec, Name, /* IsMC=*/ IsDefm);
3196
3196
auto *NamedArg = ArgsRec->getValue (QualifiedName);
3197
3197
if (!NamedArg)
3198
3198
return Error (ValueLoc,
@@ -3271,17 +3271,17 @@ Init *TGParser::ParseDeclaration(Record *CurRec,
3271
3271
RecordVal (DeclName, IdLoc, Type,
3272
3272
HasField ? RecordVal::FK_NonconcreteOK
3273
3273
: RecordVal::FK_Normal));
3274
-
3275
3274
} else if (CurRec) { // class template argument
3276
- DeclName = QualifyName (*CurRec, CurMultiClass, DeclName, " : " );
3277
- BadField = AddValue (CurRec, IdLoc, RecordVal (DeclName, IdLoc, Type,
3278
- RecordVal::FK_TemplateArg));
3279
-
3275
+ DeclName = QualifyName (*CurRec, DeclName);
3276
+ BadField =
3277
+ AddValue (CurRec, IdLoc,
3278
+ RecordVal (DeclName, IdLoc, Type, RecordVal::FK_TemplateArg));
3280
3279
} else { // multiclass template argument
3281
3280
assert (CurMultiClass && " invalid context for template argument" );
3282
- DeclName = QualifyName (CurMultiClass->Rec , CurMultiClass, DeclName, " ::" );
3283
- BadField = AddValue (CurRec, IdLoc, RecordVal (DeclName, IdLoc, Type,
3284
- RecordVal::FK_TemplateArg));
3281
+ DeclName = QualifyName (CurMultiClass, DeclName);
3282
+ BadField =
3283
+ AddValue (CurRec, IdLoc,
3284
+ RecordVal (DeclName, IdLoc, Type, RecordVal::FK_TemplateArg));
3285
3285
}
3286
3286
if (BadField)
3287
3287
return nullptr ;
0 commit comments