Author: rsmith Date: Sun Dec 25 14:21:12 2016 New Revision: 290522 URL: http://llvm.org/viewvc/llvm-project?rev=290522&view=rev Log: Fix assertion failure when deducing an auto-typed argument against a different-width int.
Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=290522&r1=290521&r2=290522&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Sun Dec 25 14:21:12 2016 @@ -2037,7 +2037,7 @@ static bool isSameTemplateArg(ASTContext Y.getAsTemplateOrTemplatePattern()).getAsVoidPointer(); case TemplateArgument::Integral: - return X.getAsIntegral() == Y.getAsIntegral(); + return hasSameExtendedValue(X.getAsIntegral(), Y.getAsIntegral()); case TemplateArgument::Expression: { llvm::FoldingSetNodeID XID, YID; Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp?rev=290522&r1=290521&r2=290522&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp (original) +++ cfe/trunk/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp Sun Dec 25 14:21:12 2016 @@ -250,6 +250,23 @@ namespace Auto { } namespace Decomposition { + // Types of deduced non-type template arguments must match exactly, so + // partial ordering fails in both directions here. + template<auto> struct Any; + template<int N> struct Any<N> { typedef int Int; }; // expected-note 3{{match}} + template<short N> struct Any<N> { typedef int Short; }; // expected-note 3{{match}} + Any<0>::Int is_int; // expected-error {{ambiguous}} + Any<(short)0>::Short is_short; // expected-error {{ambiguous}} + Any<(char)0>::Short is_char; // expected-error {{ambiguous}} + + template<int, auto> struct NestedAny; + template<auto N> struct NestedAny<0, N>; // expected-note 3{{match}} + template<int N> struct NestedAny<0, N> { typedef int Int; }; // expected-note 3{{match}} + template<short N> struct NestedAny<0, N> { typedef int Short; }; // expected-note 3{{match}} + NestedAny<0, 0>::Int nested_int; // expected-error {{ambiguous}} + NestedAny<0, (short)0>::Short nested_short; // expected-error {{ambiguous}} + NestedAny<0, (char)0>::Short nested_char; // expected-error {{ambiguous}} + double foo(int, bool); template<auto& f> struct fn_result_type; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits