Hi!

On the following testcase we ICE because name is BIT_NOT_EXPR and
suggest_alternative_in_scoped_enum assumes it is called on IDENTIFIER_NODE
only.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

There is another issue, starting with 7.x we don't use sensible location in
the diagnostics, 6.x emitted
pr89390.C: In function ‘void foo()’:
pr89390.C:9:3: error: ‘~A’ is not a member of ‘A’
   A::~A (); // { dg-error "'~A' is not a member of 'A'" }
   ^
but 7.x and later emits:
In function ‘void foo()’:
cc1plus: error: ‘~A’ is not a member of ‘A’

This patch doesn't deal with that, but would be nice to provide location,
dunno if it is enough to just use location of ~, or if we need to spend
memory and build ~A as combined range with caret on ~.

2019-02-18  Jakub Jelinek  <ja...@redhat.com>

        PR c++/89390
        * error.c (qualified_name_lookup_error): Only call
        suggest_alternative_in_scoped_enum if name is IDENTIFIER_NODE.

        * g++.dg/diagnostic/pr89390.C: New test.

--- gcc/cp/error.c.jj   2019-01-17 09:03:11.486787567 +0100
+++ gcc/cp/error.c      2019-02-18 20:56:48.047604338 +0100
@@ -4276,7 +4276,7 @@ qualified_name_lookup_error (tree scope,
       else
        {
          name_hint hint;
-         if (SCOPED_ENUM_P (scope))
+         if (SCOPED_ENUM_P (scope) && TREE_CODE (name) == IDENTIFIER_NODE)
            hint = suggest_alternative_in_scoped_enum (name, scope);
          if (const char *suggestion = hint.suggestion ())
            {
--- gcc/testsuite/g++.dg/diagnostic/pr89390.C.jj        2019-02-18 
20:58:47.358646700 +0100
+++ gcc/testsuite/g++.dg/diagnostic/pr89390.C   2019-02-18 20:58:13.746198205 
+0100
@@ -0,0 +1,10 @@
+// PR c++/89390
+// { dg-do compile { target c++11 } }
+
+enum class A { B, C };
+
+void
+foo ()
+{
+  A::~A ();    // { dg-error "'~A' is not a member of 'A'" "" { target *-*-* } 
0 }
+}

        Jakub

Reply via email to