This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/32019] New: Condition operator ?: and ambiguous convertions


The following program should not compile (without warnings) on two counts, but
in fact only fails on one, and not for the right reason, as far as I can see.

class C
{
public:
  C(const char *);
  operator const char *();
};

void
foo (bool b)
{
  // Prove that the implicit convertions work both ways.
  C c = "1";
  const char * s = C("2");

  // This is ambiguous; both operands may be converted to the other's type.
  // However, the compiler accepts it without a diagnostic.
  b ? "1" : C("2");

  // This is basically the same as the previous statement, but it fails with
  // the error "operands to ?: have different types".
  b ? c : s;
}

Both conditional operators should fall foul of clause 5.16, paragraph 3, of the
C++ standard. The last two operands are of different types, and each may be
implicitly converted to the opposite, as demonstrated by the assignments above.

The second conditional operator looks like a different way of writing the
first, but fails with an error stating that the operands have different types.
They do have different types, but again, the conversions should apply just the
same.

If I alter the program to use a type other than "const char *" (such as int, or
another class type) then I get different results again, which is surprising.


-- 
           Summary: Condition operator ?: and ambiguous convertions
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: andrew dot stubbs at st dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32019


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]