Re: can gcc warn about this ambiguous function call in a '?:'?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Matthew Woehlke wrote:
$ gcc --version
gcc (GCC) 4.1.2

I have a program that looks roughly like this:

class Bar {
  Bar(int);
  Bar(char*);
  // details aren't important
}

foo(Bar b) {
  // ...
}

foo(bool a) {
  foo (a ? 0 : Bar("hello"));
}

Basically, two overloads where one takes a bool and calls the other, which has an identical signature except s/bool/Bar/, where one can pass '0' for a Bar. As a result, the call when a==true is ambiguous... but g++ -Wall doesn't warn about this. I was also a bit surprised that gcc is generating code that calls a different function depending on the ?: expression (maybe I shouldn't be), but it seems unlikely that this sort of thing would be done intentionally very often.

So... is there a warning for this? Can/should there be?

John pointed out off-list that both parts of '?:' should be required to evaluate to the same type, i.e. the above cannot generate calls to different functions. This made me realize that my example is not so good. Looking at the real code (see previous message), what I am actually doing is 'foo( a ? 0 : EnumValue );', where there is an implicit ctor Bar(Enum). Obviously, QFlags<T> is a bit of a special case where the cast to QFlags<T> (i.e. "Bar") is always preferred over the cast Enum->int->bool, but I'm not sure I can consider that a bug.

So... I guess I'd still like to see a warning. Conceptually, it's still a "ambiguous call to foo()" warning, but emitted because g++ chose the cast Enum->int->bool over the implicit Bar(int)+Bar(Enum) ctor casts. But I have no idea how easy/hard that is to code :-(.

--
Matthew
The prhase "less is more" takes on a whole new meaning if you think about standard Unix tools.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux