Bug 29188 - undocumented extension with ambiguous between conversion function/constructor. related to const
Summary: undocumented extension with ambiguous between conversion function/constructor...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.1.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
Keywords: diagnostic, documentation
Depends on:
Reported: 2006-09-22 23:46 UTC by Steve Hewitt
Modified: 2021-12-10 21:58 UTC (History)
4 users (show)

See Also:
Known to work:
Known to fail: 2.95.3, 3.0.4, 4.0.0, 4.1.0
Last reconfirmed: 2021-12-10 00:00:00


Note You need to log in before you can comment on or make changes to this bug.
Description Steve Hewitt 2006-09-22 23:46:07 UTC
g++ release 4.1.1 compiles the following invalid code without detecting an error.
It does correctly find the error with -pedantic. Interestingly (perhaps), it also correctly detects the ambiguous call where the argument involved is const - as demonstrated by the second compilation below with the macro C2 defined:

sjh@mill:~/c++/compiler$ g++ -c conversion.ambig.c
sjh@mill:~/c++/compiler$ cat conversion.ambig.c
class Source;

class Destination
Destination() {}
Destination (const Source& source) {}

class Source
Source() {}
operator Destination() const { return Destination();}

Source source;
Destination wolf =  source; // ambiguous

#ifdef C2
const Source source2;
Destination wolf2 =  source2; // ambiguous
sjh@mill:~/c++/compiler$ g++ -D C2 conversion.ambig.c
conversion.ambig.c:22: error: conversion from 'const Source' to 'Destination' is ambiguous
conversion.ambig.c:14: note: candidates are: Source::operator Destination() const
conversion.ambig.c:7: note:                 Destination::Destination(const Source&)
sjh@mill:~/c++/compiler$ gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: /home/sjh/gcc/gcc-4.1.1/configure --prefix=/home/sjh/gcc/prefix/ --enable-languages=c,c++
Thread model: posix
gcc version 4.1.1
Comment 1 Andrew Pinski 2006-09-22 23:58:46 UTC
I changed the summary since this is undocumented extension and we reject it with -pedantic already, I don't know if this is useful extension or not.
Comment 2 Steve Hewitt 2006-09-23 16:29:01 UTC
According to 1.4/8 implementations with extensions are required to "diagnose
programs that use extensions that are ill-formed according to this International
Standard." This code is ill-formed so presumably g++ should print a warning.

I don't know the motivation for the extension but would highlight the question of
whether it was intentional that it affects non-const arguments but not const.
Comment 3 Wolfgang Bangerth 2006-10-10 03:44:52 UTC
Confirmed. Not a useful extension because confusing:
struct A;

struct B {
    B (const A&);

struct A {
    operator B() const;

A a;
B b1 =  a;    // xpass
g/x> /home/bangerth/bin/gcc-4.2-pre/bin/c++ -c x.cc
g/x> /home/bangerth/bin/gcc-4.2-pre/bin/c++ -c x.cc -pedantic
x.cc:12: error: conversion from ‘A’ to ‘B’ is ambiguous
x.cc:8: note: candidates are: A::operator B() const
x.cc:4: note:                 B::B(const A&)
Comment 4 sandra 2018-11-17 23:24:43 UTC
This showed up on my search for documentation issues, but from the discussion it appears it's a missing-diagnostic issue instead.  I've confirmed the test case still behaves as described on trunk.