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

            Bug ID: 89757
           Summary: accepts returning with reference to temporary in
                    constant expression
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: leni536 at gmail dot com
  Target Milestone: ---

g++ accepts this ill-formed code:

constexpr const int& foo(int x, int y) {
    const int& z = x+y;
    return z;
}

constexpr int&& bar(int x, int y) {
    int&& z = x+y;
    return static_cast<int&&>(z);
}

int main() {
    constexpr int a = foo(1,2);
    constexpr int b = bar(1,2);
    return a+b;
}

This is invalid because both foo and bar return with a reference to a local
temporary object and expressions containing UB when evaluated are not constant
expressions.

$ g++ -std=c++14 -Wall -Wextra -pedantic -o gcc_bug gcc_bug.cpp && ./gcc_bug;
echo $?
6

Note: I tested it on 8.3.0 on my own machine, but it seems to be the same for
all versions on godbolt.

Reply via email to