Commit 68d04c67 by Mark Mitchell Committed by Mark Mitchell

re PR c++/21228 (-Wunreachable-code produces spurious warnings for constructor)

	PR c++/21228
	* decl.c (use_eh_spec_block): New function.
	(store_parm_decls): Use it.
	(finish_function): Likewise.
	
	PR c++/21228
	* g++.dg/warn/Wunreachable-code-2.C: New test.

From-SVN: r108851
parent c3115fd2
2005-12-20 Mark Mitchell <mark@codesourcery.com>
PR c++/21228
* decl.c (use_eh_spec_block): New function.
(store_parm_decls): Use it.
(finish_function): Likewise.
2005-12-19 Mark Mitchell <mark@codesourcery.com> 2005-12-19 Mark Mitchell <mark@codesourcery.com>
PR c++/24278 PR c++/24278
......
...@@ -10482,6 +10482,30 @@ start_function (cp_decl_specifier_seq *declspecs, ...@@ -10482,6 +10482,30 @@ start_function (cp_decl_specifier_seq *declspecs,
return 1; return 1;
} }
/* Returns true iff an EH_SPEC_BLOCK should be created in the body of
FN. */
static bool
use_eh_spec_block (tree fn)
{
return (flag_exceptions && flag_enforce_eh_specs
&& !processing_template_decl
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))
/* We insert the EH_SPEC_BLOCK only in the original
function; then, it is copied automatically to the
clones. */
&& !DECL_CLONED_FUNCTION_P (fn)
/* Implicitly-generated constructors and destructors have
exception specifications. However, those specifications
are the union of the possible exceptions specified by the
constructors/destructors for bases and members, so no
unallowed exception will ever reach this function. By
not creating the EH_SPEC_BLOCK we save a little memory,
and we avoid spurious warnings about unreachable
code. */
&& !DECL_ARTIFICIAL (fn));
}
/* Store the parameter declarations into the current function declaration. /* Store the parameter declarations into the current function declaration.
This is called after parsing the parameter declarations, before This is called after parsing the parameter declarations, before
digesting the body of the function. digesting the body of the function.
...@@ -10552,16 +10576,8 @@ store_parm_decls (tree current_function_parms) ...@@ -10552,16 +10576,8 @@ store_parm_decls (tree current_function_parms)
DECL_ARGUMENTS is not modified. */ DECL_ARGUMENTS is not modified. */
current_binding_level->names = chainon (nonparms, DECL_ARGUMENTS (fndecl)); current_binding_level->names = chainon (nonparms, DECL_ARGUMENTS (fndecl));
/* For a cloned function, we've already got all the code we need; if (use_eh_spec_block (current_function_decl))
there's no need to add any extra bits. */ current_eh_spec_block = begin_eh_spec_block ();
if (!DECL_CLONED_FUNCTION_P (fndecl))
{
/* Do the starting of the exception specifications, if we have any. */
if (flag_exceptions && !processing_template_decl
&& flag_enforce_eh_specs
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
current_eh_spec_block = begin_eh_spec_block ();
}
} }
...@@ -10848,10 +10864,7 @@ finish_function (int flags) ...@@ -10848,10 +10864,7 @@ finish_function (int flags)
#endif #endif
} }
/* Finish dealing with exception specifiers. */ if (use_eh_spec_block (current_function_decl))
if (flag_exceptions && !processing_template_decl
&& flag_enforce_eh_specs
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
finish_eh_spec_block (TYPE_RAISES_EXCEPTIONS finish_eh_spec_block (TYPE_RAISES_EXCEPTIONS
(TREE_TYPE (current_function_decl)), (TREE_TYPE (current_function_decl)),
current_eh_spec_block); current_eh_spec_block);
......
2005-12-20 Mark Mitchell <mark@codesourcery.com>
PR c++/21228
* g++.dg/warn/Wunreachable-code-2.C: New test.
2005-12-19 Mark Mitchell <mark@codesourcery.com> 2005-12-19 Mark Mitchell <mark@codesourcery.com>
PR c++/24278 PR c++/24278
// PR c++/21228
/* { dg-options "-Wunreachable-code" } */
class testStringBase
{
public:
char *stringPtr;
};
class testString : public testStringBase
{
public:
testString();
};
testString::testString()
{
stringPtr = (char *) 9;
}
int main(int argc, char **argv) {
testString s;
}
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