From c11889cef5d45cc5a33fc391ff73980d9f623afb Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 29 Dec 2003 02:42:17 +0000 Subject: [PATCH] re PR c++/13081 (forward template declarations in let inlining fail) PR c++/13081 * decl.c (duplicate_decls): Preserve inline-ness when redeclaring a function template. PR c++/12613 * decl.c (reshape_init): Reject GNU colon-style designated initializers in arrays. PR c++/13081 * g++.dg/opt/inline6.C: New test. PR c++/12613 * g++.dg/parse/error9.C: New test. From-SVN: r75192 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/decl.c | 20 +++++++++++++++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/opt/inline6.C | 14 ++++++++++++++ gcc/testsuite/g++.dg/parse/error9.C | 5 +++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/inline6.C create mode 100644 gcc/testsuite/g++.dg/parse/error9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3f85d7bcb89..62e395a007a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 2003-12-28 Mark Mitchell + PR c++/13081 + * decl.c (duplicate_decls): Preserve inline-ness when redeclaring + a function template. + + PR c++/12613 + * decl.c (reshape_init): Reject GNU colon-style designated + initializers in arrays. + PR c++/13009 * call.c (build_special_member_call): Do not assume that we have a pointer to the complete object in an assignment operator. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 0c0803b7c7e..80041cb614d 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1594,6 +1594,14 @@ duplicate_decls (tree newdecl, tree olddecl) = DECL_SOURCE_LOCATION (newdecl); } + if (DECL_FUNCTION_TEMPLATE_P (newdecl)) + { + DECL_INLINE (DECL_TEMPLATE_RESULT (olddecl)) + |= DECL_INLINE (DECL_TEMPLATE_RESULT (newdecl)); + DECL_DECLARED_INLINE_P (DECL_TEMPLATE_RESULT (olddecl)) + |= DECL_DECLARED_INLINE_P (DECL_TEMPLATE_RESULT (newdecl)); + } + return olddecl; } @@ -4342,7 +4350,17 @@ reshape_init (tree type, tree *initp) TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = element_init; if (TREE_PURPOSE (element_init)) - index = TREE_PURPOSE (element_init); + { + tree next_index = TREE_PURPOSE (element_init); + if (TREE_CODE (next_index) == IDENTIFIER_NODE) + { + error ("name `%D' used in a GNU-style designated " + "initializer for an array", next_index); + TREE_PURPOSE (element_init) = NULL_TREE; + } + else + index = next_index; + } } } else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 465b7a923c4..bfca531f3ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2003-12-28 Mark Mitchell + PR c++/13081 + * g++.dg/opt/inline6.C: New test. + + PR c++/12613 + * g++.dg/parse/error9.C: New test. + * gcc.dg/const-elim-1.c: XFAIL on arm-*-*. 2003-12-28 Mark Mitchell diff --git a/gcc/testsuite/g++.dg/opt/inline6.C b/gcc/testsuite/g++.dg/opt/inline6.C new file mode 100644 index 00000000000..21872210558 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline6.C @@ -0,0 +1,14 @@ +// PR c++/13081 +// { dg-options "-O2" } +// { dg-final { scan-assembler-not "foo" } } + +template T foo(T); + +template inline T foo(T t) +{ + return t; +} + +void bar (long& l) { + l = foo(l); +} diff --git a/gcc/testsuite/g++.dg/parse/error9.C b/gcc/testsuite/g++.dg/parse/error9.C new file mode 100644 index 00000000000..aa9109fd22b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error9.C @@ -0,0 +1,5 @@ +// PR c++/12613 +// { dg-options "" } + +enum { FOO = 1, BAR = 2 }; +int a[] = { FOO: 1, BAR: 2 }; // { dg-error "" } -- 2.30.2