https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96462

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:1cbc10d894494c34987d1f42f955e7843457ee38

commit r11-7125-g1cbc10d894494c34987d1f42f955e7843457ee38
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Feb 4 12:53:59 2021 -0500

    c++: Fix ICE with invalid using enum [PR96462]

    Here we ICE in finish_nonmember_using_decl -> lookup_using_decl ->
    ... -> find_namespace_slot because "name" is not an IDENTIFIER_NODE.
    It is a BIT_NOT_EXPR because this broken test uses

      using E::~E; // SCOPE::NAME

    A using-decl can't refer to a destructor, and lookup_using_decl already
    checks that in the class member case.  But in C++17, we do the "enum
    scope is the enclosing scope" block, and so scope gets set to ::, and
    we go into the NAMESPACE_DECL block.  In C++20 we don't do it, we go
    to the ENUMERAL_TYPE block.

    I resorted to hoisting the check along with a diagnostic tweak: we
    don't want to print "::::~E names destructor".

    gcc/cp/ChangeLog:

            PR c++/96462
            * name-lookup.c (lookup_using_decl): Hoist the destructor check.

    gcc/testsuite/ChangeLog:

            PR c++/96462
            * g++.dg/cpp2a/using-enum-8.C: New test.

Reply via email to