reikdas updated this revision to Diff 261774. reikdas added a comment. Sorry my earlier update did not include the changes from the earlier revision.
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D77598/new/ https://reviews.llvm.org/D77598 Files: clang/lib/AST/TemplateBase.cpp clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp clang/test/CXX/lex/lex.literal/lex.ext/p12.cpp clang/test/CodeGenCXX/debug-info-template.cpp clang/test/Index/print-type.cpp clang/test/Misc/integer-literal-printing.cpp clang/test/Modules/lsv-debuginfo.cpp clang/test/SemaCXX/builtin-align-cxx.cpp clang/test/SemaCXX/cxx11-ast-print.cpp clang/test/SemaCXX/cxx11-call-to-deleted-constructor.cpp clang/test/SemaCXX/invalid-instantiated-field-decl.cpp clang/test/SemaCXX/vector.cpp clang/test/SemaTemplate/address_space-dependent.cpp clang/test/SemaTemplate/delegating-constructors.cpp clang/test/SemaTemplate/dependent-names.cpp clang/test/SemaTemplate/temp_arg_nontype.cpp
Index: clang/test/SemaTemplate/temp_arg_nontype.cpp =================================================================== --- clang/test/SemaTemplate/temp_arg_nontype.cpp +++ clang/test/SemaTemplate/temp_arg_nontype.cpp @@ -270,6 +270,24 @@ void test_char_possibly_negative() { enable_if_char<'\x02'>::type i; } // expected-error{{enable_if_char<'\x02'>'; did you mean 'enable_if_char<'a'>::type'?}} void test_char_single_quote() { enable_if_char<'\''>::type i; } // expected-error{{enable_if_char<'\''>'; did you mean 'enable_if_char<'a'>::type'?}} void test_char_backslash() { enable_if_char<'\\'>::type i; } // expected-error{{enable_if_char<'\\'>'; did you mean 'enable_if_char<'a'>::type'?}} + + template <int N> struct enable_if_int {}; + template <> struct enable_if_int<1> { typedef int type; }; // expected-note{{'enable_if_int<1>::type' declared here}} + void test_int() { enable_if_int<2>::type i; } // expected-error{{enable_if_int<2>'; did you mean 'enable_if_int<1>::type'?}} + + template <unsigned int N> struct enable_if_unsigned_int {}; + template <> struct enable_if_unsigned_int<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_int<1>::type' declared here}} + void test_unsigned_int() { enable_if_unsigned_int<2>::type i; } // expected-error{{enable_if_unsigned_int<2U>'; did you mean 'enable_if_unsigned_int<1>::type'?}} + + + template <unsigned long long N> struct enable_if_unsigned_long_long {}; + template <> struct enable_if_unsigned_long_long<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_long_long<1>::type' declared here}} + void test_unsigned_long_long() { enable_if_unsigned_long_long<2>::type i; } // expected-error{{enable_if_unsigned_long_long<2ULL>'; did you mean 'enable_if_unsigned_long_long<1>::type'?}} + + template <long long N> struct enable_if_long_long {}; + template <> struct enable_if_long_long<1> { typedef int type; }; // expected-note{{'enable_if_long_long<1>::type' declared here}} + void test_long_long() { enable_if_long_long<2>::type i; } // expected-error{{enable_if_long_long<2LL>'; did you mean 'enable_if_long_long<1>::type'?}} + } namespace PR10579 { Index: clang/test/SemaTemplate/dependent-names.cpp =================================================================== --- clang/test/SemaTemplate/dependent-names.cpp +++ clang/test/SemaTemplate/dependent-names.cpp @@ -338,7 +338,7 @@ struct Y: Y<dim> { }; // expected-error{{circular inheritance between 'Y<dim>' and 'Y<dim>'}} }; typedef X<3> X3; -X3::Y<>::iterator it; // expected-error {{no type named 'iterator' in 'PR11421::X<3>::Y<3>'}} +X3::Y<>::iterator it; // expected-error {{no type named 'iterator' in 'PR11421::X<3U>::Y<3U>'}} } namespace rdar12629723 { Index: clang/test/SemaTemplate/delegating-constructors.cpp =================================================================== --- clang/test/SemaTemplate/delegating-constructors.cpp +++ clang/test/SemaTemplate/delegating-constructors.cpp @@ -9,7 +9,7 @@ public: template <unsigned N> string(const char (&str)[N]) - : string(str) {} // expected-error{{constructor for 'string<6>' creates a delegation cycle}} + : string(str) {} // expected-error{{constructor for 'string<6U>' creates a delegation cycle}} }; void f() { Index: clang/test/SemaTemplate/address_space-dependent.cpp =================================================================== --- clang/test/SemaTemplate/address_space-dependent.cpp +++ clang/test/SemaTemplate/address_space-dependent.cpp @@ -84,8 +84,8 @@ template <unsigned B> int __attribute__((address_space(B))) *same_template(); void test_same_template() { (void) same_template<0>(); } -template <unsigned A> int __attribute__((address_space(A))) *different_template(); // expected-note {{candidate function [with A = 0]}} -template <unsigned B> int __attribute__((address_space(B+1))) *different_template(); // expected-note {{candidate function [with B = 0]}} +template <unsigned A> int __attribute__((address_space(A))) *different_template(); // expected-note {{candidate function [with A = 0U]}} +template <unsigned B> int __attribute__((address_space(B+1))) *different_template(); // expected-note {{candidate function [with B = 0U]}} void test_different_template() { (void) different_template<0>(); } // expected-error {{call to 'different_template' is ambiguous}} template <typename T> struct partial_spec_deduce_as; @@ -102,7 +102,7 @@ HasASTemplateFields<1> HASTF; neg<-1>(); // expected-note {{in instantiation of function template specialization 'neg<-1>' requested here}} correct<0x7FFFF3>(); - tooBig<8388650>(); // expected-note {{in instantiation of function template specialization 'tooBig<8388650>' requested here}} + tooBig<8388650>(); // expected-note {{in instantiation of function template specialization 'tooBig<8388650L>' requested here}} __attribute__((address_space(1))) char *x; __attribute__((address_space(2))) char *y; Index: clang/test/SemaCXX/vector.cpp =================================================================== --- clang/test/SemaCXX/vector.cpp +++ clang/test/SemaCXX/vector.cpp @@ -351,20 +351,20 @@ const TemplateVectorType<float, 32>::type Works = {}; const TemplateVectorType<int, 32>::type Works2 = {}; // expected-error@#1 {{invalid vector element type 'bool'}} - // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<bool, 32>' requested here}} + // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<bool, 32ULL>' requested here}} const TemplateVectorType<bool, 32>::type NoBool = {}; // expected-error@#1 {{invalid vector element type 'int __attribute__((ext_vector_type(4)))' (vector of 4 'int' values)}} - // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int __attribute__((ext_vector_type(4))), 32>' requested here}} + // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int __attribute__((ext_vector_type(4))), 32ULL>' requested here}} const TemplateVectorType<vi4, 32>::type NoComplex = {}; // expected-error@#1 {{vector size not an integral multiple of component size}} - // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 33>' requested here}} + // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 33ULL>' requested here}} const TemplateVectorType<int, 33>::type BadSize = {}; const TemplateVectorType<int, 3200>::type Large = {}; // expected-error@#1 {{vector size too large}} - // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 68719476736>' requested here}} + // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 68719476736ULL>' requested here}} const TemplateVectorType<int, 0x1000000000>::type TooLarge = {}; // expected-error@#1 {{zero vector size}} - // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 0>' requested here}} + // expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 0ULL>' requested here}} const TemplateVectorType<int, 0>::type Zero = {}; // expected-error@#2 {{vector size too large}} Index: clang/test/SemaCXX/invalid-instantiated-field-decl.cpp =================================================================== --- clang/test/SemaCXX/invalid-instantiated-field-decl.cpp +++ clang/test/SemaCXX/invalid-instantiated-field-decl.cpp @@ -31,5 +31,5 @@ class InlineFunctionInfo { public: explicit InlineFunctionInfo() {} - SmallVector<CallSite, 2> DevirtualizedCalls; // expected-note {{in instantiation of template class 'SmallVector<CallSite, 2>' requested}} + SmallVector<CallSite, 2> DevirtualizedCalls; // expected-note {{in instantiation of template class 'SmallVector<CallSite, 2U>' requested}} }; Index: clang/test/SemaCXX/cxx11-call-to-deleted-constructor.cpp =================================================================== --- clang/test/SemaCXX/cxx11-call-to-deleted-constructor.cpp +++ clang/test/SemaCXX/cxx11-call-to-deleted-constructor.cpp @@ -34,7 +34,7 @@ { Matrix<double> winI(0, 3); RGBFValue* inputPreL; - winI = { inputPreL->at() }; // expected-error {{call to deleted constructor of 'cva::Matrix<double, 0, 0> &&'}} + winI = { inputPreL->at() }; // expected-error {{call to deleted constructor of 'cva::Matrix<double, 0U, 0U> &&'}} } } Index: clang/test/SemaCXX/cxx11-ast-print.cpp =================================================================== --- clang/test/SemaCXX/cxx11-ast-print.cpp +++ clang/test/SemaCXX/cxx11-ast-print.cpp @@ -40,7 +40,7 @@ const char *p10 = 3.300e+15_fritz; template <class C, C...> const char *operator"" _suffix(); -// CHECK: const char *PR23120 = operator""_suffix<char32_t, 66615>(); +// CHECK: const char *PR23120 = operator""_suffix<char32_t, 66615U>(); const char *PR23120 = U"๐ท"_suffix; // PR28885 Index: clang/test/SemaCXX/builtin-align-cxx.cpp =================================================================== --- clang/test/SemaCXX/builtin-align-cxx.cpp +++ clang/test/SemaCXX/builtin-align-cxx.cpp @@ -31,10 +31,10 @@ void test() { test_templated_arguments<int, 32>(); // fine test_templated_arguments<struct fwddecl, 16>(); - // expected-note@-1{{in instantiation of function template specialization 'test_templated_arguments<fwddecl, 16, 16>'}} + // expected-note@-1{{in instantiation of function template specialization 'test_templated_arguments<fwddecl, 16L, 16L>'}} // expected-note@-2{{forward declaration of 'fwddecl'}} test_templated_arguments<int, 7>(); // invalid alignment value - // expected-note@-1{{in instantiation of function template specialization 'test_templated_arguments<int, 7, 16>'}} + // expected-note@-1{{in instantiation of function template specialization 'test_templated_arguments<int, 7L, 16L>'}} } template <typename T> Index: clang/test/Modules/lsv-debuginfo.cpp =================================================================== --- clang/test/Modules/lsv-debuginfo.cpp +++ clang/test/Modules/lsv-debuginfo.cpp @@ -26,14 +26,14 @@ // CHECK: @__clang_ast = // This type isn't anchored anywhere, expect a full definition. -// CHECK: !DICompositeType({{.*}}, name: "AlignedCharArray<4, 16>", +// CHECK: !DICompositeType({{.*}}, name: "AlignedCharArray<4U, 16U>", // CHECK-SAME: elements: // C // CHECK: @__clang_ast = // Here, too. -// CHECK: !DICompositeType({{.*}}, name: "AlignedCharArray<4, 16>", +// CHECK: !DICompositeType({{.*}}, name: "AlignedCharArray<4U, 16U>", // CHECK-SAME: elements: #include <B/B.h> Index: clang/test/Misc/integer-literal-printing.cpp =================================================================== --- clang/test/Misc/integer-literal-printing.cpp +++ clang/test/Misc/integer-literal-printing.cpp @@ -2,10 +2,10 @@ // PR11179 template <short T> class Type1 {}; -template <short T> void Function1(Type1<T>& x) {} // expected-note{{candidate function [with T = -42] not viable: expects an l-value for 1st argument}} +template <short T> void Function1(Type1<T>& x) {} // expected-note{{candidate function [with T = (short)-42] not viable: expects an l-value for 1st argument}} template <unsigned short T> class Type2 {}; -template <unsigned short T> void Function2(Type2<T>& x) {} // expected-note{{candidate function [with T = 42] not viable: expects an l-value for 1st argument}} +template <unsigned short T> void Function2(Type2<T>& x) {} // expected-note{{candidate function [with T = 42U] not viable: expects an l-value for 1st argument}} enum class boolTy : bool { b = 0, Index: clang/test/Index/print-type.cpp =================================================================== --- clang/test/Index/print-type.cpp +++ clang/test/Index/print-type.cpp @@ -132,7 +132,7 @@ // CHECK: TypedefDecl=OtherType:26:18 (Definition) [type=outer::inner::Bar::OtherType] [typekind=Typedef] [canonicaltype=double] [canonicaltypekind=Double] [isPOD=1] // CHECK: TypedefDecl=ArrayType:27:15 (Definition) [type=outer::inner::Bar::ArrayType] [typekind=Typedef] [canonicaltype=int [5]] [canonicaltypekind=ConstantArray] [isPOD=1] // CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1] -// CHECK: FieldDecl=baz:28:20 (Definition) [type=Baz<int, 1, Foo>] [typekind=Unexposed] [templateargs/3= [type=int] [typekind=Int]] [canonicaltype=outer::Baz<int, 1, Foo>] [canonicaltypekind=Record] [canonicaltemplateargs/3= [type=int] [typekind=Int]] [isPOD=1] +// CHECK: FieldDecl=baz:28:20 (Definition) [type=Baz<int, 1, Foo>] [typekind=Unexposed] [templateargs/3= [type=int] [typekind=Int]] [canonicaltype=outer::Baz<int, 1U, Foo>] [canonicaltypekind=Record] [canonicaltemplateargs/3= [type=int] [typekind=Int]] [isPOD=1] // CHECK: TemplateRef=Baz:9:8 [type=] [typekind=Invalid] [isPOD=0] // CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1] // CHECK: TemplateRef=Foo:4:8 [type=] [typekind=Invalid] [isPOD=0] Index: clang/test/CodeGenCXX/debug-info-template.cpp =================================================================== --- clang/test/CodeGenCXX/debug-info-template.cpp +++ clang/test/CodeGenCXX/debug-info-template.cpp @@ -1,6 +1,6 @@ // RUN: %clang -S -emit-llvm -target x86_64-unknown_unknown -g %s -o - -std=c++11 | FileCheck %s -// CHECK: @tci = dso_local global %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested" zeroinitializer, align 1, !dbg [[TCI:![0-9]+]] +// CHECK: @tci = dso_local global %"struct.TC<unsigned int, 2U, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested" zeroinitializer, align 1, !dbg [[TCI:![0-9]+]] // CHECK: @tcn = dso_local global %struct.TC zeroinitializer, align 1, !dbg [[TCN:![0-9]+]] // CHECK: @nn = dso_local global %struct.NN zeroinitializer, align 1, !dbg [[NN:![0-9]+]] @@ -31,7 +31,7 @@ // CHECK: ![[TCNESTED]] ={{.*}}!DICompositeType(tag: DW_TAG_structure_type, name: "nested", // CHECK-SAME: scope: ![[TC:[0-9]+]], -// CHECK: ![[TC]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>" +// CHECK: ![[TC]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "TC<unsigned int, 2U, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>" // CHECK-SAME: templateParams: [[TCARGS:![0-9]*]] TC // CHECK: [[TCARGS]] = !{[[TCARG1:![0-9]*]], [[TCARG2:![0-9]*]], [[TCARG3:![0-9]*]], [[TCARG4:![0-9]*]], [[TCARG5:![0-9]*]], [[TCARG6:![0-9]*]], [[TCARG7:![0-9]*]]} Index: clang/test/CXX/lex/lex.literal/lex.ext/p12.cpp =================================================================== --- clang/test/CXX/lex/lex.literal/lex.ext/p12.cpp +++ clang/test/CXX/lex/lex.literal/lex.ext/p12.cpp @@ -8,7 +8,7 @@ template<> struct check<char32_t, 34, 1090, 1077, 1089, 1090, 32, 65536>{}; template<typename T, T... str> int operator""_x() { // #1 expected-warning {{string literal operator templates are a GNU extension}} - check<T, str...> chars; // expected-error {{implicit instantiation of undefined template 'check<char, 't', 'e', 's', 't'>'}} expected-error {{implicit instantiation of undefined template 'check<char32_t, 34, 1090, 1077, 1089, 1090, 95, 65536>'}} + check<T, str...> chars; // expected-error {{implicit instantiation of undefined template 'check<char, 't', 'e', 's', 't'>'}} expected-error {{implicit instantiation of undefined template 'check<char32_t, 34U, 1090U, 1077U, 1089U, 1090U, 95U, 65536U>'}} return 1; } void *operator""_x(const char*); // #2 @@ -18,4 +18,4 @@ int d = "test"_x; // expected-note {{in instantiation of function template specialization 'operator""_x<char, 't', 'e', 's', 't'>' requested here}} int e = uR"("ัะตัั ๐)"_x; int f = UR"("ัะตัั ๐)"_x; -int g = UR"("ัะตัั_๐)"_x; // expected-note {{in instantiation of function template specialization 'operator""_x<char32_t, 34, 1090, 1077, 1089, 1090, 95, 65536>' requested here}} +int g = UR"("ัะตัั_๐)"_x; // expected-note {{in instantiation of function template specialization 'operator""_x<char32_t, 34U, 1090U, 1077U, 1089U, 1090U, 95U, 65536U>' requested here}} Index: clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp =================================================================== --- clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp +++ clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp @@ -45,13 +45,13 @@ namespace std { template<size_t, typename> struct tuple_element; } // expected-note 2{{here}} void no_tuple_element_2() { - auto [a0, a1, a2] = A(); // expected-error {{implicit instantiation of undefined template 'std::tuple_element<0, A>'}} expected-note {{in implicit}} + auto [a0, a1, a2] = A(); // expected-error {{implicit instantiation of undefined template 'std::tuple_element<0UL, A>'}} expected-note {{in implicit}} } template<> struct std::tuple_element<0, A> { typedef float type; }; void no_tuple_element_3() { - auto [a0, a1, a2] = A(); // expected-error {{implicit instantiation of undefined template 'std::tuple_element<1, A>'}} expected-note {{in implicit}} + auto [a0, a1, a2] = A(); // expected-error {{implicit instantiation of undefined template 'std::tuple_element<1UL, A>'}} expected-note {{in implicit}} } template<> struct std::tuple_element<1, A> { typedef float &type; }; Index: clang/lib/AST/TemplateBase.cpp =================================================================== --- clang/lib/AST/TemplateBase.cpp +++ clang/lib/AST/TemplateBase.cpp @@ -76,7 +76,32 @@ Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true); Out << "'"; } else { - Out << Val; + if (T->isBuiltinType()) { + switch (cast<BuiltinType>(T)->getKind()) { + case BuiltinType::ULongLong: + Out << Val << "ULL"; + break; + case BuiltinType::LongLong: + Out << Val << "LL"; + break; + case BuiltinType::ULong: + Out << Val << "UL"; + break; + case BuiltinType::Long: + Out << Val << "L"; + break; + case BuiltinType::Int: + Out << Val; + break; + default: + if (T->isUnsignedIntegerType()) + Out << Val << "U"; + else + Out << "(" << T->getCanonicalTypeInternal().getAsString(Policy) << ")" + << Val; + } + } else + Out << Val; } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits