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



             Bug #: 54975

           Summary: [C++11] cv-qualifiers of typedef-name are ignored in

                    lambda expression

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: ai.az...@gmail.com





Created attachment 28485

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28485

Output of -v option and preprocessed file with GCC 4.8.0 20121014



The following valid code reproduces the problem;



/////////////////////////////

template<typename T>

struct identity

{

  typedef T type;

};



template<typename T>

void f()

{

  typedef typename T::type A;

  int i = 42;

  int const &cri = i;

  int volatile &vri = i;

  [&]() {

    A const &x = cri;    // Problem here

    A volatile &y = vri; // Likewise

  };

}



int main()

{

  f<identity<int> >();

}

/////////////////////////////



In the lambda-expression, initilizations of cv-qualified references are

obviously legal. However, GCC 4.8.0 20121014 complains as follows;



main.cpp: In instantiation of 'f() [with T = identity<int>]::__lambda0':

main.cpp:16:21:   required from 'struct f() [with T =

identity<int>]::__lambda0'

main.cpp:14:3:   required from 'void f() [with T = identity<int>]'

main.cpp:22:21:   required from here

main.cpp:15:18: error: invalid initialization of reference of type

'identity<int>::type& {aka int&}' from expression of type 'const int'

     A const &x = cri;

                  ^

main.cpp:16:21: error: invalid initialization of reference of type

'identity<int>::type& {aka int&}' from expression of type 'volatile int'

     A volatile &y = vri;

                     ^



The error messages look as if there were no cv-qualifiers in the declarators.



Note that GCC 4.7.3 20121013 also fails to compile, but GCC 4.6.4 20121012

compiles successfully.

Reply via email to