re PR lto/62067 (lto-lang.c:549: too many calls to va_end on some code paths ?)
authorRichard Biener <rguenther@suse.de>
Thu, 14 Aug 2014 13:13:41 +0000 (13:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 14 Aug 2014 13:13:41 +0000 (13:13 +0000)
2014-08-14  Richard Biener  <rguenther@suse.de>

PR lto/62067
* lto-lang.c (def_fn_type): Fix error handling wrt va_end.

From-SVN: r213960

gcc/lto/ChangeLog
gcc/lto/lto-lang.c

index 18f483cada5ad9d5e1485ccac2e1c8299be3f87e..3483711e0db837b960572bfd9d0b660981c54ab9 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-14  Richard Biener  <rguenther@suse.de>
+
+       PR lto/62067
+       * lto-lang.c (def_fn_type): Fix error handling wrt va_end.
+
 2014-08-08  Richard Biener  <rguenther@suse.de>
 
        * lto.c (lto_read_decls): Adjust for lto_input_block changes.
index b3b9ff7caf78ebec7d2ba3adae08ed0cc3746566..9e8524acac2dbe267ff90168b129386d4d747cf7 100644 (file)
@@ -524,6 +524,7 @@ def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
   tree *args = XALLOCAVEC (tree, n);
   va_list list;
   int i;
+  bool err = false;
 
   va_start (list, n);
   for (i = 0; i < n; ++i)
@@ -531,22 +532,22 @@ def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
       builtin_type a = (builtin_type) va_arg (list, int);
       t = builtin_types[a];
       if (t == error_mark_node)
-       goto egress;
+       err = true;
       args[i] = t;
     }
   va_end (list);
 
   t = builtin_types[ret];
+  if (err)
+    t = error_mark_node;
   if (t == error_mark_node)
-    goto egress;
-  if (var)
+    ;
+  else if (var)
     t = build_varargs_function_type_array (t, n, args);
   else
     t = build_function_type_array (t, n, args);
 
- egress:
   builtin_types[def] = t;
-  va_end (list);
 }
 
 /* Used to help initialize the builtin-types.def table.  When a type of