Index: lib/Sema/SemaTemplateInstantiate.cpp =================================================================== --- lib/Sema/SemaTemplateInstantiate.cpp +++ lib/Sema/SemaTemplateInstantiate.cpp @@ -1376,7 +1376,7 @@ assert(Arg.getKind() == TemplateArgument::Type && "Template argument kind mismatch"); - QualType Replacement = Arg.getAsType(); + QualType Replacement = getSema().Context.getCanonicalType(Arg.getAsType()); // TODO: only do this uniquing once, at the start of instantiation. QualType Result Index: test/SemaTemplate/alias-templates.cpp =================================================================== --- test/SemaTemplate/alias-templates.cpp +++ test/SemaTemplate/alias-templates.cpp @@ -201,3 +201,17 @@ template using derived2 = ::PR16904::base::template derived; // expected-error {{expected a type}} expected-error {{expected ';'}} } + +namespace VariadicTemplateAlias { + template struct tuple; + template struct extract_; + + // Note: Both the template alias and the concatenation of variadic template + // arguments A and B are required to trigger the assertion failure. + + template + using extract = typename extract_::type; + + template + inline auto test(tuple&& xs, B&&... ys) -> extract { } +}