@@ -1215,46 +1215,19 @@ class TemplateDiff {
12151215 bool &NeedAddressOf) {
12161216 if (!Iter.isEnd ()) {
12171217 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 ;
12501223 case TemplateArgument::Integral:
1251- Value = TA. getAsIntegral ();
1224+ Value = Iter-> getAsIntegral ();
12521225 HasInt = true ;
1253- IntType = TA. getIntegralType ();
1226+ IntType = Iter-> getIntegralType ();
12541227 return ;
12551228 case TemplateArgument::Declaration: {
1256- VD = TA. getAsDecl ();
1257- QualType ArgType = TA. getParamTypeForDecl ();
1229+ VD = Iter-> getAsDecl ();
1230+ QualType ArgType = Iter-> getParamTypeForDecl ();
12581231 QualType VDType = VD->getType ();
12591232 if (ArgType->isPointerType () &&
12601233 Context.hasSameType (ArgType->getPointeeType (), VDType))
@@ -1265,13 +1238,62 @@ class TemplateDiff {
12651238 IsNullPtr = true ;
12661239 return ;
12671240 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 ();
12741253 }
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" );
12751297 }
12761298
12771299 // / DiffNonTypes - Handles any template parameters not handled by DiffTypes
0 commit comments