aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-01-25 12:16:28 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-01-25 12:16:28 -0500
commitb3310d490144dd291d0e26279e5bf70772ea2da9 (patch)
tree1b411d991175462cc0575e5e3ab707d45afaa067
parent06e1d03dc90b2daf18c06346ff5cabe266f0b6f3 (diff)
downloadgcc-b3310d490144dd291d0e26279e5bf70772ea2da9.zip
gcc-b3310d490144dd291d0e26279e5bf70772ea2da9.tar.gz
gcc-b3310d490144dd291d0e26279e5bf70772ea2da9.tar.bz2
re PR c++/51992 (internal compiler error: tree code ‘target_expr’ is not supported in LTO streams)
PR c++/51992 * tree.c (find_decls_types_in_node): Walk gimple_call_fntype. From-SVN: r183527
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lto/pr51992_0.C53
-rw-r--r--gcc/tree.c3
4 files changed, 66 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b3be4c0..82e5165 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/51992
+ * tree.c (find_decls_types_in_node): Walk gimple_call_fntype.
+
2012-01-25 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51987
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ea0cc24..493b040 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/51992
+ * g++.dg/lto/pr51992_0.C: New.
+
2012-01-25 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51987
diff --git a/gcc/testsuite/g++.dg/lto/pr51992_0.C b/gcc/testsuite/g++.dg/lto/pr51992_0.C
new file mode 100644
index 0000000..deb232c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr51992_0.C
@@ -0,0 +1,53 @@
+// PR c++/51992
+// { dg-lto-do assemble }
+
+template<typename Enum>
+class QFlags
+{
+ int i;
+ inline QFlags(Enum f) : i(f) {}
+};
+class QString {};
+class KComponentData;
+class KConfig
+{
+public:
+ enum OpenFlag {
+ IncludeGlobals = 0x01,
+ CascadeConfig = 0x02,
+ FullConfig = IncludeGlobals|CascadeConfig
+ };
+ typedef QFlags<OpenFlag> OpenFlags;
+};
+template <class T>
+class KSharedPtr {};
+class KSharedConfig : public KConfig
+{
+public:
+ typedef KSharedPtr<KSharedConfig> Ptr;
+ static KSharedConfig::Ptr openConfig(const QString& fileName = QString(),
+ OpenFlags mode = FullConfig,
+ const char *resourceType = "config");
+ static KSharedConfig::Ptr openConfig(const KComponentData &componentData,
+ const QString &fileName = QString(),
+ OpenFlags mode = FullConfig,
+ const char *resourceType = "config");
+};
+typedef KSharedConfig::Ptr KSharedConfigPtr;
+namespace KGlobal
+{
+ KComponentData &mainComponent();
+};
+KSharedConfigPtr KSharedConfig::openConfig(const QString& fileName,
+ OpenFlags flags,
+ const char *resType)
+{
+ return openConfig(KGlobal::mainComponent(), fileName, flags, resType);
+}
+KSharedConfigPtr KSharedConfig::openConfig(const KComponentData &componentData,
+ const QString& fileName,
+ OpenFlags flags,
+ const char *resType)
+{
+ return KSharedConfigPtr();
+}
diff --git a/gcc/tree.c b/gcc/tree.c
index ec78616..34bcb39 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5037,6 +5037,9 @@ find_decls_types_in_node (struct cgraph_node *n, struct free_lang_data_d *fld)
{
gimple stmt = gsi_stmt (si);
+ if (is_gimple_call (stmt))
+ find_decls_types (gimple_call_fntype (stmt), fld);
+
for (i = 0; i < gimple_num_ops (stmt); i++)
{
tree arg = gimple_op (stmt, i);