From patchwork Mon May 7 23:02:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 909974 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-477326-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=acm.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="K9fhOzwY"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40fyng0tShz9s4Z for ; Tue, 8 May 2018 09:02:46 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=BXy98igtp6iCnmCnUX8gTvvn+KkqdOJ81D/TOPUwza+q0fmKk8 8Tm3K5JdC6EMmx37F6wqlc0LDMz+OiyeIeYmTpU6TA/GMmXkw5P/6ka5lAZ4eDle aXh0dtcof0uexDVhjRSoCfu/QVjh3MNVHW/i5fvnnqqyFJ5GwETKj+DWw= 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:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=LXE3GTaatiaCcRUqQjvuh4p5AUM=; b=K9fhOzwY9Y7jE37/OeL8 BIdlEL05gqlBL8w9NsPiIlZb8l7YpyGSYxF9mqlfuB3KBlJSMz5eyi2U8JoPQrwC Dee1r4OZy/R5yj8wzmwpNaBIBtFnzMXciXXipmsdwELhTY/OmrfL0AIfnO9+pGq7 hmW6KrgYnJt20zpEux6vIOE= Received: (qmail 111708 invoked by alias); 7 May 2018 23:02:38 -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 111691 invoked by uid 89); 7 May 2018 23:02:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-16.1 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=Non, succeed, transparent, ob X-HELO: mail-pg0-f54.google.com Received: from mail-pg0-f54.google.com (HELO mail-pg0-f54.google.com) (74.125.83.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 07 May 2018 23:02:33 +0000 Received: by mail-pg0-f54.google.com with SMTP id i29-v6so20281274pgn.12 for ; Mon, 07 May 2018 16:02:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:to:from:subject:message-id:date :user-agent:mime-version:content-language; bh=TpkoADFeuFUc2zUUkLChPRo/e19sQvE9EIuZmPXD6tg=; b=PrLZ/3v9k+SCBI+o62sx8MK5AcRVKI47voyrEQGeL8g8vGW7pEwsopHXCRu8+lhUgN 01aQbm8Dz9c7XBD8PdWyy8Gz5iPVWxZcTleLFbV5UkmxmZlP0/Y3r3bEW1WxxfdcWuQj r+NRe/qDRWwKGxjqwAS5/m+DBY2hVTAcbS+v5tvDmJJhSxrEGrwXwY6vqBVLoz3orMRv gi+60W+nTgGqgA2WnoLvOrOfI2AebVck/kmozqn9ilewUEGEQKY0O9ceVs4FrgTfJkik Mziu5brYI3gKDV0GmQpvMWb+YYXXZirUrMhOIFa0mZ5U8c7rzNs+ORofy28yFT/hSDK8 nhBA== X-Gm-Message-State: ALQs6tBvq7L2/41vsHQSC1BArxp/bzF785zCj0vqkVg+eVntzgPwHq8C /HBD3U+gfxzmsmmVNjBGKqw= X-Google-Smtp-Source: AB8JxZoGWPL3iBv2UjrQKcSzP4f0RFmv8Ki1DW6t/yszg0QY8CbjCjomBjAESFfzkk4V5QyPfNZR6A== X-Received: by 2002:a63:2f41:: with SMTP id v62-v6mr13733169pgv.33.1525734152021; Mon, 07 May 2018 16:02:32 -0700 (PDT) Received: from ?IPv6:2620:10d:c082:1055:31e1:4d57:79ff:da5a? ([2620:10d:c090:200::6:eb73]) by smtp.googlemail.com with ESMTPSA id a4sm32506822pfj.19.2018.05.07.16.02.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 May 2018 16:02:31 -0700 (PDT) To: GCC Patches From: Nathan Sidwell Subject: [C++ PATCH] Kill -fno-for-scope Message-ID: <272df7fa-2609-ce4c-165b-2991a3b1bd54@acm.org> Date: Mon, 7 May 2018 16:02:29 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 As prophesied by gcc 8.1, I have nuked the ARM-era for-scope compatibilty of -fno-for-scope. It has been a c++98-only feature, and that's not the default anymore. Time for this to go. nathan 2018-05-07 Nathan Sidwell gcc/cp/ Remove fno-for-scope * cp-tree.h (DECL_ERROR_REPORTED, DECL_DEAD_FOR_LOCAL) (DECL_HAS_SHADOWED_FOR_VAR_P, DECL_SHADOWED_FOR_VAR) (SET_DECL_SHADOWED_FOR_VAR): Delete. (decl_shadowed_for_var_lookup, decl_shadowed_for_var_insert) (check_for_out_of_scope_variable, init_shadowed_var_for_decl): Don't declare. * name-lookup.h (struct cp_binding_level): Remove dead_vars_from_for field. * cp-lang.c (cp_init_ts): Delete. (LANG_HOOKS_INIT_TS): Override to cp_common_init_ts. * cp-objcp-common.c (shadowed_var_for_decl): Delete. (decl_shadowed_for_var_lookup, decl_shadowed_for_var_insert) (init_shadowed_var_for_decl): Delete. * decl.c (poplevel): Remove shadowed for var handling. (cxx_init_decl_processing): Remove -ffor-scope deprecation. * name-lookup.c (find_local_binding): Remove shadowed for var handling. (check_local_shadow): Likewise. (check_for_out_of_scope_variable): Delete. * parser.c (cp_parser_primary_expression): Remove shadowed for var handling. * pt.c (tsubst_decl): Remove DECL_DEAD_FOR_LOCAL setting. * semantics.c (begin_for_scope): Always have a scope. (begin_for_stmt, finish_for_stmt): Remove ARM-for scope handling. (begin_range_for_stmt, finish_id_expression): Likewise. gcc/ * doc/invoke.texi (C++ Dialect Options): Remove -ffor-scope. * doc/extend.texi (Deprecated Features): Remove -fno-for-scope (Backwards Compatibility): Likewise. c-family/ * c.opt (ffor-scope): Remove functionality, issue warning. gcc/objcp/ * objcp-lang.c (objcxx_init_ts): Don't call init_shadowed_var_for_decl. gcc/testsuite/ * g++.dg/cpp0x/range-for10.C: Delete. * g++.dg/ext/forscope1.C: Delete. * g++.dg/ext/forscope2.C: Delete. * g++.dg/template/for1.C: Delete. Index: gcc/c-family/c.opt =================================================================== --- gcc/c-family/c.opt (revision 260014) +++ gcc/c-family/c.opt (working copy) @@ -1441,8 +1441,7 @@ fexternal-templates C++ ObjC++ Ignore Warn(switch %qs is no longer supported) ffor-scope -C++ ObjC++ Var(flag_new_for_scope) Init(1) -Scope of for-init-statement variables is local to the loop. +C++ ObjC++ Ignore Warn(switch %qs is no longer supported) ffreestanding C ObjC C++ ObjC++ Index: gcc/cp/cp-lang.c =================================================================== --- gcc/cp/cp-lang.c (revision 260014) +++ gcc/cp/cp-lang.c (working copy) @@ -28,7 +28,6 @@ along with GCC; see the file COPYING3. #include "cp-objcp-common.h" enum c_language_kind c_language = clk_cxx; -static void cp_init_ts (void); static const char * cxx_dwarf_name (tree t, int verbosity); static enum classify_record cp_classify_record (tree type); static tree cp_eh_personality (void); @@ -71,7 +70,7 @@ static tree cxx_enum_underlying_base_typ #undef LANG_HOOKS_DWARF_NAME #define LANG_HOOKS_DWARF_NAME cxx_dwarf_name #undef LANG_HOOKS_INIT_TS -#define LANG_HOOKS_INIT_TS cp_init_ts +#define LANG_HOOKS_INIT_TS cp_common_init_ts #undef LANG_HOOKS_EH_PERSONALITY #define LANG_HOOKS_EH_PERSONALITY cp_eh_personality #undef LANG_HOOKS_EH_RUNTIME_TYPE @@ -102,14 +101,6 @@ objcp_tsubst_copy_and_build (tree /*t*/, return NULL_TREE; } -static void -cp_init_ts (void) -{ - cp_common_init_ts (); - - init_shadowed_var_for_decl (); -} - static const char * cxx_dwarf_name (tree t, int verbosity) { Index: gcc/cp/cp-objcp-common.c =================================================================== --- gcc/cp/cp-objcp-common.c (revision 260014) +++ gcc/cp/cp-objcp-common.c (working copy) @@ -298,43 +298,6 @@ has_c_linkage (const_tree decl) return DECL_EXTERN_C_P (decl); } -static GTY ((cache)) - hash_table *shadowed_var_for_decl; - -/* Lookup a shadowed var for FROM, and return it if we find one. */ - -tree -decl_shadowed_for_var_lookup (tree from) -{ - struct tree_decl_map *h, in; - in.base.from = from; - - h = shadowed_var_for_decl->find_with_hash (&in, DECL_UID (from)); - if (h) - return h->to; - return NULL_TREE; -} - -/* Insert a mapping FROM->TO in the shadowed var hashtable. */ - -void -decl_shadowed_for_var_insert (tree from, tree to) -{ - struct tree_decl_map *h; - - h = ggc_alloc (); - h->base.from = from; - h->to = to; - *shadowed_var_for_decl->find_slot_with_hash (h, DECL_UID (from), INSERT) = h; -} - -void -init_shadowed_var_for_decl (void) -{ - shadowed_var_for_decl - = hash_table::create_ggc (512); -} - /* Return true if stmt can fall through. Used by block_may_fallthru default case. */ Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 260014) +++ gcc/cp/cp-tree.h (working copy) @@ -447,8 +447,7 @@ extern GTY(()) tree cp_global_trees[CPTI 6: TYPE_DEPENDENT_P_VALID Usage of DECL_LANG_FLAG_?: - 0: DECL_ERROR_REPORTED (in VAR_DECL). - DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) + 0: DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL) DECL_MUTABLE_P (in FIELD_DECL) DECL_DEPENDENT_P (in USING_DECL) @@ -475,8 +474,7 @@ extern GTY(()) tree cp_global_trees[CPTI 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL). DECL_FIELD_IS_BASE (in FIELD_DECL) TYPE_DECL_ALIAS_P (in TYPE_DECL) - 7: DECL_DEAD_FOR_LOCAL (in VAR_DECL). - DECL_THUNK_P (in a member FUNCTION_DECL) + 7: DECL_THUNK_P (in a member FUNCTION_DECL) DECL_NORMAL_CAPTURE_P (in FIELD_DECL) 8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL) @@ -3212,9 +3210,6 @@ struct GTY(()) lang_decl { was inherited from a template parameter, not explicitly indicated. */ #define ABI_TAG_IMPLICIT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE)) -extern tree decl_shadowed_for_var_lookup (tree); -extern void decl_shadowed_for_var_insert (tree, tree); - /* Non zero if this is a using decl for a dependent scope. */ #define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE)) @@ -3227,19 +3222,6 @@ extern void decl_shadowed_for_var_insert /* Non zero if the using decl refers to a dependent type. */ #define USING_DECL_TYPENAME_P(NODE) DECL_LANG_FLAG_1 (USING_DECL_CHECK (NODE)) -/* In a VAR_DECL, true if we have a shadowed local variable - in the shadowed var table for this VAR_DECL. */ -#define DECL_HAS_SHADOWED_FOR_VAR_P(NODE) \ - (VAR_DECL_CHECK (NODE)->decl_with_vis.shadowed_for_var_p) - -/* In a VAR_DECL for a variable declared in a for statement, - this is the shadowed (local) variable. */ -#define DECL_SHADOWED_FOR_VAR(NODE) \ - (DECL_HAS_SHADOWED_FOR_VAR_P(NODE) ? decl_shadowed_for_var_lookup (NODE) : NULL) - -#define SET_DECL_SHADOWED_FOR_VAR(NODE, VAL) \ - (decl_shadowed_for_var_insert (NODE, VAL)) - /* In a FUNCTION_DECL, this is nonzero if this function was defined in the class definition. We have saved away the text of the function, but have not yet processed it. */ @@ -3844,14 +3826,6 @@ more_aggr_init_expr_args_p (const aggr_i #define TYPE_CONTAINS_VPTR_P(NODE) \ (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE)) -/* This flag is true of a local VAR_DECL if it was declared in a for - statement, but we are no longer in the scope of the for. */ -#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE)) - -/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL - if we already emitted a warning about using it. */ -#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)) - /* Nonzero if NODE is a FUNCTION_DECL (for a function with global scope) declared in a local scope. */ #define DECL_LOCAL_FUNCTION_P(NODE) \ @@ -6232,7 +6206,6 @@ extern tree strip_fnptr_conv (tree); /* in name-lookup.c */ extern void maybe_push_cleanup_level (tree); extern tree make_anon_name (void); -extern tree check_for_out_of_scope_variable (tree); extern tree maybe_push_decl (tree); extern tree current_decl_namespace (void); @@ -7403,7 +7376,6 @@ extern size_t cp_tree_size (enum tree_ extern bool cp_var_mod_type_p (tree, tree); extern void cxx_initialize_diagnostics (diagnostic_context *); extern int cxx_types_compatible_p (tree, tree); -extern void init_shadowed_var_for_decl (void); extern bool cxx_block_may_fallthru (const_tree); /* in cp-gimplify.c */ Index: gcc/cp/decl.c =================================================================== --- gcc/cp/decl.c (revision 260014) +++ gcc/cp/decl.c (working copy) @@ -576,9 +576,7 @@ poplevel (int keep, int reverse, int fun tree subblocks; tree block; tree decl; - int leaving_for_scope; scope_kind kind; - unsigned ix; bool subtime = timevar_cond_start (TV_NAME_LOOKUP); restart: @@ -639,12 +637,6 @@ poplevel (int keep, int reverse, int fun for (link = subblocks; link; link = BLOCK_CHAIN (link)) BLOCK_SUPERCONTEXT (link) = block; - /* We still support the old for-scope rules, whereby the variables - in a init statement were in scope after the for-statement ended. - We only use the new rules if flag_new_for_scope is nonzero. */ - leaving_for_scope - = current_binding_level->kind == sk_for && flag_new_for_scope; - /* Before we remove the declarations first check for unused variables. */ if ((warn_unused_variable || warn_unused_but_set_variable) && current_binding_level->kind != sk_template_parms @@ -704,71 +696,6 @@ poplevel (int keep, int reverse, int fun decl = TREE_CODE (link) == TREE_LIST ? TREE_VALUE (link) : link; tree name = OVL_NAME (decl); - if (leaving_for_scope && VAR_P (decl) - /* It's hard to make this ARM compatibility hack play nicely with - lambdas, and it really isn't necessary in C++11 mode. */ - && cxx_dialect < cxx11 - && name) - { - cxx_binding *ob = outer_binding (name, - IDENTIFIER_BINDING (name), - /*class_p=*/true); - tree ns_binding = NULL_TREE; - if (!ob) - ns_binding = get_namespace_binding (current_namespace, name); - - if (ob && ob->scope == current_binding_level->level_chain) - /* We have something like: - - int i; - for (int i; ;); - - and we are leaving the `for' scope. There's no reason to - keep the binding of the inner `i' in this case. */ - ; - else if ((ob && (TREE_CODE (ob->value) == TYPE_DECL)) - || (ns_binding && TREE_CODE (ns_binding) == TYPE_DECL)) - /* Here, we have something like: - - typedef int I; - - void f () { - for (int I; ;); - } - - We must pop the for-scope binding so we know what's a - type and what isn't. */ - ; - else - { - /* Mark this VAR_DECL as dead so that we can tell we left it - there only for backward compatibility. */ - DECL_DEAD_FOR_LOCAL (link) = 1; - - /* Keep track of what should have happened when we - popped the binding. */ - if (ob && ob->value) - { - SET_DECL_SHADOWED_FOR_VAR (link, ob->value); - DECL_HAS_SHADOWED_FOR_VAR_P (link) = 1; - } - - /* Add it to the list of dead variables in the next - outermost binding to that we can remove these when we - leave that binding. */ - vec_safe_push ( - current_binding_level->level_chain->dead_vars_from_for, - link); - - /* Although we don't pop the cxx_binding, we do clear - its SCOPE since the scope is going away now. */ - IDENTIFIER_BINDING (name)->scope - = current_binding_level->level_chain; - - /* Don't remove the binding. */ - name = NULL_TREE; - } - } /* Remove the binding. */ if (TREE_CODE (decl) == LABEL_DECL) pop_local_label (name, decl); @@ -776,12 +703,6 @@ poplevel (int keep, int reverse, int fun pop_local_binding (name, decl); } - /* Remove declarations for any `for' variables from inner scopes - that we kept around. */ - FOR_EACH_VEC_SAFE_ELT_REVERSE (current_binding_level->dead_vars_from_for, - ix, decl) - pop_local_binding (DECL_NAME (decl), decl); - /* Restore the IDENTIFIER_TYPE_VALUEs. */ for (link = current_binding_level->type_shadowed; link; link = TREE_CHAIN (link)) @@ -4170,11 +4091,6 @@ cxx_init_decl_processing (void) pop_namespace (); flag_noexcept_type = (cxx_dialect >= cxx17); - /* There's no fixed location for , the current - location is , which is somewhat confusing. */ - if (!flag_new_for_scope) - warning_at (UNKNOWN_LOCATION, OPT_Wdeprecated, - "%<-fno-for-scope%> is deprecated"); c_common_nodes_and_builtins (); Index: gcc/cp/name-lookup.c =================================================================== --- gcc/cp/name-lookup.c (revision 260014) +++ gcc/cp/name-lookup.c (working copy) @@ -144,9 +144,7 @@ find_local_binding (cp_binding_level *b, if (cxx_binding *binding = IDENTIFIER_BINDING (name)) for (;; b = b->level_chain) { - if (binding->scope == b - && !(VAR_P (binding->value) - && DECL_DEAD_FOR_LOCAL (binding->value))) + if (binding->scope == b) return binding; /* Cleanup contours are transparent to the language. */ @@ -2632,8 +2630,6 @@ check_local_shadow (tree decl) old = binding->value; old_scope = binding->scope; } - while (old && VAR_P (old) && DECL_DEAD_FOR_LOCAL (old)) - old = DECL_SHADOWED_FOR_VAR (old); tree shadowed = NULL_TREE; if (old @@ -3213,84 +3209,6 @@ push_local_binding (tree id, tree decl, add_decl_to_level (b, decl); } -/* Check to see whether or not DECL is a variable that would have been - in scope under the ARM, but is not in scope under the ANSI/ISO - standard. If so, issue an error message. If name lookup would - work in both cases, but return a different result, this function - returns the result of ANSI/ISO lookup. Otherwise, it returns - DECL. - - FIXME: Scheduled for removal after GCC-8 is done. */ - -tree -check_for_out_of_scope_variable (tree decl) -{ - tree shadowed; - - /* We only care about out of scope variables. */ - if (!(VAR_P (decl) && DECL_DEAD_FOR_LOCAL (decl))) - return decl; - - shadowed = DECL_HAS_SHADOWED_FOR_VAR_P (decl) - ? DECL_SHADOWED_FOR_VAR (decl) : NULL_TREE ; - while (shadowed != NULL_TREE && VAR_P (shadowed) - && DECL_DEAD_FOR_LOCAL (shadowed)) - shadowed = DECL_HAS_SHADOWED_FOR_VAR_P (shadowed) - ? DECL_SHADOWED_FOR_VAR (shadowed) : NULL_TREE; - if (!shadowed) - shadowed = find_namespace_value (current_namespace, DECL_NAME (decl)); - if (shadowed) - { - if (!DECL_ERROR_REPORTED (decl) - && flag_permissive - && warning (0, "name lookup of %qD changed", DECL_NAME (decl))) - { - inform (DECL_SOURCE_LOCATION (shadowed), - "matches this %qD under ISO standard rules", shadowed); - inform (DECL_SOURCE_LOCATION (decl), - " matches this %qD under old rules", decl); - } - DECL_ERROR_REPORTED (decl) = 1; - return shadowed; - } - - /* If we have already complained about this declaration, there's no - need to do it again. */ - if (DECL_ERROR_REPORTED (decl)) - return decl; - - DECL_ERROR_REPORTED (decl) = 1; - - if (TREE_TYPE (decl) == error_mark_node) - return decl; - - if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) - { - error ("name lookup of %qD changed for ISO % scoping", - DECL_NAME (decl)); - inform (DECL_SOURCE_LOCATION (decl), - "cannot use obsolete binding %qD because it has a destructor", - decl); - return error_mark_node; - } - else - { - permerror (input_location, - "name lookup of %qD changed for ISO % scoping", - DECL_NAME (decl)); - if (flag_permissive) - inform (DECL_SOURCE_LOCATION (decl), - "using obsolete binding %qD", decl); - static bool hint; - if (!hint) - inform (input_location, flag_permissive - ? "this flexibility is deprecated and will be removed" - : "if you use %<-fpermissive%> G++ will accept your code"); - hint = true; - } - - return decl; -} /* true means unconditionally make a BLOCK for the next level pushed. */ Index: gcc/cp/name-lookup.h =================================================================== --- gcc/cp/name-lookup.h (revision 260014) +++ gcc/cp/name-lookup.h (working copy) @@ -205,11 +205,6 @@ struct GTY(()) cp_binding_level { /* The binding level which this one is contained in (inherits from). */ cp_binding_level *level_chain; - /* List of VAR_DECLS saved from a previous for statement. - These would be dead in ISO-conforming code, but might - be referenced in ARM-era code. */ - vec *dead_vars_from_for; - /* STATEMENT_LIST for statements in this binding contour. Only used at present for SK_CLEANUP temporary bindings. */ tree statement_list; Index: gcc/cp/parser.c =================================================================== --- gcc/cp/parser.c (revision 260014) +++ gcc/cp/parser.c (working copy) @@ -5585,27 +5585,10 @@ cp_parser_primary_expression (cp_parser if (parser->local_variables_forbidden_p && local_variable_p (decl)) { - /* It might be that we only found DECL because we are - trying to be generous with pre-ISO scoping rules. - For example, consider: - - int i; - void g() { - for (int i = 0; i < 10; ++i) {} - extern void f(int j = i); - } - - Here, name look up will originally find the out - of scope `i'. We need to issue a warning message, - but then use the global `i'. */ - decl = check_for_out_of_scope_variable (decl); - if (local_variable_p (decl)) - { - error_at (id_expr_token->location, - "local variable %qD may not appear in this context", - decl.get_value ()); - return error_mark_node; - } + error_at (id_expr_token->location, + "local variable %qD may not appear in this context", + decl.get_value ()); + return error_mark_node; } } Index: gcc/cp/pt.c =================================================================== --- gcc/cp/pt.c (revision 260014) +++ gcc/cp/pt.c (working copy) @@ -13683,9 +13683,6 @@ tsubst_decl (tree t, tree args, tsubst_f } if (VAR_P (r)) { - /* Even if the original location is out of scope, the - newly substituted one is not. */ - DECL_DEAD_FOR_LOCAL (r) = 0; DECL_INITIALIZED_P (r) = 0; DECL_TEMPLATE_INSTANTIATED (r) = 0; if (type == error_mark_node) Index: gcc/cp/semantics.c =================================================================== --- gcc/cp/semantics.c (revision 260014) +++ gcc/cp/semantics.c (working copy) @@ -934,9 +934,7 @@ finish_return_stmt (tree expr) tree begin_for_scope (tree *init) { - tree scope = NULL_TREE; - if (flag_new_for_scope) - scope = do_pushlevel (sk_for); + tree scope = do_pushlevel (sk_for); if (processing_template_decl) *init = push_stmt_list (); @@ -960,10 +958,10 @@ begin_for_stmt (tree scope, tree init) if (scope == NULL_TREE) { - gcc_assert (!init || !flag_new_for_scope); - if (!init) - scope = begin_for_scope (&init); + gcc_assert (!init); + scope = begin_for_scope (&init); } + FOR_INIT_STMT (r) = init; FOR_SCOPE (r) = scope; @@ -1057,16 +1055,12 @@ finish_for_stmt (tree for_stmt) FOR_BODY (for_stmt) = do_poplevel (FOR_BODY (for_stmt)); /* Pop the scope for the body of the loop. */ - if (flag_new_for_scope) - { - tree scope; - tree *scope_ptr = (TREE_CODE (for_stmt) == RANGE_FOR_STMT - ? &RANGE_FOR_SCOPE (for_stmt) - : &FOR_SCOPE (for_stmt)); - scope = *scope_ptr; - *scope_ptr = NULL; - add_stmt (do_poplevel (scope)); - } + tree *scope_ptr = (TREE_CODE (for_stmt) == RANGE_FOR_STMT + ? &RANGE_FOR_SCOPE (for_stmt) + : &FOR_SCOPE (for_stmt)); + tree scope = *scope_ptr; + *scope_ptr = NULL; + add_stmt (do_poplevel (scope)); } /* Begin a range-for-statement. Returns a new RANGE_FOR_STMT. @@ -1077,18 +1071,15 @@ finish_for_stmt (tree for_stmt) tree begin_range_for_stmt (tree scope, tree init) { - tree r; - begin_maybe_infinite_loop (boolean_false_node); - r = build_stmt (input_location, RANGE_FOR_STMT, - NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE); + tree r = build_stmt (input_location, RANGE_FOR_STMT, + NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE); if (scope == NULL_TREE) { - gcc_assert (!init || !flag_new_for_scope); - if (!init) - scope = begin_for_scope (&init); + gcc_assert (!init); + scope = begin_for_scope (&init); } /* RANGE_FOR_STMTs do not use nor save the init tree, so we @@ -3560,11 +3551,6 @@ finish_id_expression (tree id_expression else decl = id_expression; } - /* If DECL is a variable that would be out of scope under - ANSI/ISO rules, but in scope in the ARM, name lookup - will succeed. Issue a diagnostic here. */ - else - decl = check_for_out_of_scope_variable (decl); /* Remember that the name was used in the definition of the current class so that we can check later to see if Index: gcc/doc/extend.texi =================================================================== --- gcc/doc/extend.texi (revision 260014) +++ gcc/doc/extend.texi (working copy) @@ -23840,17 +23840,6 @@ superior alternatives. Using the old fe some cases that the feature will be dropped in the future. In other cases, the feature might be gone already. -While the list below is not exhaustive, it documents some of the options -that are now deprecated or have been removed: - -@table @code - -@item -fno-for-scope -This option provides compatibility with pre-standard C++. -@xref{Backwards Compatibility}. - -@end table - G++ allows a virtual function returning @samp{void *} to be overridden by one returning a different pointer type. This extension to the covariant return type rules is now deprecated and will be removed from a @@ -23893,18 +23882,6 @@ liable to disappear in future versions o deprecated. @xref{Deprecated Features}. @table @code -@item For scope -If a variable is declared at for scope, it used to remain in scope -until the end of the scope that contained the for statement (rather -than just within the for scope). The deprecated -@option{-fno-for-scope} option enables this non-standard behavior. -Without the option, G++ retains this, but issues a warning, if such a -variable is accessed outside the for scope. - -The behavior is deprecated, only available with @option{-std=c++98} -@option{-std=gnu++98} languages and you must use the -@option{-fpermissive} option to enable it. The behavior will be -removed. @item Implicit C language Old C system header files did not contain an @code{extern "C" @{@dots{}@}} @@ -23912,6 +23889,7 @@ scope to set the language. On such syst implicitly scoped inside a C language scope. Also, an empty prototype @code{()} is treated as an unspecified number of arguments, rather than no arguments, as C++ demands. + @end table @c LocalWords: emph deftypefn builtin ARCv2EM SIMD builtins msimd Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 260014) +++ gcc/doc/invoke.texi (working copy) @@ -195,7 +195,7 @@ in the following sections. -fconstexpr-depth=@var{n} -fconstexpr-loop-limit=@var{n} @gol -fno-elide-constructors @gol -fno-enforce-eh-specs @gol --ffor-scope -fno-for-scope -fno-gnu-keywords @gol +-fno-gnu-keywords @gol -fno-implicit-templates @gol -fno-implicit-inline-templates @gol -fno-implement-inlines -fms-extensions @gol @@ -2490,21 +2490,6 @@ On targets that support symbol aliases, @option{-fextern-tls-init}. On targets that do not support symbol aliases, the default is @option{-fno-extern-tls-init}. -@item -ffor-scope -@itemx -fno-for-scope -@opindex ffor-scope -@opindex fno-for-scope -If @option{-ffor-scope} is specified, the scope of variables declared in -a @i{for-init-statement} is limited to the @code{for} loop itself, -as specified by the C++ standard. -If @option{-fno-for-scope} is specified, the scope of variables declared in -a @i{for-init-statement} extends to the end of the enclosing scope, -as was the case in old versions of G++, and other (traditional) -implementations of C++. - -This option is deprecated and the associated non-standard -functionality will be removed. - @item -fno-gnu-keywords @opindex fno-gnu-keywords Do not recognize @code{typeof} as a keyword, so that code can use this Index: gcc/objcp/objcp-lang.c =================================================================== --- gcc/objcp/objcp-lang.c (revision 260014) +++ gcc/objcp/objcp-lang.c (working copy) @@ -87,8 +87,6 @@ objcxx_init_ts (void) { objc_common_init_ts (); cp_common_init_ts (); - - init_shadowed_var_for_decl (); } #include "gtype-objcp.h" Index: gcc/testsuite/g++.dg/cpp0x/range-for10.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/range-for10.C (revision 260014) +++ gcc/testsuite/g++.dg/cpp0x/range-for10.C (working copy) @@ -1,18 +0,0 @@ -// PR c++/47388 -// { dg-do compile { target c++11 } } -// { dg-options "-fno-for-scope -Wno-deprecated" } - -template -void -foo () -{ - int a[] = { 1, 2, 3, 4 }; - for (int i : a) - ; -} - -void -bar () -{ - foo <0> (); -} Index: gcc/testsuite/g++.dg/ext/forscope1.C =================================================================== --- gcc/testsuite/g++.dg/ext/forscope1.C (revision 260014) +++ gcc/testsuite/g++.dg/ext/forscope1.C (working copy) @@ -1,27 +0,0 @@ -// { dg-do compile } -// { dg-options "-fno-for-scope -Wno-deprecated" } - -// Copyright (C) 2001 Free Software Foundation, Inc. -// Contributed by Nathan Sidwell 4 Sept 2001 - -// Bug 4206. We were nesting SCOPE_STMTs badly. - - -struct A -{ - A (); - ~A (); -}; - - -void Go( ) -{ - for (int i = 1;;) - { - switch (1) { - default: {} - } - A d; - } - i; -} Index: gcc/testsuite/g++.dg/ext/forscope2.C =================================================================== --- gcc/testsuite/g++.dg/ext/forscope2.C (revision 260014) +++ gcc/testsuite/g++.dg/ext/forscope2.C (working copy) @@ -1,27 +0,0 @@ -// { dg-do compile } -// { dg-options "-fpermissive -std=c++98" } - -// Copyright (C) 2001 Free Software Foundation, Inc. -// Contributed by Nathan Sidwell 4 Sept 2001 - -// Bug 4206. We were nesting SCOPE_STMTs badly. - - -struct A -{ - A (); - ~A (); -}; - - -void Go( ) -{ - for (int i = 1;;) // { dg-message "using obsolete binding" } - { - switch (1) { - default: {} - } - A d; - } - i; // { dg-warning "name lookup" } -} Index: gcc/testsuite/g++.dg/template/for1.C =================================================================== --- gcc/testsuite/g++.dg/template/for1.C (revision 260014) +++ gcc/testsuite/g++.dg/template/for1.C (working copy) @@ -1,23 +0,0 @@ -// PR c++/47388 -// { dg-do compile } -// { dg-options "-fno-for-scope -Wno-deprecated" } - -template -void -foo () -{ - int i; - for (i = 0; i < 16; i++) - ; - for (int j = 0; j < 16; j++) - ; - if (j != 16) - for (;;) - ; -} - -void -bar () -{ - foo <0> (); -}