From patchwork Mon Jun 17 00:51:29 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 251755 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]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 0E8962C00B1 for ; Mon, 17 Jun 2013 10:51:48 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; q=dns; s=default; b=uny1WGJKtovbnfUfsJFqUPgjT+7mPg4kLRtb9t5VHp7 +224YqhzmHTIOIruS4v4rU3mHmXHf3n4iHcoemGFg4dSZzactZIlqc4inRVI1lMJ 1XvNvo27GLmCxBkxBibBG9prTIkjCBr6+muVH/WZEqGdwwIX3Yn9N7SBeHFMUBL8 = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; s=default; bh=OvNiQViHq21W0HGi+GXQWVmBBQE=; b=HBiC/mFf2k//eLISF 66xh4B2uRn/Y3j0L1Xo/q9kDWwWGYAJlHPWFmEeMH5cBs+YN5ZWp8pK1TBRQN4tI yCXUY+tLfIlvr4lFjh+T24Ri/JiZMObRqNJTlbJJHliN6Qbqi1lUJ5jJuSl3lwfS fVF6e4QypufZIW3I8YTgcC6mVk= Received: (qmail 22519 invoked by alias); 17 Jun 2013 00:51:42 -0000 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 Received: (qmail 20533 invoked by uid 89); 17 Jun 2013 00:51:38 -0000 X-Spam-SWARE-Status: No, score=-5.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_HOSTKARMA_NO, RCVD_IN_HOSTKARMA_YE, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 17 Jun 2013 00:51:35 +0000 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r5H0pUt4001832 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Jun 2013 00:51:31 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r5H0pWQx008193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 17 Jun 2013 00:51:33 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r5H0pWoc025613; Mon, 17 Jun 2013 00:51:32 GMT Received: from poldo4.casa (/79.36.30.68) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 16 Jun 2013 17:51:31 -0700 Message-ID: <51BE5D91.1040507@oracle.com> Date: Mon, 17 Jun 2013 02:51:29 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130510 Thunderbird/17.0.6 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: Jason Merrill Subject: [C++ Patch] PR 16128 X-Virus-Found: No Hi, this is another bug essentially already fixed. However, in the audit trail Giovanni Bajo noticed that for the local declarations case we also emit those annoying: 16128.C:16:7: error: expected ‘;’ before ‘a’ and likewise for 'b'. By checking the return value of cp_parser_expression at the beginning of cp_parser_expression_statement we can avoid those and many more in existing testcases (see patch). Tested x86_64-linux. Thanks, Paolo. //////////////////////// /cp 2013-06-18 Paolo Carlini PR c++/16128 * parser.c (cp_parser_expression_statement): Check whether cp_parser_expression returns error_mark_node. /testsuite 2013-06-18 Paolo Carlini PR c++/16128 * g++.dg/template/error52.C: New. * g++.dg/lookup/friend15.C: Update. * g++.dg/parse/error11.C: Likewise. * g++.dg/parse/error14.C: Likewise. * g++.dg/parse/parser-pr28152-2.C: Likewise. * g++.dg/parse/template25.C: Likewise. * g++.old-deja/g++.jason/cond.C: Likewise. * g++.old-deja/g++.mike/for2.C: Likewise. * g++.old-deja/g++.robertl/eb125.C: Likewise. Index: cp/parser.c =================================================================== --- cp/parser.c (revision 200134) +++ cp/parser.c (working copy) @@ -9264,7 +9264,15 @@ cp_parser_expression_statement (cp_parser* parser, /* If the next token is a ';', then there is no expression statement. */ if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) - statement = cp_parser_expression (parser, /*cast_p=*/false, NULL); + { + statement = cp_parser_expression (parser, /*cast_p=*/false, NULL); + if (statement == error_mark_node + && !cp_parser_uncommitted_to_tentative_parse_p (parser)) + { + cp_parser_skip_to_end_of_block_or_statement (parser); + return error_mark_node; + } + } /* Give a helpful message for "A::type t;" and the like. */ if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON) Index: testsuite/g++.dg/lookup/friend15.C =================================================================== --- testsuite/g++.dg/lookup/friend15.C (revision 200141) +++ testsuite/g++.dg/lookup/friend15.C (working copy) @@ -8,5 +8,4 @@ void foo() friend class B; }; B::B() {} // { dg-error "has not been declared" } -// { dg-error "expected" "expected" { target *-*-* } 10 } } Index: testsuite/g++.dg/parse/error11.C =================================================================== --- testsuite/g++.dg/parse/error11.C (revision 200131) +++ testsuite/g++.dg/parse/error11.C (working copy) @@ -53,18 +53,16 @@ void func(void) // { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } } // { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 } // { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 } -// { dg-error "9:expected ';' before ':' token" "semicolon" { target *-*-* } 51 } // { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 } // { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 } // { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 } -// { dg-error "7:expected ';' before ':' token" "semicolon" { target *-*-* } 52 } // int Foo[2]; Foo[::value] = 0; } template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" { target c++98 } } -// { dg-message "20:is an alternate" "alt" { target c++98 } 66 } +// { dg-message "20:is an alternate" "alt" { target c++98 } 64 } // On the first error message, an additional note about the use of // -fpermissive should be present Index: testsuite/g++.dg/parse/error14.C =================================================================== --- testsuite/g++.dg/parse/error14.C (revision 200131) +++ testsuite/g++.dg/parse/error14.C (working copy) @@ -22,5 +22,3 @@ struct X }; // { dg-error "2:expected '.' at end of input" "at end of input" } // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 } // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 } - // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 } - Index: testsuite/g++.dg/parse/parser-pr28152-2.C =================================================================== --- testsuite/g++.dg/parse/parser-pr28152-2.C (revision 200131) +++ testsuite/g++.dg/parse/parser-pr28152-2.C (working copy) @@ -7,7 +7,5 @@ main (void) __complex__ float z; z = __complex__ (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '__complex__'" "primary-expression" } - // { dg-error "expected .;. before .__complex__." "semicolon" { target *-*-* } 9 } z = __complex__ (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '__complex__'" "primaty-expression" } - // { dg-error "expected .;. before '__complex__'" "semicolon" { target *-*-* } 11 } - // { dg-error "at end of input" "end" { target *-*-* } 11 } + // { dg-error "at end of input" "end" { target *-*-* } 10 } Index: testsuite/g++.dg/parse/parser-pr28152.C =================================================================== --- testsuite/g++.dg/parse/parser-pr28152.C (revision 200131) +++ testsuite/g++.dg/parse/parser-pr28152.C (working copy) @@ -7,7 +7,5 @@ main (void) _Complex float z; z = _Complex (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } - // { dg-error "expected .;. before ._Complex." "semicolon" { target *-*-* } 9 } z = _Complex (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } - // { dg-error "expected .;. before '_Complex'" "semicolon" { target *-*-* } 11 } - // { dg-error "at end of input" "end" { target *-*-* } 11 } + // { dg-error "at end of input" "end" { target *-*-* } 10 } Index: testsuite/g++.dg/parse/template25.C =================================================================== --- testsuite/g++.dg/parse/template25.C (revision 200131) +++ testsuite/g++.dg/parse/template25.C (working copy) @@ -10,5 +10,4 @@ void f(void) void g(void) { template f(); /* { dg-error "expected primary-expression" "primary-expression" } */ - /* { dg-error "expected ';'" "semicolon" { target *-*-* } 12 } */ } Index: testsuite/g++.dg/template/error52.C =================================================================== --- testsuite/g++.dg/template/error52.C (revision 0) +++ testsuite/g++.dg/template/error52.C (working copy) @@ -0,0 +1,19 @@ +// PR c++/16128 + +template +struct A { + }; + +namespace H { + template + struct B {}; + } + +A a; // { dg-error "template" } +H::B b; // { dg-error "template" } + +int main() { + A a; // { dg-error "template" } + H::B b; // { dg-error "template" } + return 0; + } Index: testsuite/g++.old-deja/g++.jason/cond.C =================================================================== --- testsuite/g++.old-deja/g++.jason/cond.C (revision 200131) +++ testsuite/g++.old-deja/g++.jason/cond.C (working copy) @@ -37,10 +37,9 @@ int main() ; A bar; // { dg-error "not declared" "decl" } - // { dg-error "expected" "exp" { target *-*-* } 39 } if (enum A { one, two, three } foo = one) // { dg-error "defined" "def" } - // { dg-error "not declared" "expected" { target *-*-* } 42 } + // { dg-error "not declared" "expected" { target *-*-* } 41 } ; struct B { operator int () { return 2; } }; @@ -49,7 +48,7 @@ int main() ; if (int f () = 1) // { dg-warning "extern" "extern" } - // { dg-error "is initialized like a variable" "var" { target *-*-* } 51 } + // { dg-error "is initialized like a variable" "var" { target *-*-* } 50 } ; if (int a[2] = {1, 2}) // { dg-error "extended init" "" { target c++98 } } Index: testsuite/g++.old-deja/g++.mike/for2.C =================================================================== --- testsuite/g++.old-deja/g++.mike/for2.C (revision 200131) +++ testsuite/g++.old-deja/g++.mike/for2.C (working copy) @@ -4,19 +4,17 @@ void foo() { for (class C {};;) ; C c; // { dg-error "declared" "decl" } - // { dg-error "expected" "exp" { target *-*-* } 6 } } void bar() { for (enum E {num};;) ; E e; // { dg-error "declared" "decl" } - // { dg-error "expected" "exp" { target *-*-* } 13 } } void bee () { int i = 0; for (int fun() = 0; i != 2; ++i) { // { dg-warning "extern" "extern" } - // { dg-error "initialized" "init" { target *-*-* } 19 } + // { dg-error "initialized" "init" { target *-*-* } 17 } } } Index: testsuite/g++.old-deja/g++.robertl/eb125.C =================================================================== --- testsuite/g++.old-deja/g++.robertl/eb125.C (revision 200131) +++ testsuite/g++.old-deja/g++.robertl/eb125.C (working copy) @@ -16,7 +16,7 @@ class test_square template void test(BOX *the_box) {x // { dg-error "not declared in this scope" } - the_box->print(); // { dg-error "before" } + the_box->print(); } template void test<> (test_box *);