From 0710ccffc3ddf8e4877fdab6cf712cd65f45d1cb Mon Sep 17 00:00:00 2001
From: Nathan Sidwell <nathan@codesourcery.com>
Date: Wed, 8 Dec 2004 08:47:59 +0000
Subject: [PATCH] re PR c++/18672 (Segfault with simple template code)

.:	PR c++/18672
	* gimplify.c (canonicalize_addr_expr): Cope with array of
	incomplete type.
	(gimplify_conversion): Remove redundant checks.
testsuite:
	PR c++/18672
	* g++.dg/opt/array1.C: New.

From-SVN: r91865
---
 gcc/ChangeLog                     |  5 +++++
 gcc/gimplify.c                    | 22 +++++++++++-----------
 gcc/testsuite/ChangeLog           |  3 +++
 gcc/testsuite/g++.dg/opt/array1.C | 20 ++++++++++++++++++++
 4 files changed, 39 insertions(+), 11 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/opt/array1.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1579cb3a9965..c6b3059d0c37 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
 2004-12-08  Nathan Sidwell  <nathan@codesourcery.com>
 
+	PR c++/18672
+	* gimplify.c (canonicalize_addr_expr): Cope with array of
+	incomplete type.
+	(gimplify_conversion): Remove redundant checks.
+
 	* doc/trouble.texi (Non-bugs): Clarify empty loop removal.
 
 2004-12-08  Uros Bizjak  <uros@kss-loka.si>
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 41814a7fddf3..0b83d78fd43e 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1336,7 +1336,8 @@ canonicalize_addr_expr (tree *expr_p)
     return;
 
   /* The lower bound and element sizes must be constant.  */
-  if (TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
+  if (!TYPE_SIZE_UNIT (dctype)
+      || TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
     return;
@@ -1356,16 +1357,15 @@ canonicalize_addr_expr (tree *expr_p)
 static enum gimplify_status
 gimplify_conversion (tree *expr_p)
 {
-  /* If we still have a conversion at the toplevel, then strip
-     away all but the outermost conversion.  */
-  if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
-    {
-      STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
-
-      /* And remove the outermost conversion if it's useless.  */
-      if (tree_ssa_useless_type_conversion (*expr_p))
-	*expr_p = TREE_OPERAND (*expr_p, 0);
-    }
+  gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
+	      || TREE_CODE (*expr_p) == CONVERT_EXPR);
+  
+  /* Then strip away all but the outermost conversion.  */
+  STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
+
+  /* And remove the outermost conversion if it's useless.  */
+  if (tree_ssa_useless_type_conversion (*expr_p))
+    *expr_p = TREE_OPERAND (*expr_p, 0);
 
   /* If we still have a conversion at the toplevel,
      then canonicalize some constructs.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eac55dfa82dc..05276095c7ef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2004-12-08  Nathan Sidwell  <nathan@codesourcery.com>
 
+	PR c++/18672
+	* g++.dg/opt/array1.C: New.
+	
 	PR c++/18803
 	* g++.dg/template/operator5.C: New.
 
diff --git a/gcc/testsuite/g++.dg/opt/array1.C b/gcc/testsuite/g++.dg/opt/array1.C
new file mode 100644
index 000000000000..c63ed22c88b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/array1.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Nov 2004 <nathan@codesourcery.com>
+
+// PR 18672:ICE gimplifying incomplete array type.
+// Origin: Magnus Fromreide <gcc@magfr.user.lysator.liu.se>
+
+struct A;
+
+struct D {
+  static A ary[];
+};
+extern A ary[];
+
+void Foo (A const *);
+
+void Bar ()
+{
+  Foo (D::ary);
+  Foo (::ary);
+}
-- 
GitLab