tree.c (find_decls_types_r): Remove all non-VAR_DECLs from blocks.
authorJan Hubicka <hubicka@ucw.cz>
Tue, 19 Jun 2018 15:56:27 +0000 (17:56 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 19 Jun 2018 15:56:27 +0000 (15:56 +0000)
* tree.c (find_decls_types_r): Remove all non-VAR_DECLs from
blocks.
* g++.dg/lto/pr84805_0.C: Update template.
* g++.dg/lto/pr84805_1.C: Update template.

From-SVN: r261748

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr84805_0.C
gcc/testsuite/g++.dg/lto/pr84805_1.C
gcc/tree.c

index c4a48f068c74ed295c29936c7ca0336f05b0accd..4d59d2d1ee08b1f410c8f6fc8170379b3df5d22b 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-19  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree.c (find_decls_types_r): Remove all non-VAR_DECLs from
+       blocks.
+
 2018-06-19  Martin Liska  <mliska@suse.cz>
 
        * config/i386/i386.c (ix86_can_inline_p): Do not use
index ca846009c6ff7b88c9efbee03277c70269569355..8aa3c65e200c6a1a7f69706c84c7bac954ff721d 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-19  Jan Hubicka  <hubicka@ucw.cz>
+
+       * g++.dg/lto/pr84805_0.C: Update template.
+       * g++.dg/lto/pr84805_1.C: Update template.
+
 2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/aggr24.adb: New test.
index eda0333fbb893e99437ac4ede769428f97175b48..c9e00add79f43ab109caa76362061c0b772c42bc 100644 (file)
@@ -23,7 +23,7 @@ template < typename _Tp, _Lock_policy, bool = is_array< _Tp >::value,
            bool = is_void::value >
 class __shared_ptr_access {};
 template < typename _Tp, _Lock_policy _Lp >
-class __shared_ptr : __shared_ptr_access< _Tp, _Lp > { // { dg-lto-warning "7: type 'struct __shared_ptr' violates the C\\+\\+ One Definition Rule" }
+class __shared_ptr : __shared_ptr_access< _Tp, _Lp > {
   using element_type = _Tp;
   element_type *_M_ptr;
   __shared_count< _Lp > _M_refcount;
@@ -90,7 +90,7 @@ class ExtNameBuff;
 class ExtSheetBuffer;
 class ExcelToSc;
 class XclImpColRowSettings;
-struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" }
+struct RootData { 
   BiffTyp eDateiTyp;
   ExtSheetBuffer *pExtSheetBuff;
   SharedFormulaBuffer *pShrfmlaBuff;
@@ -105,7 +105,7 @@ class ScExtDocOptions;
 class XclFontPropSetHelper;
 class XclChPropSetHelper;
 class XclTracer;
-struct XclRootData { // { dg-lto-warning "8: type 'struct XclRootData' violates the C\\+\\+ One Definition Rule" }
+struct XclRootData {
   typedef std::shared_ptr< ScEditEngineDefaulter > ScEEDefaulterRef;
   typedef std::shared_ptr< ScHeaderEditEngine > ScHeaderEERef;
   typedef std::shared_ptr< EditEngine > EditEngineRef;
@@ -141,12 +141,12 @@ struct XclRootData { // { dg-lto-warning "8: type 'struct XclRootData' violates
   RootDataRef mxRD;
   virtual ~XclRootData();
 };
-class XclRoot { // { dg-lto-warning "7: type 'struct XclRoot' violates the C\\+\\+ One Definition Rule" }
+class XclRoot {
 public:
   virtual ~XclRoot();
   XclRootData &mrData;
 };
-class XclImpRoot : XclRoot {}; // { dg-lto-warning "7: type 'struct XclImpRoot' violates the C\\+\\+ One Definition Rule" }
+class XclImpRoot : XclRoot {}; 
 class XclImpColRowSettings : XclImpRoot {};
 void lcl_ExportExcelBiff() {
 XclRootData aExpData();
index 2d8a45c001a8521bb81e9419184e997104d8e6fc..b1310b7c77ccb0937affeba3317539cf41f7fddb 100644 (file)
@@ -1,9 +1,9 @@
-class XclRoot {
+class XclRoot { // { dg-lto-warning "7: type 'struct XclRoot' violates the C\\+\\+ One Definition Rule" }
 public:
   virtual ~XclRoot();
 };
 class XclImpRoot : XclRoot {};
-struct RootData {
+struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" }
   XclImpRoot pIR;
 };
 class ExcRoot {
index 889d88c50b4a836e03579bfaf176dbfa12eb1d5d..3f75f7f9bfba0827e1b21f267c33c5957cf3c69a 100644 (file)
@@ -5173,7 +5173,10 @@ free_lang_data_in_type (tree type)
   /* Drop TYPE_DECLs in TYPE_NAME in favor of the identifier in the
      TYPE_DECL if the type doesn't have linkage.  */
   if (! type_with_linkage_p (type))
-    TYPE_NAME (type) = TYPE_IDENTIFIER (type);
+    {
+      TYPE_NAME (type) = TYPE_IDENTIFIER (type);
+      TYPE_STUB_DECL (type) = NULL;
+    }
 }
 
 
@@ -5556,10 +5559,22 @@ find_decls_types_r (tree *tp, int *ws, void *data)
     }
   else if (TREE_CODE (t) == BLOCK)
     {
-      tree tem;
-      for (tem = BLOCK_VARS (t); tem; tem = TREE_CHAIN (tem))
-       fld_worklist_push (tem, fld);
-      for (tem = BLOCK_SUBBLOCKS (t); tem; tem = BLOCK_CHAIN (tem))
+      for (tree *tem = &BLOCK_VARS (t); *tem; )
+       {
+         if (TREE_CODE (*tem) != VAR_DECL
+             || !auto_var_in_fn_p (*tem, DECL_CONTEXT (*tem)))
+           {
+             gcc_assert (TREE_CODE (*tem) != RESULT_DECL
+                         && TREE_CODE (*tem) != PARM_DECL);
+             *tem = TREE_CHAIN (*tem);
+           }
+         else 
+           {
+             fld_worklist_push (*tem, fld);
+             tem = &TREE_CHAIN (*tem);
+           }
+       }
+      for (tree tem = BLOCK_SUBBLOCKS (t); tem; tem = BLOCK_CHAIN (tem))
        fld_worklist_push (tem, fld);
       fld_worklist_push (BLOCK_ABSTRACT_ORIGIN (t), fld);
     }