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 }

Reply via email to