Even after closing bug #49003, there remain problems regarding the handling of N3282 (resolution of DR 1207). Specifically, the problems have to do with a definition of a member function outside of the class. Consider these test cases: int& ref(int& x) { return x; } const int& ref(const int& x) { return x; } class A { int x; int f() const; auto test1() const -> decltype(this); auto test2() const -> decltype(ref(x)); auto test3() const -> decltype(f()); }; auto A::test1() const -> decltype(this) { return this; } auto A::test2() const -> decltype(ref(x)) { return ref(x); } auto A::test3() const -> decltype(f()) { return f(); } This gives the following compiler errors in the C++0x mode of gcc 4.7.1: - test1(): invalid use of 'this' at top level - test2(): prototype for 'int& A::test2() const' does not match any in class 'A' (candidate is: const int& A::test2() const); additionally, 'int A::x' is private - test3(): cannot call member function 'int A::f() const' without object; additionally, 'int A::f() const' is private In summary, in the trailing return type of a const member function definition outside of a class declaration, it seems: 1. I cannot explicitly reference 'this' 2. I can reference data members, but not private ones, and they are not const 3. I cannot invoke member functions I believe all three function definitions should compile. Similarly, inline definitions of the same member functions have no such problems: class B { int x; int f() const; auto test1() const -> decltype(this) { return this; } auto test2() const -> decltype(ref(x)) { return ref(x); } auto test3() const -> decltype(f()) { return f(); } }; It seems that issue #2 is a regression compared to gcc 4.6, which seemed to allow some access to data members. Consider test4(): template<typename X> class C { const X& x; auto test4() const -> decltype(x); }; template<typename X> auto C<X>::test4() const -> decltype(x) { return x; } This test compiles without problems under gcc 4.6.3. Whereas gcc 4.7.1 gives: prototype for 'decltype (((C<X>*)0)->C<X>::x) C<X>::test4() const' does not match any in class 'C<X>' (candidate is: decltype (((const C<X>*)this)->C<X>::x) C<X>::test4() const)
I'm wondering if we shouldn't just have a metabug for decltype and one for lambdas... looking for volunteers (Daniel? ;)
Done, see PR 54366 and PR 54367 (I probably missed some that could be added to the meta bugs)
Great. I'm adding to the decltype one 16375 too to be safe, but it's worth another look.
Author: jason Date: Sun Mar 17 02:38:21 2013 New Revision: 196740 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=196740 Log: PR c++/54359 * parser.c (cp_parser_direct_declarator): Fix late return for out-of-class defn of member function. Added: trunk/gcc/testsuite/g++.dg/cpp0x/trailing8.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/parser.c
Author: jason Date: Mon Mar 18 03:41:10 2013 New Revision: 196765 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=196765 Log: PR c++/54359 PR c++/56639 * parser.c (cp_parser_direct_declarator): Bail if we see a qualified-id not at namespace scope. Added: trunk/gcc/testsuite/g++.dg/template/arrow2.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/parser.c trunk/gcc/testsuite/g++.dg/parse/typename7.C
Fixed for 4.8.1.
Author: jason Date: Tue Mar 4 22:16:03 2014 New Revision: 208332 URL: http://gcc.gnu.org/viewcvs?rev=208332&root=gcc&view=rev Log: PR c++/60415 PR c++/54359 * parser.c (cp_parser_direct_declarator): Set declarator to cp_error_declarator on invalid qualified-id. Added: trunk/gcc/testsuite/g++.dg/parse/ambig8.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/parser.c