Implement P0386R2 - C++17 inline variables
authorJason Merrill <jason@gcc.gnu.org>
Thu, 13 Oct 2016 19:26:54 +0000 (15:26 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 13 Oct 2016 19:26:54 +0000 (15:26 -0400)
commit14a2c9aac04f013245e332b9e7ecb8c3a9f42a0a
tree96a256d961ae6d285efeaf0bfc8c5baa96931f31
parentfc0911e0b86076b3241f19df921acf46f0890a59
Implement P0386R2 - C++17 inline variables

2016-10-11  Jakub Jelinek  <jakub@redhat.com>

* 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
20 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-cppbuiltin.c
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/pt.c
gcc/cp/typeck2.c
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/concepts/decl-diagnose.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ice10.C
gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
gcc/testsuite/g++.dg/cpp1z/inline-var1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/inline-var1.h [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/inline-var1a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/inline-var2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/inline-var3.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.brendan/misc6.C