From patchwork Sat Jan 1 22:34:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 77165 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id AD69BB70DA for ; Sun, 2 Jan 2011 09:35:01 +1100 (EST) Received: (qmail 4341 invoked by alias); 1 Jan 2011 22:34:57 -0000 Received: (qmail 4105 invoked by uid 22791); 1 Jan 2011 22:34:54 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RFC_ABUSE_POST X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 01 Jan 2011 22:34:50 +0000 Received: by wyb40 with SMTP id 40so12788249wyb.20 for ; Sat, 01 Jan 2011 14:34:48 -0800 (PST) MIME-Version: 1.0 Received: by 10.216.163.11 with SMTP id z11mr5068892wek.36.1293921287758; Sat, 01 Jan 2011 14:34:47 -0800 (PST) Received: by 10.216.160.131 with HTTP; Sat, 1 Jan 2011 14:34:47 -0800 (PST) In-Reply-To: References: Date: Sat, 1 Jan 2011 22:34:47 +0000 Message-ID: Subject: Re: PING: [patch] fix c++/33558 - references cannot be mutable From: Jonathan Wakely To: gcc-patches Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On 22 December 2010 14:53, Jonathan Wakely wrote: > This is a very small patch to fix a standard conformance issue. > > I've made it a permerror so broken code can use -fpermissive and > doesn't need to be fixed. > > I'd really like to get this in 4.6, so pinging for review ... again > On 18 December 2010 18:57, Jonathan Wakely wrote: >> This is a slightly modified version of the patch attached to PR33558 >> which was posted to gcc-patches but apparently never reviewed.  I >> don't know if the author of the original patch, Giovanni, has a >> copyright assignment but I think the change is obvious and I hope is >> sufficiently small to not need an assignment. I was in the process of >> making the same change when I found his patch on the PR and copied the >> wording of his diagnostic and testcase. >> >> Sun CC and g++ both incorrectly accept mutable references, so it might >> not be uncommon in the wild (I found a use in some production code >> yesterday.)  This version of the patch allows mutable on reference >> members when -fpermissive is used, giving old code a transition path. >> I'll add a note to changes.html if this is approved. >> >> tested x86_64-linux, OK for trunk? >> >> >> cp/ChangeLog entry: >> >> 2010-12-18  Giovanni Funchal   >>            Jonathan Wakely   >> >>        PR c++/33558 >>        * decl.c (grokdeclarator): Reject mutable reference members. >> >> testsuite/ChangeLog entry: >> >> 2010-12-18  Giovanni Funchal   >>            Jonathan Wakely   >> >>        PR c++/33558 >>        * testsuite/g++.dg/other/pr33558.C: New. >>        * testsuite/g++.dg/other/pr33558-2.C: New. >> > Index: cp/decl.c =================================================================== --- cp/decl.c (revision 167817) +++ cp/decl.c (working copy) @@ -9210,6 +9210,12 @@ grokdeclarator (const cp_declarator *dec error ("const %qs cannot be declared %", name); storage_class = sc_none; } + else if (TREE_CODE (type) == REFERENCE_TYPE) + { + permerror (input_location, "reference %qs cannot be declared " + "%", name); + storage_class = sc_none; + } } /* If this is declaring a typedef name, return a TYPE_DECL. */ Index: testsuite/g++.dg/other/pr33558.C =================================================================== --- testsuite/g++.dg/other/pr33558.C (revision 0) +++ testsuite/g++.dg/other/pr33558.C (revision 0) @@ -0,0 +1,5 @@ +/* { dg-do compile } */ + +class X { + mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */ +}; Index: testsuite/g++.dg/other/pr33558-2.C =================================================================== --- testsuite/g++.dg/other/pr33558-2.C (revision 0) +++ testsuite/g++.dg/other/pr33558-2.C (revision 0) @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-fpermissive" } */ + +class X { + mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */ +};