Commit 34bec556 by Jason Merrill Committed by Jason Merrill

re PR c++/45603 (crash in "build_addr_func")

	PR c++/45603
	* decl.c (expand_static_init): Don't get confused by user
	declaration of __cxa_guard_acquire.

From-SVN: r176054
parent 3e4f8484
2011-07-08 Jason Merrill <jason@redhat.com> 2011-07-08 Jason Merrill <jason@redhat.com>
PR c++/45603
* decl.c (expand_static_init): Don't get confused by user
declaration of __cxa_guard_acquire.
* typeck.c (cp_apply_type_quals_to_decl): Don't check * typeck.c (cp_apply_type_quals_to_decl): Don't check
COMPLETE_TYPE_P either. COMPLETE_TYPE_P either.
......
...@@ -6646,7 +6646,6 @@ expand_static_init (tree decl, tree init) ...@@ -6646,7 +6646,6 @@ expand_static_init (tree decl, tree init)
tree if_stmt = NULL_TREE, inner_if_stmt = NULL_TREE; tree if_stmt = NULL_TREE, inner_if_stmt = NULL_TREE;
tree then_clause = NULL_TREE, inner_then_clause = NULL_TREE; tree then_clause = NULL_TREE, inner_then_clause = NULL_TREE;
tree guard, guard_addr; tree guard, guard_addr;
tree acquire_fn, release_fn, abort_fn;
tree flag, begin; tree flag, begin;
/* Emit code to perform this initialization but once. This code /* Emit code to perform this initialization but once. This code
...@@ -6696,29 +6695,31 @@ expand_static_init (tree decl, tree init) ...@@ -6696,29 +6695,31 @@ expand_static_init (tree decl, tree init)
if (flag_threadsafe_statics) if (flag_threadsafe_statics)
{ {
tree vfntype = NULL_TREE;
tree acquire_name, release_name, abort_name;
tree acquire_fn, release_fn, abort_fn;
guard_addr = build_address (guard); guard_addr = build_address (guard);
acquire_fn = get_identifier ("__cxa_guard_acquire"); acquire_name = get_identifier ("__cxa_guard_acquire");
release_fn = get_identifier ("__cxa_guard_release"); release_name = get_identifier ("__cxa_guard_release");
abort_fn = get_identifier ("__cxa_guard_abort"); abort_name = get_identifier ("__cxa_guard_abort");
if (!get_global_value_if_present (acquire_fn, &acquire_fn)) acquire_fn = identifier_global_value (acquire_name);
{ release_fn = identifier_global_value (release_name);
tree vfntype = build_function_type_list (void_type_node, abort_fn = identifier_global_value (abort_name);
TREE_TYPE (guard_addr), if (!acquire_fn)
NULL_TREE); acquire_fn = push_library_fn
acquire_fn = push_library_fn (acquire_name, build_function_type_list (integer_type_node,
(acquire_fn, build_function_type_list (integer_type_node,
TREE_TYPE (guard_addr), TREE_TYPE (guard_addr),
NULL_TREE), NULL_TREE),
NULL_TREE); NULL_TREE);
release_fn = push_library_fn (release_fn, vfntype, NULL_TREE); if (!release_fn || !abort_fn)
abort_fn = push_library_fn (abort_fn, vfntype, NULL_TREE); vfntype = build_function_type_list (void_type_node,
} TREE_TYPE (guard_addr),
else NULL_TREE);
{ if (!release_fn)
release_fn = identifier_global_value (release_fn); release_fn = push_library_fn (release_name, vfntype, NULL_TREE);
abort_fn = identifier_global_value (abort_fn); if (!abort_fn)
} abort_fn = push_library_fn (abort_name, vfntype, NULL_TREE);
inner_if_stmt = begin_if_stmt (); inner_if_stmt = begin_if_stmt ();
finish_if_stmt_cond (build_call_n (acquire_fn, 1, guard_addr), finish_if_stmt_cond (build_call_n (acquire_fn, 1, guard_addr),
......
2011-07-08 Jason Merrill <jason@redhat.com>
PR c++/45603
* g++.dg/abi/guard3.C: New.
2011-07-08 Julian Brown <julian@codesourcery.com> 2011-07-08 Julian Brown <julian@codesourcery.com>
* lib/target-supports.exp * lib/target-supports.exp
......
// PR c++/45603
extern "C" int __cxa_guard_acquire();
struct A
{
~A();
};
A* f()
{
static A a;
return &a;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment