Message ID | 20230504163353.1327143-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: fix pretty printing of 'alignof' vs '__alignof__' [PR85979] | expand |
On 5/4/23 12:33, Patrick Palka wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk? OK. > PR c++/85979 > > gcc/cp/ChangeLog: > > * cxx-pretty-print.cc (cxx_pretty_printer::unary_expression) > <case ALIGNOF_EXPR>: Consider ALIGNOF_EXPR_STD_P. > * error.cc (dump_expr) <case ALIGNOF_EXPR>: Likewise. > > gcc/testsuite/ChangeLog: > > * g++.dg/diagnostic/alignof4.C: New test. > --- > gcc/cp/cxx-pretty-print.cc | 7 ++++++- > gcc/cp/error.cc | 7 +++---- > gcc/testsuite/g++.dg/diagnostic/alignof4.C | 21 +++++++++++++++++++++ > 3 files changed, 30 insertions(+), 5 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/diagnostic/alignof4.C > > diff --git a/gcc/cp/cxx-pretty-print.cc b/gcc/cp/cxx-pretty-print.cc > index 4cda27f2b30..4e9de3eff87 100644 > --- a/gcc/cp/cxx-pretty-print.cc > +++ b/gcc/cp/cxx-pretty-print.cc > @@ -844,7 +844,12 @@ cxx_pretty_printer::unary_expression (tree t) > /* Fall through */ > > case ALIGNOF_EXPR: > - pp_cxx_ws_string (this, code == SIZEOF_EXPR ? "sizeof" : "__alignof__"); > + if (code == SIZEOF_EXPR) > + pp_cxx_ws_string (this, "sizeof"); > + else if (ALIGNOF_EXPR_STD_P (t)) > + pp_cxx_ws_string (this, "alignof"); > + else > + pp_cxx_ws_string (this, "__alignof__"); > pp_cxx_whitespace (this); > if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t)) > { > diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc > index a5d888926a6..7865f6518fc 100644 > --- a/gcc/cp/error.cc > +++ b/gcc/cp/error.cc > @@ -2840,11 +2840,10 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags) > case ALIGNOF_EXPR: > if (TREE_CODE (t) == SIZEOF_EXPR) > pp_cxx_ws_string (pp, "sizeof"); > + else if (ALIGNOF_EXPR_STD_P (t)) > + pp_cxx_ws_string (pp, "alignof"); > else > - { > - gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR); > - pp_cxx_ws_string (pp, "__alignof__"); > - } > + pp_cxx_ws_string (pp, "__alignof__"); > op = TREE_OPERAND (t, 0); > if (PACK_EXPANSION_P (op)) > { > diff --git a/gcc/testsuite/g++.dg/diagnostic/alignof4.C b/gcc/testsuite/g++.dg/diagnostic/alignof4.C > new file mode 100644 > index 00000000000..f6fc5c31563 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/diagnostic/alignof4.C > @@ -0,0 +1,21 @@ > +// PR c++/85979 > +// { dg-do compile { target c++11 } } > + > +template<int N> struct A { }; > + > +template<class T> > +void f(A<alignof(T)>) { } > + > +#if __cpp_concepts > +template<class T> > +void g() requires (alignof(T) == 0); > +#endif > + > +int main() { > + f<int>(); // { dg-error "no match" } > +#if __cpp_concepts > + g<int>(); // { dg-error "no match" "" { target c++20 } } > +#endif > +} > + > +// { dg-bogus "__alignof__" "" { target *-*-* } 0 }
diff --git a/gcc/cp/cxx-pretty-print.cc b/gcc/cp/cxx-pretty-print.cc index 4cda27f2b30..4e9de3eff87 100644 --- a/gcc/cp/cxx-pretty-print.cc +++ b/gcc/cp/cxx-pretty-print.cc @@ -844,7 +844,12 @@ cxx_pretty_printer::unary_expression (tree t) /* Fall through */ case ALIGNOF_EXPR: - pp_cxx_ws_string (this, code == SIZEOF_EXPR ? "sizeof" : "__alignof__"); + if (code == SIZEOF_EXPR) + pp_cxx_ws_string (this, "sizeof"); + else if (ALIGNOF_EXPR_STD_P (t)) + pp_cxx_ws_string (this, "alignof"); + else + pp_cxx_ws_string (this, "__alignof__"); pp_cxx_whitespace (this); if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t)) { diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc index a5d888926a6..7865f6518fc 100644 --- a/gcc/cp/error.cc +++ b/gcc/cp/error.cc @@ -2840,11 +2840,10 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags) case ALIGNOF_EXPR: if (TREE_CODE (t) == SIZEOF_EXPR) pp_cxx_ws_string (pp, "sizeof"); + else if (ALIGNOF_EXPR_STD_P (t)) + pp_cxx_ws_string (pp, "alignof"); else - { - gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR); - pp_cxx_ws_string (pp, "__alignof__"); - } + pp_cxx_ws_string (pp, "__alignof__"); op = TREE_OPERAND (t, 0); if (PACK_EXPANSION_P (op)) { diff --git a/gcc/testsuite/g++.dg/diagnostic/alignof4.C b/gcc/testsuite/g++.dg/diagnostic/alignof4.C new file mode 100644 index 00000000000..f6fc5c31563 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/alignof4.C @@ -0,0 +1,21 @@ +// PR c++/85979 +// { dg-do compile { target c++11 } } + +template<int N> struct A { }; + +template<class T> +void f(A<alignof(T)>) { } + +#if __cpp_concepts +template<class T> +void g() requires (alignof(T) == 0); +#endif + +int main() { + f<int>(); // { dg-error "no match" } +#if __cpp_concepts + g<int>(); // { dg-error "no match" "" { target c++20 } } +#endif +} + +// { dg-bogus "__alignof__" "" { target *-*-* } 0 }