OSDN Git Service

PR c/17807
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Feb 2005 02:21:10 +0000 (02:21 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Feb 2005 02:21:10 +0000 (02:21 +0000)
* c-decl.c (undef_nested_function): New variable.
(pop_scope): Diagnose undefined nested functions.
(finish_function): Don't attempt cgraph processing or genericizing
if current top-level function contained an undefined nested
function.  Reset undef_nested_function at the end of a top-level
function.

testsuite:
* gcc.dg/nested-func-3.c: New test.
* gcc.dg/pr18596-3.c: Expect error for undefined nested function.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94645 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/nested-func-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr18596-3.c

index 31c8ea8..ee74a41 100644 (file)
@@ -1,3 +1,13 @@
+2005-02-03  Joseph S. Myers  <joseph@codesourcery.com>
+
+       PR c/17807
+       * c-decl.c (undef_nested_function): New variable.
+       (pop_scope): Diagnose undefined nested functions.
+       (finish_function): Don't attempt cgraph processing or genericizing
+       if current top-level function contained an undefined nested
+       function.  Reset undef_nested_function at the end of a top-level
+       function.
+
 2005-02-02  Zdenek Dvorak  <dvorakz@suse.cz>
 
        * tree.c (build_int_cst_type): Take sign of the value into account
index ad76f23..0b7b97e 100644 (file)
@@ -149,6 +149,11 @@ static int warn_about_return_type;
 
 static int current_extern_inline;
 
+/* Nonzero when the current toplevel function contains a declaration
+   of a nested function which is never defined.  */
+
+static bool undef_nested_function;
+
 /* True means global_bindings_p should return false even if the scope stack
    says we are in file scope.  */
 bool c_override_global_bindings_to_false;
@@ -759,6 +764,12 @@ pop_scope (void)
              && DECL_ABSTRACT_ORIGIN (p) != 0
              && DECL_ABSTRACT_ORIGIN (p) != p)
            TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (p)) = 1;
+         if (!DECL_EXTERNAL (p)
+             && DECL_INITIAL (p) == 0)
+           {
+             error ("%Jnested function %qD declared but never defined", p, p);
+             undef_nested_function = true;
+           }
          goto common_symbol;
 
        case VAR_DECL:
@@ -6376,7 +6387,8 @@ finish_function (void)
      until their parent function is genericized.  Since finalizing
      requires GENERIC, delay that as well.  */
 
-  if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node)
+  if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node
+      && !undef_nested_function)
     {
       if (!decl_function_context (fndecl))
         {
@@ -6402,6 +6414,9 @@ finish_function (void)
         }
     }
 
+  if (!decl_function_context (fndecl))
+    undef_nested_function = false;
+
   /* We're leaving the context of this function, so zap cfun.
      It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
      tree_rest_of_compilation.  */
index 3e1fee4..1d80350 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-03  Joseph S. Myers  <joseph@codesourcery.com>
+
+       PR c/17807
+       * gcc.dg/nested-func-3.c: New test.
+       * gcc.dg/pr18596-3.c: Expect error for undefined nested function.
+
 2005-02-02  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.test-framework/gen_directive_tests: Generate tests for
diff --git a/gcc/testsuite/gcc.dg/nested-func-3.c b/gcc/testsuite/gcc.dg/nested-func-3.c
new file mode 100644 (file)
index 0000000..c4c016c
--- /dev/null
@@ -0,0 +1,20 @@
+/* Undefined nested function should be a error, whether or not the
+   function is called.  Bug 17807.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void
+f (void)
+{
+  auto int fn (int); /* { dg-error "error: nested function 'fn' declared but never defined" } */
+  auto int fn2 (int); /* { dg-error "error: nested function 'fn2' declared but never defined" } */
+  sizeof(fn(1));
+}
+
+void
+h (void)
+{
+  auto int hn (int); /* { dg-error "error: nested function 'hn' declared but never defined" } */
+  hn (1);
+}
index c2a04f8..74a6e63 100644 (file)
@@ -6,6 +6,7 @@ int foo ()
   static g () = 0; /* { dg-error "invalid storage class" } */
   static int f () = 1; /* { dg-error "invalid storage class" } */
   auto int h () = 0; /* { dg-error "initialized like a variable" } */
+  /* { dg-error "declared but never defined" "nested" { target *-*-* } 8 } */
   static int i () = { 0 }; /* { dg-error "invalid storage class" } */
   static int j () = /* { dg-error "invalid storage class" } */
        { 0, 0.0 };