Skip to content

Bogus reference bindings incorrectly accepted #44033

@CaseyCarter

Description

@CaseyCarter
Bugzilla Link 44688
Version trunk
OS Windows NT
CC @DougGregor,@zygoloid

Extended Description

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".

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillac++clang:frontendLanguage frontend issues, e.g. anything involving "Sema"

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions