aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2018-06-19 17:56:27 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2018-06-19 15:56:27 +0000
commit694dc72ebe8701bbf6ed4cd6cf846dc80367aee9 (patch)
treef420db30ee3e8c8765599066414b33f045511ed5 /gcc
parent583d09f3653e12a895fbe6c86ce4bfbae0abc2cc (diff)
downloadgcc-694dc72ebe8701bbf6ed4cd6cf846dc80367aee9.zip
gcc-694dc72ebe8701bbf6ed4cd6cf846dc80367aee9.tar.gz
gcc-694dc72ebe8701bbf6ed4cd6cf846dc80367aee9.tar.bz2
tree.c (find_decls_types_r): Remove all non-VAR_DECLs from blocks.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lto/pr84805_0.C10
-rw-r--r--gcc/testsuite/g++.dg/lto/pr84805_1.C4
-rw-r--r--gcc/tree.c25
5 files changed, 37 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c4a48f0..4d59d2d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ca84600..8aa3c65 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/lto/pr84805_0.C b/gcc/testsuite/g++.dg/lto/pr84805_0.C
index eda0333f..c9e00ad 100644
--- a/gcc/testsuite/g++.dg/lto/pr84805_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr84805_0.C
@@ -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();
diff --git a/gcc/testsuite/g++.dg/lto/pr84805_1.C b/gcc/testsuite/g++.dg/lto/pr84805_1.C
index 2d8a45c..b1310b7 100644
--- a/gcc/testsuite/g++.dg/lto/pr84805_1.C
+++ b/gcc/testsuite/g++.dg/lto/pr84805_1.C
@@ -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 {
diff --git a/gcc/tree.c b/gcc/tree.c
index 889d88c..3f75f7f 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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);
}