https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122007

            Bug ID: 122007
           Summary: inconsistent array decay to pointer in implicit
                    conversion during function call
           Product: gcc
           Version: 13.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marco.foco at gmail dot com
  Target Milestone: ---

Created attachment 62420
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62420&action=edit
preprocessed file

I found an issue in pointer decay when temporary creation is involved.

I have a class with a constrained constructor, designed to accept pointers (but
reject arrays):

class A {
public:
    template<typename T , std::enable_if_t<std::is_pointer_v<T>, bool> = true>
    A(T&& p) {}
};

I added two functions to show the issue, one taking A by const& and one by
value

void f_ref(const A&) {}
void f_val(A) {}

The test code tries to create the object and call both functions using a
fixed-size array.

int main() {
    const char v[4]{"abc"};
    // A a{v};      // <- This is rejected (correct)
    // f_ref(v);    // <- this is rejected (correct)
    f_val(v);       // <- this is accepted (wrong)
}

The two commented lines are rejected, while the third one is accepted.

The compiler seems, only in that case, to decay the array into a pointer.
Adding a `=delete`d constructor with the inverse condition fixes the problem.

The code is available on godbolt here: https://godbolt.org/z/n68Wj38ej

I verified the issue on all GCC compiler version available on godbolt from 7.1
to 15.2, and on what godbolt reports as trunk.

MSVC and Clang reject all three lines.

Local test:
gcc version: 13.3.0
system: Ubuntu 24.04 x86_64 running on Windows WSL
command line: gcc-13 bug.cpp
compiler output: none (the code is accepted)
preprocessed file: attached

Reply via email to