Index: lib/AST/ASTDiagnostic.cpp =================================================================== --- lib/AST/ASTDiagnostic.cpp +++ lib/AST/ASTDiagnostic.cpp @@ -959,10 +959,12 @@ ToIter.isEnd() && ToExpr); if (DefaultNTTPD->getType()->isIntegralOrEnumerationType()) { if (FromExpr) - FromInt = GetInt(FromIter, FromExpr); + FromInt = GetInt(FromIter, FromExpr, HasFromInt); if (ToExpr) - ToInt = GetInt(ToIter, ToExpr); - Tree.SetNode(FromInt, ToInt, FromExpr, ToExpr); + ToInt = GetInt(ToIter, ToExpr, HasToInt); + } + if (HasFromInt && HasToInt) { + Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt); Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt)); Tree.SetKind(DiffTree::Integer); } else { @@ -970,14 +972,10 @@ Tree.SetKind(DiffTree::Expression); } } else if (HasFromInt || HasToInt) { - if (!HasFromInt && FromExpr) { - FromInt = GetInt(FromIter, FromExpr); - HasFromInt = true; - } - if (!HasToInt && ToExpr) { - ToInt = GetInt(ToIter, ToExpr); - HasToInt = true; - } + if (!HasFromInt && FromExpr) + FromInt = GetInt(FromIter, FromExpr, HasFromInt); + if (!HasToInt && ToExpr) + ToInt = GetInt(ToIter, ToExpr, HasToInt); Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt); Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt)); Tree.SetDefault(FromIter.isEnd() && HasFromInt, @@ -1121,9 +1119,10 @@ /// GetInt - Retrieves the template integer argument, including evaluating /// default arguments. - llvm::APInt GetInt(const TSTiterator &Iter, Expr *ArgExpr) { + llvm::APInt GetInt(const TSTiterator &Iter, Expr *ArgExpr, bool &HasInt) { // Default, value-depenedent expressions require fetching // from the desugared TemplateArgument + HasInt = true; if (Iter.isEnd() && ArgExpr->isValueDependent()) switch (Iter.getDesugar().getKind()) { case TemplateArgument::Integral: @@ -1134,7 +1133,11 @@ default: llvm_unreachable("Unexpected template argument kind"); } - return ArgExpr->EvaluateKnownConstInt(Context); + if (ArgExpr->isEvaluatable(Context)) + return ArgExpr->EvaluateKnownConstInt(Context); + + HasInt = false; + return llvm::APInt(); } /// GetValueDecl - Retrieves the template Decl argument, including Index: test/Misc/diag-template-diffing.cpp =================================================================== --- test/Misc/diag-template-diffing.cpp +++ test/Misc/diag-template-diffing.cpp @@ -1068,6 +1068,36 @@ } } +namespace PR15677 { +template +struct A{}; + +template +using B = A; + +template +using B = A; +// CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A' vs 'A') + +template +struct C{}; + +template +using D = C; + +template +using D = C; +// CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('C' vs 'C') + +template +using E = C; + +template +using E = C<42>; +// CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('C<42>' vs 'C') +} +} + // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated. // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated. // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated.