https://bugs.llvm.org/show_bug.cgi?id=44688

            Bug ID: 44688
           Summary: Bogus reference bindings incorrectly accepted
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
          Assignee: unassignedclangb...@nondot.org
          Reporter: ca...@carter.net
                CC: blitzrak...@gmail.com, dgre...@apple.com,
                    erik.pilking...@gmail.com, llvm-bugs@lists.llvm.org,
                    richard-l...@metafoo.co.uk

Today's trunk and release/10.x accept the TU:

  struct ExplicitToInt {
    explicit operator int() const;
  };

  const int& x(ExplicitToInt{}); // #1
  int&& y(ExplicitToInt{});      // #2

despite that GCC, MSVC, and I agree that both reference bindings are
ill-formed. Running quickly through the bullets in [dcl.init.ref]/5:

* 5.1 doesn't apply: the initializer is not an lvalue

* 5.2 doesn't apply: neither target reference is an lvalue reference to
non-const-qualified or volatile-qualified type

* 5.3.1 doesn't apply: Neither int nor const int is reference-compatible with
ExplicitToInt

* 5.3.2: doesn't apply, ***assuming that "can be converted" means "can be
implicitly converted"***

* 5.4: doesn't apply because the explicit conversion operator cannot be
selected for "copy-initialization of an object of type "cv1 T1" [const int and
int for #1 and #2 respectively] by user-defined conversion".

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to