From 14a2c9aac04f013245e332b9e7ecb8c3a9f42a0a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 13 Oct 2016 15:26:54 -0400 Subject: Implement P0386R2 - C++17 inline variables 2016-10-11 Jakub Jelinek * dwarf2out.c (gen_member_die): Handle inline static data member definitions. c-family/ * c-cppbuiltin.c (c_cpp_builtins): Add __cpp_inline_variables. cp/ * cp-tree.h (struct lang_type): Shrink language field to 1 bit from 4. Add var_declared_inline_p field. Mention 2 spare bits. (DECL_VAR_DECLARED_INLINE_P): Define. (SET_DECL_VAR_DECLARED_INLINE_P): Define. (DECL_INLINE_VAR_P): Define. (diagnose_inline_vars_for_namespace): Declare. * decl.c (diagnose_inline_vars_for_namespace): New function. (duplicate_decls): For static data members copy DECL_DECLARED_CONSTEXPR_P. (redeclaration_error_message): Handle C++17 redundant redeclaration of constexpr static data member outside of class. (maybe_commonize_var): Handle inline variables. (check_initializer): Ignore inline variables for diagnostics. Adjust diagnostic wording for C++17. (make_rtl_for_nonlocal_decl): Allow in-class definition of inline static data members. (bad_specifiers): Don't diagnose inline on variables here. (grokvardecl): Add inlinep argument, non-static const inline variables are TREE_PUBLIC. (check_static_variable_definition): Return early also for inline variables. (grokdeclarator): Handle inline variables and inline static data members. * typeck2.c (store_init_value): Don't diagnose non-constant initializers for non-constexpr inline static data members. * decl2.c (vague_linkage_p): Return true for inline variables. (c_parse_final_cleanups): In-class declaration of inline static data members is a definition. Call diagnose_inline_vars_for_namespace through walk_namespaces. * pt.c (instantiate_decl): Set pattern_defined for in-class definitions of inline static data members. From-SVN: r241137 --- gcc/dwarf2out.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'gcc/dwarf2out.c') diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4376751..541faf7 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -22653,7 +22653,18 @@ gen_member_die (tree type, dw_die_ref context_die) child = lookup_decl_die (member); if (child) - splice_child_die (context_die, child); + { + /* Handle inline static data members, which only have in-class + declarations. */ + if (child->die_tag == DW_TAG_variable + && child->die_parent == comp_unit_die ()) + { + reparent_child (child, context_die); + child->die_tag = DW_TAG_member; + } + else + splice_child_die (context_die, child); + } /* Do not generate standard DWARF for variant parts if we are generating the corresponding GNAT encodings: DIEs generated for both would -- cgit v1.1