diff mbox

Fix PR49938

Message ID alpine.LNX.2.00.1108031304300.810@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 3, 2011, 11:05 a.m. UTC
This fixes PR49938 by instead of asserting return chrec_dont_know.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-08-03  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/49938
	* tree-scalar-evolution.c (interpret_loop_phi): Gracefully
	deal with a POLYNOMIAL_CHREC.

	* g++.dg/torture/pr49938.C: New testcase.
diff mbox

Patch

Index: gcc/tree-scalar-evolution.c
===================================================================
--- gcc/tree-scalar-evolution.c	(revision 177242)
+++ gcc/tree-scalar-evolution.c	(working copy)
@@ -1642,8 +1642,8 @@  interpret_loop_phi (struct loop *loop, g
       else if (TREE_CODE (res) == POLYNOMIAL_CHREC)
 	new_init = CHREC_LEFT (res);
       STRIP_USELESS_TYPE_CONVERSION (new_init);
-      gcc_assert (TREE_CODE (new_init) != POLYNOMIAL_CHREC);
-      if (!operand_equal_p (init_cond, new_init, 0))
+      if (TREE_CODE (new_init) == POLYNOMIAL_CHREC
+	  || !operand_equal_p (init_cond, new_init, 0))
 	return chrec_dont_know;
     }
 
Index: gcc/testsuite/g++.dg/torture/pr49938.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr49938.C	(revision 0)
+++ gcc/testsuite/g++.dg/torture/pr49938.C	(revision 0)
@@ -0,0 +1,48 @@ 
+#include <vector>
+#include <cstdlib>
+typedef unsigned short uint16;
+
+namespace base {
+    class StringPiece
+      {
+    public:
+	typedef std::size_t size_type;
+	size_type size() const { return length_; }
+	size_type length_;
+      };
+}
+
+namespace net {
+    class DNSSECKeySet
+      {
+	bool CheckSignature (const base::StringPiece& name, const
+			     base::StringPiece& zone, const
+			     base::StringPiece& signature, uint16 rrtype,
+			     const std::vector<base::StringPiece>& rrdatas);
+      };
+}
+
+template <class C> class scoped_array
+{
+public: typedef C element_type;
+	explicit scoped_array(C* p = __null):array_(p) {}
+private:   C* array_;
+};
+
+namespace net {
+    bool DNSSECKeySet::CheckSignature (const base::StringPiece& name,
+				       const base::StringPiece& zone, const base::StringPiece& signature,
+				       uint16 rrtype, const std::vector<base::StringPiece>& rrdatas)
+      {
+	unsigned signed_data_len = 0;
+	for (std::vector<base::StringPiece>::const_iterator i =
+	     rrdatas.begin();
+	     i != rrdatas.end(); i++) {
+	    signed_data_len += 2;
+	    signed_data_len += i->size();
+	}
+	scoped_array<unsigned char> signed_data(new unsigned
+						char[signed_data_len]);
+      }
+}
+