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

--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Author: mpolacek
Date: Wed Oct  9 17:49:26 2019
New Revision: 276766

URL: https://gcc.gnu.org/viewcvs?rev=276766&root=gcc&view=rev
Log:
        PR c++/92032 - DR 1601: Promotion of enum with fixed underlying type.

I've been messing with compare_ics recently and noticed that we don't
implement CWG 1601, which should be fairly easy.  Thus this patch.

The motivating example is 
  enum E : char { e };
  void f(char);
  void f(int);
  void g() {
    f(e);
  }
where the call to f was ambiguous but we should choose f(char).

Currently we give f(int) cr_promotion in standard_conversion, while
f(char) remains cr_std, which is worse than cr_promotion.  So I thought
I'd give it cr_promotion also and then add a tiebreaker to compare_ics.

        * call.c (standard_conversion): When converting an enumeration with
        a fixed underlying type to the underlying type, give it the
cr_promotion
        rank.
        (compare_ics): Implement a tiebreaker as per CWG 1601.

        * g++.dg/cpp0x/scoped_enum10.C: New test.
        * g++.dg/cpp0x/scoped_enum11.C: New test.


Added:
    trunk/gcc/testsuite/g++.dg/cpp0x/scoped_enum10.C
    trunk/gcc/testsuite/g++.dg/cpp0x/scoped_enum11.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/testsuite/ChangeLog

Reply via email to