From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20171 invoked by alias); 1 Dec 2013 13:40:35 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 20140 invoked by uid 48); 1 Dec 2013 13:40:31 -0000 From: "d.frey at gmx dot de" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/57543] decltype needs explicit 'this' pointer in member function declaration of template class with trailing return type Date: Sun, 01 Dec 2013 13:40:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 4.8.1 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: d.frey at gmx dot de X-Bugzilla-Status: NEW X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2013-12/txt/msg00012.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57543 Daniel Frey changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |d.frey at gmx dot de --- Comment #2 from Daniel Frey --- Here's another short example which seems to expose the same bug: template< typename > struct X { void foo() {} auto bar() -> decltype( X::foo() ) //1 { return foo(); } }; int main() { X().bar(); } Note that the decltype in //1 causes the problem, not the body of the function. Changing //1 to decltype(foo()) fails with the same error message, changing it to either decltype(this->foo()) or decltype(std::declval().foo()) solves the problem and GCC accepts the code. Also note that Clang compiles all versions just fine. The bug seems to occur in unevaluated contexts and only for templates. If you change the above class X to be a non-template GCC accepts the code as well.