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 }