Message ID | CABKRkghgrav70yuPLpxaRXV33m30ZOq_5az0Azgy0kcP-ys8SQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | [PR91979] Incorrect mangling for non-template-argument nullptr expression | expand |
attached patch file. On Tue, Oct 22, 2019 at 10:00 PM kamlesh kumar <kamleshbhalui@gmail.com> wrote: > > bootstrap and regtested on x86_64. > > Changelog: > gcc > ------ > 2019-10-22 Kamlesh Kumar <kamleshbhalui@gmail.com> > > PR c++/91979 - mangling nullptr expression > * mangle.c (write_template_arg_literal): Handle nullptr > mangling. > * testsuite/g++.dg/cpp0x/nullptr27.C: Modify Test. > * testsuite/g++.dg/cpp0x/pr91979.C: New Test. > > libiberty > ----------- > 2019-10-22 Kamlesh Kumar <kamleshbhalui@gmail.com> > > * cp-demangle.c (d_expr_primary): Handle > nullptr demangling. > * testsuite/demangle-expected: Added test. > ========================================================= > > > > > diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c > index a9333b8..780da9f 100644 > --- a/gcc/cp/mangle.c > +++ b/gcc/cp/mangle.c > @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) > case INTEGER_CST: > gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) > || integer_zerop (value) || integer_onep (value)); > - write_integer_cst (value); > + if (TREE_CODE(TREE_TYPE(value)) != NULLPTR_TYPE) > + write_integer_cst (value); > break; > > case REAL_CST: > diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > index 2510dc8..edd1160 100644 > --- a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > @@ -1,7 +1,7 @@ > // PR c++/52706 > // { dg-do compile { target c++11 } } > // { dg-options "-fabi-version=0" } > -// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } } > +// { dg-final { scan-assembler "_Z1fIDnLDnEEiT_" } } > > template<class T, decltype(nullptr) = nullptr> > int f(T); > diff --git a/gcc/testsuite/g++.dg/cpp0x/pr91979.C b/gcc/testsuite/g++.dg/cpp0x/pr91979.C > new file mode 100644 > index 0000000..7fcd56b > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/pr91979.C > @@ -0,0 +1,15 @@ > +// PR c++/91989 > +// { dg-do compile { target c++11 } } > +// { dg-final { scan-assembler "_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE" } } > + > +template <bool, typename T = void> > +struct enable_if {}; > + > +template <typename T> > +struct enable_if<true, T> { typedef T type; }; > + > +template <void *P> > +void foo(typename enable_if<P == nullptr>::type* = 0) {} > + > +template void foo<(void *)0>(void *); > + > diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c > index aa78c86..3e6b6fb 100644 > --- a/libiberty/cp-demangle.c > +++ b/libiberty/cp-demangle.c > @@ -3577,6 +3577,16 @@ d_expr_primary (struct d_info *di) > && type->u.s_builtin.type->print != D_PRINT_DEFAULT) > di->expansion -= type->u.s_builtin.type->len; > > + if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE > + && strncmp(type->u.s_builtin.type->name,cplus_demangle_builtin_types[33].name,17) == 0) > + { > + if (d_peek_char (di) == 'E') > + { > + d_advance (di, 1); > + return type; > + } > + } > + > /* Rather than try to interpret the literal value, we just > collect it as a string. Note that it's possible to have a > floating point literal here. The ABI specifies that the > diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected > index f21ed00..b23a7c2 100644 > --- a/libiberty/testsuite/demangle-expected > +++ b/libiberty/testsuite/demangle-expected > @@ -1446,3 +1446,7 @@ Foo<int>()::X::fn > _ZZZ3FooIiEfvENKUlT_E_clIcEEDaS0_EN1X2fnEv > Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn() > Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn > +#PR91979 demangling nullptr expression > + > +_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE > +void foo<(void*)0>(enable_if<((void*)0)==((decltype(nullptr))), void>::type*) > > ./Kamlesh
On Tue, Oct 22, 2019 at 10:00:19PM +0530, kamlesh kumar wrote: > diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c > index a9333b8..780da9f 100644 > --- a/gcc/cp/mangle.c > +++ b/gcc/cp/mangle.c > @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) > case INTEGER_CST: > gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) > || integer_zerop (value) || integer_onep (value)); > - write_integer_cst (value); > + if (TREE_CODE(TREE_TYPE(value)) != NULLPTR_TYPE) > + write_integer_cst (value); Please use NULLPTR_TYPE_P. Does this warrant a new -fabi-version? Marek
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a9333b8..334610c 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) case INTEGER_CST: gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) || integer_zerop (value) || integer_onep (value)); - write_integer_cst (value); + if (!NULLPTR_TYPE_P (TREE_TYPE (value))) + write_integer_cst (value); break; case REAL_CST: diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C index 2510dc8..edd1160 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C @@ -1,7 +1,7 @@ // PR c++/52706 // { dg-do compile { target c++11 } } // { dg-options "-fabi-version=0" } -// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } } +// { dg-final { scan-assembler "_Z1fIDnLDnEEiT_" } } template<class T, decltype(nullptr) = nullptr> int f(T); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr91979.C b/gcc/testsuite/g++.dg/cpp0x/pr91979.C new file mode 100644 index 0000000..7fcd56b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr91979.C @@ -0,0 +1,15 @@ +// PR c++/91989 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE" } } + +template <bool, typename T = void> +struct enable_if {}; + +template <typename T> +struct enable_if<true, T> { typedef T type; }; + +template <void *P> +void foo(typename enable_if<P == nullptr>::type* = 0) {} + +template void foo<(void *)0>(void *); + diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index aa78c86..3c32b26 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -3577,6 +3577,16 @@ d_expr_primary (struct d_info *di) && type->u.s_builtin.type->print != D_PRINT_DEFAULT) di->expansion -= type->u.s_builtin.type->len; + if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE + && strncmp(type->u.s_builtin.type->name,cplus_demangle_builtin_types[33].name,17) == 0) + { + if (d_peek_char (di) == 'E') + { + d_advance (di, 1); + return type; + } + } + /* Rather than try to interpret the literal value, we just collect it as a string. Note that it's possible to have a floating point literal here. The ABI specifies that the diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index f21ed00..b23a7c2 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -1446,3 +1446,7 @@ Foo<int>()::X::fn _ZZZ3FooIiEfvENKUlT_E_clIcEEDaS0_EN1X2fnEv Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn() Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn +#PR91979 demangling nullptr expression + +_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE +void foo<(void*)0>(enable_if<((void*)0)==((decltype(nullptr))), void>::type*) On Tue, Oct 22, 2019 at 10:50 PM kamlesh kumar <kamleshbhalui@gmail.com> wrote: > Marek, > updated the patch as per your suggestion. > Regarding -fabi-version. > this is what Jonathan said: > > This might need a new -fabi-version to preserve the old mangling for compatibility, but I'll let Jason determine that. > > > Thanks. > > > > On Tue, Oct 22, 2019 at 10:24 PM Marek Polacek <polacek@redhat.com> wrote: > >> On Tue, Oct 22, 2019 at 10:00:19PM +0530, kamlesh kumar wrote: >> > diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c >> > index a9333b8..780da9f 100644 >> > --- a/gcc/cp/mangle.c >> > +++ b/gcc/cp/mangle.c >> > @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) >> > case INTEGER_CST: >> > gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) >> > || integer_zerop (value) || integer_onep (value)); >> > - write_integer_cst (value); >> > + if (TREE_CODE(TREE_TYPE(value)) != NULLPTR_TYPE) >> > + write_integer_cst (value); >> >> Please use NULLPTR_TYPE_P. >> >> Does this warrant a new -fabi-version? >> >> Marek >> >>
On Tue, Oct 22, 2019 at 10:53 PM kamlesh kumar <kamleshbhalui@gmail.com> wrote: > > diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c > index a9333b8..334610c 100644 > --- a/gcc/cp/mangle.c > +++ b/gcc/cp/mangle.c > @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) > case INTEGER_CST: > gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) > || integer_zerop (value) || integer_onep (value)); > - write_integer_cst (value); > + if (!NULLPTR_TYPE_P (TREE_TYPE (value))) > + write_integer_cst (value); > break; > > case REAL_CST: > diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > index 2510dc8..edd1160 100644 > --- a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C > @@ -1,7 +1,7 @@ > // PR c++/52706 > // { dg-do compile { target c++11 } } > // { dg-options "-fabi-version=0" } > -// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } } > +// { dg-final { scan-assembler "_Z1fIDnLDnEEiT_" } } > > template<class T, decltype(nullptr) = nullptr> > int f(T); > diff --git a/gcc/testsuite/g++.dg/cpp0x/pr91979.C b/gcc/testsuite/g++.dg/cpp0x/pr91979.C > new file mode 100644 > index 0000000..7fcd56b > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/pr91979.C > @@ -0,0 +1,15 @@ > +// PR c++/91989 > +// { dg-do compile { target c++11 } } > +// { dg-final { scan-assembler "_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE" } } > + > +template <bool, typename T = void> > +struct enable_if {}; > + > +template <typename T> > +struct enable_if<true, T> { typedef T type; }; > + > +template <void *P> > +void foo(typename enable_if<P == nullptr>::type* = 0) {} > + > +template void foo<(void *)0>(void *); > + > diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c > index aa78c86..3c32b26 100644 > --- a/libiberty/cp-demangle.c > +++ b/libiberty/cp-demangle.c > @@ -3577,6 +3577,16 @@ d_expr_primary (struct d_info *di) > && type->u.s_builtin.type->print != D_PRINT_DEFAULT) > di->expansion -= type->u.s_builtin.type->len; > > + if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE > + && strncmp(type->u.s_builtin.type->name,cplus_demangle_builtin_types[33].name,17) == 0) > + { > + if (d_peek_char (di) == 'E') > + { > + d_advance (di, 1); > + return type; > + } > + } > + > /* Rather than try to interpret the literal value, we just > collect it as a string. Note that it's possible to have a > floating point literal here. The ABI specifies that the > diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected > index f21ed00..b23a7c2 100644 > --- a/libiberty/testsuite/demangle-expected > +++ b/libiberty/testsuite/demangle-expected > @@ -1446,3 +1446,7 @@ Foo<int>()::X::fn > _ZZZ3FooIiEfvENKUlT_E_clIcEEDaS0_EN1X2fnEv > Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn() > Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn > +#PR91979 demangling nullptr expression > + > +_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE > +void foo<(void*)0>(enable_if<((void*)0)==((decltype(nullptr))), void>::type*) > > On Tue, Oct 22, 2019 at 10:50 PM kamlesh kumar <kamleshbhalui@gmail.com> wrote: >> >> Marek, >> updated the patch as per your suggestion. >> Regarding -fabi-version. >> this is what Jonathan said: >> >> This might need a new -fabi-version to preserve the old mangling for compatibility, but I'll let Jason determine that. >> >> >> Thanks. >> >> >> >> On Tue, Oct 22, 2019 at 10:24 PM Marek Polacek <polacek@redhat.com> wrote: >>> >>> On Tue, Oct 22, 2019 at 10:00:19PM +0530, kamlesh kumar wrote: >>> > diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c >>> > index a9333b8..780da9f 100644 >>> > --- a/gcc/cp/mangle.c >>> > +++ b/gcc/cp/mangle.c >>> > @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) >>> > case INTEGER_CST: >>> > gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) >>> > || integer_zerop (value) || integer_onep (value)); >>> > - write_integer_cst (value); >>> > + if (TREE_CODE(TREE_TYPE(value)) != NULLPTR_TYPE) >>> > + write_integer_cst (value); >>> >>> Please use NULLPTR_TYPE_P. >>> >>> Does this warrant a new -fabi-version? >>> >>> Marek >>>
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a9333b8..780da9f 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -3400,7 +3400,8 @@ write_template_arg_literal (const tree value) case INTEGER_CST: gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) || integer_zerop (value) || integer_onep (value)); - write_integer_cst (value); + if (TREE_CODE(TREE_TYPE(value)) != NULLPTR_TYPE) + write_integer_cst (value); break; case REAL_CST: diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C index 2510dc8..edd1160 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nullptr27.C +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr27.C @@ -1,7 +1,7 @@ // PR c++/52706 // { dg-do compile { target c++11 } } // { dg-options "-fabi-version=0" } -// { dg-final { scan-assembler "_Z1fIDnLDn0EEiT_" } } +// { dg-final { scan-assembler "_Z1fIDnLDnEEiT_" } } template<class T, decltype(nullptr) = nullptr> int f(T); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr91979.C b/gcc/testsuite/g++.dg/cpp0x/pr91979.C new file mode 100644 index 0000000..7fcd56b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr91979.C @@ -0,0 +1,15 @@ +// PR c++/91989 +// { dg-do compile { target c++11 } } +// { dg-final { scan-assembler "_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE" } } + +template <bool, typename T = void> +struct enable_if {}; + +template <typename T> +struct enable_if<true, T> { typedef T type; }; + +template <void *P> +void foo(typename enable_if<P == nullptr>::type* = 0) {} + +template void foo<(void *)0>(void *); + diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index aa78c86..3e6b6fb 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -3577,6 +3577,16 @@ d_expr_primary (struct d_info *di) && type->u.s_builtin.type->print != D_PRINT_DEFAULT) di->expansion -= type->u.s_builtin.type->len; + if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE + && strncmp(type->u.s_builtin.type->name,cplus_demangle_builtin_types[33].name,17) == 0) + { + if (d_peek_char (di) == 'E') + { + d_advance (di, 1); + return type; + } + } + /* Rather than try to interpret the literal value, we just collect it as a string. Note that it's possible to have a floating point literal here. The ABI specifies that the diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index f21ed00..b23a7c2 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -1446,3 +1446,7 @@ Foo<int>()::X::fn _ZZZ3FooIiEfvENKUlT_E_clIcEEDaS0_EN1X2fnEv Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn() Foo<int>()::{lambda(auto:1)#1}::operator()<char>(char) const::X::fn +#PR91979 demangling nullptr expression + +_Z3fooILPv0EEvPN9enable_ifIXeqT_LDnEEvE4typeE +void foo<(void*)0>(enable_if<((void*)0)==((decltype(nullptr))),