Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >8 --
This test with invalid ^^decltype crashes. finish_decltype_type
can now see a USING_DECL because they sometimes aren't stripped when
using -freflection. We should give an error like we do for TYPE_DECL,
otherwise finish_decltype_type returns NULL_TREE and eventually we
crash in cp_parser_qualifying_entity after calling cp_parser_decltype.
PR c++/124494
gcc/cp/ChangeLog:
* semantics.cc (finish_decltype_type): Also error for USING_DECL.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/decltype1.C: New test.
---
gcc/cp/semantics.cc | 2 ++
gcc/testsuite/g++.dg/reflect/decltype1.C | 9 +++++++++
2 files changed, 11 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/reflect/decltype1.C
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index ac08b598f3d..5f6ee949f05 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -13163,6 +13163,8 @@ finish_decltype_type (tree expr, bool
id_expression_or_member_access_p,
if (TYPE_P (expr)
|| TREE_CODE (expr) == TYPE_DECL
+ /* In reflect-expressions USING_DECLs are not stripped. */
+ || TREE_CODE (expr) == USING_DECL
|| (TREE_CODE (expr) == BIT_NOT_EXPR
&& TYPE_P (TREE_OPERAND (expr, 0))))
{
diff --git a/gcc/testsuite/g++.dg/reflect/decltype1.C
b/gcc/testsuite/g++.dg/reflect/decltype1.C
new file mode 100644
index 00000000000..2f9948b7a35
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/decltype1.C
@@ -0,0 +1,9 @@
+// PR c++/124494
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+typedef signed char int8_t;
+namespace std {
+ using ::int8_t;
+}
+auto rr = ^^decltype(std::int8_t); // { dg-error "argument to .decltype. must
be an expression" }
base-commit: 64f95a0eeaf1cb6d07cc414c9b2953a494e03be1
--
2.53.0