]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/21228 (-Wunreachable-code produces spurious warnings for constructor)
authorMark Mitchell <mark@codesourcery.com>
Tue, 20 Dec 2005 08:48:13 +0000 (08:48 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 20 Dec 2005 08:48:13 +0000 (08:48 +0000)
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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C [new file with mode: 0644]

index 2b3c175b9abb78fa4a36422806a3dc73792106d0..766fbd527638aa4cb09af25415b9e532aa9f8240 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR c++/24278
index ffa5e336d9b238a61d405c32cee4e82fe3419e95..447e98dd0cc7ee8c383142482bd7fbcbfb179f80 100644 (file)
@@ -10482,6 +10482,30 @@ start_function (cp_decl_specifier_seq *declspecs,
   return 1;
 }
 \f
+/* 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.
    This is called after parsing the parameter declarations, before
    digesting the body of the function.
@@ -10552,16 +10576,8 @@ store_parm_decls (tree current_function_parms)
      DECL_ARGUMENTS is not modified.  */
   current_binding_level->names = chainon (nonparms, DECL_ARGUMENTS (fndecl));
 
-  /* For a cloned function, we've already got all the code we need;
-     there's no need to add any extra bits.  */
-  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 ();
-    }
+  if (use_eh_spec_block (current_function_decl))
+    current_eh_spec_block = begin_eh_spec_block ();
 }
 
 \f
@@ -10848,10 +10864,7 @@ finish_function (int flags)
 #endif
        }
 
-      /* Finish dealing with exception specifiers.  */
-      if (flag_exceptions && !processing_template_decl
-         && flag_enforce_eh_specs
-         && TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
+      if (use_eh_spec_block (current_function_decl))
        finish_eh_spec_block (TYPE_RAISES_EXCEPTIONS
                              (TREE_TYPE (current_function_decl)),
                              current_eh_spec_block);
index fe6953e5ef1e504ff488922b302abba501ae05cd..7073aeca8ad3b244dfd4f52071d28033ed86425a 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR c++/24278
diff --git a/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C b/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C
new file mode 100644 (file)
index 0000000..d50f7fe
--- /dev/null
@@ -0,0 +1,23 @@
+// 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;
+}