[LLVMbugs] [Bug 19160] New: failure to diagnose ambiguity in conditional between glvalue and prvalue

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Mar 17 00:34:34 PDT 2014


            Bug ID: 19160
           Summary: failure to diagnose ambiguity in conditional between
                    glvalue and prvalue
           Product: clang
           Version: unspecified
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: richard-llvm at metafoo.co.uk
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified


struct B;
struct A { A(); A(B&) = delete; operator B&(); };
struct B : A {} b;
B &c = true ? A() : b;

The A prvalue converts to a B lvalue, and the B lvalue satisfies the rules for
converting to an A prvalue. 5.16/3 bullet 3 bullet 1 is clear that we only
actually copy-initalize a temporary of type A from 'b' "if the conversion is
applied", which it isn't in this case, because we hit the ambiguity first.

So we should reject this due to ambiguity, instead of accepting it and picking
the non-deleted conversion sequence. Both GCC and EDG reject.

Here's a more exciting case:

struct B;
struct A { A(); A(B&); operator B&() = delete; };
struct B : A {} b;
B &c = true ? A() : b;

Here, we should either claim ambiguity or convert 'b' to an A prvalue
(depending on whether the "can be implicitly converted" check in 5.16/3 bullet
1 cares about deletedness or not) -- the standard is not clear which (and a
literal reading suggests this way round is valid!); we convert the 'A'
temporary to a B lvalue!

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140317/30468ca3/attachment.html>

More information about the llvm-bugs mailing list