Commit e44c800e by Dodji Seketeli Committed by Dodji Seketeli

re PR c++/36767 (Segmentation fault with -fprofile-arcs -O2)

2008-07-30  Dodji Seketeli  <dseketel@redhat.com>

	PR c++/36767
	* decl2.c (fix_temporary_vars_context_r): New function.
	 (one_static_initialization_or_destruction): Make sure temporary
	 variables part of the initialiser have their DECL_CONTEXT()
	 properly set.

From-SVN: r138308
parent 6ca2b0a0
2008-07-30 Dodji Seketeli <dseketel@redhat.com>
PR c++/36767
* decl2.c (fix_temporary_vars_context_r): New function.
(one_static_initialization_or_destruction): Make sure temporary
variables part of the initialiser have their DECL_CONTEXT()
properly set.
2008-07-30 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2008-07-30 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 34389 PR 34389
......
...@@ -2811,6 +2811,38 @@ get_priority_info (int priority) ...@@ -2811,6 +2811,38 @@ get_priority_info (int priority)
|| DECL_ONE_ONLY (decl) \ || DECL_ONE_ONLY (decl) \
|| DECL_WEAK (decl))) || DECL_WEAK (decl)))
/* Called from one_static_initialization_or_destruction(),
via walk_tree.
Walks the initializer list of a global variable and looks for
temporary variables (DECL_NAME() == NULL and DECL_ARTIFICIAL != 0)
and that have their DECL_CONTEXT() == NULL.
For each such temporary variable, set their DECL_CONTEXT() to
the current function. This is necessary because otherwise
some optimizers (enabled by -O2 -fprofile-arcs) might crash
when trying to refer to a temporary variable that does not have
it's DECL_CONTECT() properly set. */
static tree
fix_temporary_vars_context_r (tree *node,
int *unused ATTRIBUTE_UNUSED,
void *unused1 ATTRIBUTE_UNUSED)
{
gcc_assert (current_function_decl);
if (TREE_CODE (*node) == BIND_EXPR)
{
tree var;
for (var = BIND_EXPR_VARS (*node); var; var = TREE_CHAIN (var))
if (TREE_CODE (var) == VAR_DECL
&& !DECL_NAME (var)
&& DECL_ARTIFICIAL (var)
&& !DECL_CONTEXT (var))
DECL_CONTEXT (var) = current_function_decl;
}
return NULL_TREE;
}
/* Set up to handle the initialization or destruction of DECL. If /* Set up to handle the initialization or destruction of DECL. If
INITP is nonzero, we are initializing the variable. Otherwise, we INITP is nonzero, we are initializing the variable. Otherwise, we
are destroying it. */ are destroying it. */
...@@ -2833,6 +2865,19 @@ one_static_initialization_or_destruction (tree decl, tree init, bool initp) ...@@ -2833,6 +2865,19 @@ one_static_initialization_or_destruction (tree decl, tree init, bool initp)
information. */ information. */
input_location = DECL_SOURCE_LOCATION (decl); input_location = DECL_SOURCE_LOCATION (decl);
/* Make sure temporary variables in the initialiser all have
their DECL_CONTEXT() set to a value different from NULL_TREE.
This can happen when global variables initialisers are built.
In that case, the DECL_CONTEXT() of the global variables _AND_ of all
the temporary variables that might have been generated in the
accompagning initialisers is NULL_TREE, meaning the variables have been
declared in the global namespace.
What we want to do here is to fix that and make sure the DECL_CONTEXT()
of the temporaries are set to the current function decl. */
cp_walk_tree_without_duplicates (&init,
fix_temporary_vars_context_r,
NULL);
/* Because of: /* Because of:
[class.access.spec] [class.access.spec]
......
2008-07-30 Dodji Seketeli <dseketel@redhat.com>
PR c++/36767
* g++.dg/parse/crash42.C: New test.
2008-07-30 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2008-07-30 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 34389 PR 34389
......
// Created by: Dodji Seketeli <dseketel@redhat.com>
// { dg-do compile }
// { dg-options "-O2 -fprofile-arcs" }
// Origin: PR C++/36767
struct A { A (); ~A (); };
A a[2];
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