@@ -1215,46 +1215,19 @@ class TemplateDiff {
1215
1215
bool &NeedAddressOf) {
1216
1216
if (!Iter.isEnd ()) {
1217
1217
switch (Iter->getKind ()) {
1218
- default :
1219
- llvm_unreachable (" unknown ArgumentKind" );
1220
- case TemplateArgument::Integral:
1221
- Value = Iter->getAsIntegral ();
1222
- HasInt = true ;
1223
- IntType = Iter->getIntegralType ();
1224
- return ;
1225
- case TemplateArgument::Declaration: {
1226
- VD = Iter->getAsDecl ();
1227
- QualType ArgType = Iter->getParamTypeForDecl ();
1228
- QualType VDType = VD->getType ();
1229
- if (ArgType->isPointerType () &&
1230
- Context.hasSameType (ArgType->getPointeeType (), VDType))
1231
- NeedAddressOf = true ;
1232
- return ;
1233
- }
1234
- case TemplateArgument::NullPtr:
1235
- IsNullPtr = true ;
1236
- return ;
1237
- case TemplateArgument::Expression:
1238
- E = Iter->getAsExpr ();
1239
- }
1240
- } else if (!Default->isParameterPack ()) {
1241
- E = Default->getDefaultArgument ().getArgument ().getAsExpr ();
1242
- }
1243
-
1244
- if (!Iter.hasDesugaredTA ()) return ;
1245
-
1246
- const TemplateArgument& TA = Iter.getDesugaredTA ();
1247
- switch (TA.getKind ()) {
1248
- default :
1249
- llvm_unreachable (" unknown ArgumentKind" );
1218
+ case TemplateArgument::StructuralValue:
1219
+ // FIXME: Diffing of structural values is not implemented.
1220
+ // There is no possible fallback in this case, this will show up
1221
+ // as '(no argument)'.
1222
+ return ;
1250
1223
case TemplateArgument::Integral:
1251
- Value = TA. getAsIntegral ();
1224
+ Value = Iter-> getAsIntegral ();
1252
1225
HasInt = true ;
1253
- IntType = TA. getIntegralType ();
1226
+ IntType = Iter-> getIntegralType ();
1254
1227
return ;
1255
1228
case TemplateArgument::Declaration: {
1256
- VD = TA. getAsDecl ();
1257
- QualType ArgType = TA. getParamTypeForDecl ();
1229
+ VD = Iter-> getAsDecl ();
1230
+ QualType ArgType = Iter-> getParamTypeForDecl ();
1258
1231
QualType VDType = VD->getType ();
1259
1232
if (ArgType->isPointerType () &&
1260
1233
Context.hasSameType (ArgType->getPointeeType (), VDType))
@@ -1265,13 +1238,62 @@ class TemplateDiff {
1265
1238
IsNullPtr = true ;
1266
1239
return ;
1267
1240
case TemplateArgument::Expression:
1268
- // TODO: Sometimes, the desugared template argument Expr differs from
1269
- // the sugared template argument Expr. It may be useful in the future
1270
- // but for now, it is just discarded.
1271
- if (!E)
1272
- E = TA.getAsExpr ();
1273
- return ;
1241
+ E = Iter->getAsExpr ();
1242
+ break ;
1243
+ case TemplateArgument::Null:
1244
+ case TemplateArgument::Type:
1245
+ case TemplateArgument::Template:
1246
+ case TemplateArgument::TemplateExpansion:
1247
+ llvm_unreachable (" TemplateArgument kind is not expected for NTTP" );
1248
+ case TemplateArgument::Pack:
1249
+ llvm_unreachable (" TemplateArgument kind should be handled elsewhere" );
1250
+ }
1251
+ } else if (!Default->isParameterPack ()) {
1252
+ E = Default->getDefaultArgument ().getArgument ().getAsExpr ();
1274
1253
}
1254
+
1255
+ if (!Iter.hasDesugaredTA ())
1256
+ return ;
1257
+
1258
+ const TemplateArgument &TA = Iter.getDesugaredTA ();
1259
+ switch (TA.getKind ()) {
1260
+ case TemplateArgument::StructuralValue:
1261
+ // FIXME: Diffing of structural values is not implemented.
1262
+ // Just fall back to the expression.
1263
+ return ;
1264
+ case TemplateArgument::Integral:
1265
+ Value = TA.getAsIntegral ();
1266
+ HasInt = true ;
1267
+ IntType = TA.getIntegralType ();
1268
+ return ;
1269
+ case TemplateArgument::Declaration: {
1270
+ VD = TA.getAsDecl ();
1271
+ QualType ArgType = TA.getParamTypeForDecl ();
1272
+ QualType VDType = VD->getType ();
1273
+ if (ArgType->isPointerType () &&
1274
+ Context.hasSameType (ArgType->getPointeeType (), VDType))
1275
+ NeedAddressOf = true ;
1276
+ return ;
1277
+ }
1278
+ case TemplateArgument::NullPtr:
1279
+ IsNullPtr = true ;
1280
+ return ;
1281
+ case TemplateArgument::Expression:
1282
+ // TODO: Sometimes, the desugared template argument Expr differs from
1283
+ // the sugared template argument Expr. It may be useful in the future
1284
+ // but for now, it is just discarded.
1285
+ if (!E)
1286
+ E = TA.getAsExpr ();
1287
+ return ;
1288
+ case TemplateArgument::Null:
1289
+ case TemplateArgument::Type:
1290
+ case TemplateArgument::Template:
1291
+ case TemplateArgument::TemplateExpansion:
1292
+ llvm_unreachable (" TemplateArgument kind is not expected for NTTP" );
1293
+ case TemplateArgument::Pack:
1294
+ llvm_unreachable (" TemplateArgument kind should be handled elsewhere" );
1295
+ }
1296
+ llvm_unreachable (" Unexpected TemplateArgument kind" );
1275
1297
}
1276
1298
1277
1299
// / DiffNonTypes - Handles any template parameters not handled by DiffTypes
0 commit comments