Hi,

in this 4.8/4.9 Regression having to do with using declarations we ICE at the gcc_assert in instantiate_type:

   gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
           || TREE_CODE (rhs) == COMPONENT_REF
           || really_overloaded_fn (rhs)
           || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL));

because really_overloaded_fn (rhs) is false. Marek figured out that the ICE started with the representation change:

    http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=184873

which means that OVERLOADs are *always* built for using-decls. Thus I think it could make sense to simply loosen a bit the gcc_assert. The below passes testing + fixes c++/57444 too.

Thanks,
Paolo.

//////////////////////

/cp
2013-09-18

        PR c++/58457
        * class.c (instantiate_type): Loosen a bit the gcc_assert.

/testsuite
2013-09-18

        PR c++/58457
        * g++.dg/parse/using4.C: New.
Index: cp/class.c
===================================================================
--- cp/class.c  (revision 202703)
+++ cp/class.c  (working copy)
@@ -7627,7 +7627,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_f
      dependent on overload resolution.  */
   gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
              || TREE_CODE (rhs) == COMPONENT_REF
-             || really_overloaded_fn (rhs)
+             || is_overloaded_fn (rhs)
              || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL));
 
   /* This should really only be used when attempting to distinguish
Index: testsuite/g++.dg/parse/using4.C
===================================================================
--- testsuite/g++.dg/parse/using4.C     (revision 0)
+++ testsuite/g++.dg/parse/using4.C     (working copy)
@@ -0,0 +1,20 @@
+// PR c++/58457
+
+struct allocator
+{
+  void operator delete (void*);
+  void* operator new (__SIZE_TYPE__, void*);
+};
+
+struct type : public allocator
+{
+  type() {}
+  using allocator::operator new;
+  using allocator::operator delete;
+};
+
+int main()
+{
+  new (0) type;
+  return 0;
+}

Reply via email to