http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57063

             Bug #: 57063
           Summary: Valid static_cast from data member to rvalue reference
                    fails to compile
    Classification: Unclassified
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: ts...@mail.ru


G++ 4.8-20130418 fails to compile the following well-formed code:

    using T = int;

    struct X
    {
        T &&f()
        {
            return static_cast<T &&>(value);
        }
        T &&value;
    };

    int main() {}

It issues the following error at the line with static_cast:

    cannot bind ‘T {aka int}’ lvalue to ‘T&& {aka int&&}’
         return static_cast<T &&>(value);

Command line: g++ test.cpp -std=c++11 -pedantic -v
Output:
==============================================================
Using built-in specs.
COLLECT_GCC=../builds/gcc-4.8-20130418/target/bin/g++
COLLECT_LTO_WRAPPER=../builds/gcc-4.8-20130418/target/libexec/gcc/i686-pc-linux-gnu/4.8.1/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ../Downloads/gcc_install/gcc-4.8-20130418/configure
--prefix=../builds/gcc-4.8-20130418/target --enable-languages=c,c++
--disable-werror
Thread model: posix
gcc version 4.8.1 20130418 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-std=c++11' '-Wpedantic' '-v' '-shared-libgcc'
'-mtune=generic' '-march=pentiumpro'
 ../builds/gcc-4.8-20130418/target/libexec/gcc/i686-pc-linux-gnu/4.8.1/cc1plus
-quiet -v -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic
-march=pentiumpro -auxbase test -Wpedantic -std=c++11 -version -o
/tmp/cc8uNbtW.s
GNU C++ (GCC) version 4.8.1 20130418 (prerelease) (i686-pc-linux-gnu)
    compiled by GNU C version 4.8.1 20130418 (prerelease), GMP version 5.1.1,
MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory
"../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1/i686-pc-linux-gnu

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1/backward
 ../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/include
 /usr/local/include
 ../builds/gcc-4.8-20130418/target/include

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/include-fixed
 /usr/include
End of search list.
GNU C++ (GCC) version 4.8.1 20130418 (prerelease) (i686-pc-linux-gnu)
    compiled by GNU C version 4.8.1 20130418 (prerelease), GMP version 5.1.1,
MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 0f47b9d9fd89a439a6a420b23c88ecfa
test.cpp: In member function ‘T&& X::f()’:
test.cpp:7:39: error: cannot bind ‘T {aka int}’ lvalue to ‘T&& {aka int&&}’
         return static_cast<T &&>(value);
                                       ^

Reply via email to