Skip to content

By-copy capture-default causes const unless mutable despite non-odr-use #22978

Open
@hubert-reinterpretcast

Description

@hubert-reinterpretcast
Bugzilla Link 22604
Version trunk
OS All

Extended Description

In the following, it is observed that (consistent with the resolution to DR1472) the appearance of ref in the lambda did not cause the creation of a corresponding member of the closure type since there is no complaint from Clang about the deleted copy constructor.

Since said appearance of ref does not refer to a member of the closure type, it appears that Clang wrong in its complaining about const in the output below. At the same time, adding mutable to the lambda-declarator should not make a difference, but it does with Clang.

SOURCE (<stdin>):

struct A {
   A() = default;
   A(const A &) = delete;
} globalA;

int main() {
   A &ref = globalA, *bar(A &);
   [=]() { bar(ref); };
}

COMPILER INVOCATION:

clang -cc1 -Wno-unused-value -std=c++11 -x c++ -

ACTUAL OUTPUT:

<stdin>:8:16: error: binding of reference to type 'A' to a value of type 'const A' drops qualifiers
   [=]() { bar(ref); };
               ^~~
<stdin>:7:30: note: passing argument to parameter here
   A &ref = globalA, *bar(A &);
                             ^
1 error generated.

EXPECTED OUTPUT:

(Clean compile)

COMPILER VERSION INFO:

clang version 3.7.0 (trunk 229397)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
Selected GCC installation: /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
Candidate multilib: .;@m64
Selected multilib: .;@m64

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillac++14clang:frontendLanguage frontend issues, e.g. anything involving "Sema"lambdaC++11 lambda expressions

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions