re PR c++/13081 (forward template declarations in <complex> 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
This commit is contained in:
Mark Mitchell 2003-12-29 02:42:17 +00:00 committed by Mark Mitchell
parent 1896d29d23
commit c11889cef5
5 changed files with 52 additions and 1 deletions

View File

@ -1,5 +1,13 @@
2003-12-28 Mark Mitchell <mark@codesourcery.com> 2003-12-28 Mark Mitchell <mark@codesourcery.com>
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 PR c++/13009
* call.c (build_special_member_call): Do not assume that we have a * call.c (build_special_member_call): Do not assume that we have a
pointer to the complete object in an assignment operator. pointer to the complete object in an assignment operator.

View File

@ -1594,6 +1594,14 @@ duplicate_decls (tree newdecl, tree olddecl)
= DECL_SOURCE_LOCATION (newdecl); = 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; return olddecl;
} }
@ -4342,7 +4350,17 @@ reshape_init (tree type, tree *initp)
TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init); TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init);
CONSTRUCTOR_ELTS (new_init) = element_init; CONSTRUCTOR_ELTS (new_init) = element_init;
if (TREE_PURPOSE (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 else

View File

@ -1,5 +1,11 @@
2003-12-28 Mark Mitchell <mark@codesourcery.com> 2003-12-28 Mark Mitchell <mark@codesourcery.com>
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-*-*. * gcc.dg/const-elim-1.c: XFAIL on arm-*-*.
2003-12-28 Mark Mitchell <mark@codesourcery.com> 2003-12-28 Mark Mitchell <mark@codesourcery.com>

View File

@ -0,0 +1,14 @@
// PR c++/13081
// { dg-options "-O2" }
// { dg-final { scan-assembler-not "foo" } }
template<typename T> T foo(T);
template<typename T> inline T foo(T t)
{
return t;
}
void bar (long& l) {
l = foo(l);
}

View File

@ -0,0 +1,5 @@
// PR c++/12613
// { dg-options "" }
enum { FOO = 1, BAR = 2 };
int a[] = { FOO: 1, BAR: 2 }; // { dg-error "" }