aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-01-21 09:34:19 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-01-21 09:34:19 +0000
commit02dcf7badb93cc064051e6719746293987eeb662 (patch)
tree6f554d4813d2c8677f8ccb321f6fad2ad910ca4e /gcc
parentb158b5c6aa0a3773622552c165ee88ebc31ab004 (diff)
downloadgcc-02dcf7badb93cc064051e6719746293987eeb662.zip
gcc-02dcf7badb93cc064051e6719746293987eeb662.tar.gz
gcc-02dcf7badb93cc064051e6719746293987eeb662.tar.bz2
re PR c++/34850 (Recursive BLOCK tree causes compilation to hang during diagnostics)
2008-01-21 Richard Guenther <rguenther@suse.de> PR c++/34850 cp/ * error.c (cp_print_error_function): Deal with recursive BLOCK trees. * g++.dg/torture/pr34850.C: New testcase. From-SVN: r131690
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/error.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr34850.C74
4 files changed, 88 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7d3e339..768efc5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2008-01-21 Richard Guenther <rguenther@suse.de>
+
+ PR c++/34850
+ * error.c (cp_print_error_function): Deal with recursive
+ BLOCK trees.
+
2008-01-20 Paolo Carlini <pcarlini@suse.de>
PR c++/34891
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 41a83bf..94f108e 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -2424,7 +2424,9 @@ cp_print_error_function (diagnostic_context *context,
{
ao = BLOCK_ABSTRACT_ORIGIN (block);
- while (TREE_CODE (ao) == BLOCK && BLOCK_ABSTRACT_ORIGIN (ao))
+ while (TREE_CODE (ao) == BLOCK
+ && BLOCK_ABSTRACT_ORIGIN (ao)
+ && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
ao = BLOCK_ABSTRACT_ORIGIN (ao);
if (TREE_CODE (ao) == FUNCTION_DECL)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1fda4f9..04ad10c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-21 Richard Guenther <rguenther@suse.de>
+
+ PR c++/34850
+ * g++.dg/torture/pr34850.C: New testcase.
+
2008-01-21 Alon Dayan <alond@il.ibm.com>
Olga Golovanevsky <olga@il.ibm.com>
diff --git a/gcc/testsuite/g++.dg/torture/pr34850.C b/gcc/testsuite/g++.dg/torture/pr34850.C
new file mode 100644
index 0000000..e7caa7b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr34850.C
@@ -0,0 +1,74 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef uint8_t byte;
+typedef uint32_t u32bit;
+typedef unsigned int size_t;
+extern "C" {
+ extern void __warn_memset_zero_len (void) __attribute__((__warning__ ("")));
+ extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__))
+ void * memset (void *__dest, int __ch, size_t __len) throw () {
+ if (__builtin_constant_p (__len) && __len == 0)
+ __warn_memset_zero_len (); /* { dg-warning "" } */
+ }
+}
+inline void clear_mem(void* ptr, u32bit n) {
+ memset(ptr, 0, n);
+}
+template<typename T> class MemoryRegion {
+public:
+ u32bit size() const {
+ }
+ const T* begin() const {
+ }
+ void set(const T in[], u32bit n) {
+ create(n);
+ }
+ void set(const MemoryRegion<T>& in) {
+ set(in.begin(), in.size());
+ }
+ void clear() {
+ clear_mem(buf, allocated);
+ }
+ void create(u32bit);
+ MemoryRegion() {
+ used = allocated = 0;
+ }
+ mutable T* buf;
+ mutable u32bit used;
+ mutable u32bit allocated;
+};
+template<typename T> void MemoryRegion<T>::create(u32bit n) {
+ if(n <= allocated) {
+ clear();
+ }
+}
+template<typename T> class SecureVector : public MemoryRegion<T> {
+public:
+ SecureVector<T>& operator=(const MemoryRegion<T>& in) {
+ if(this != &in) set(in);
+ }
+};
+class OctetString {
+public:
+ SecureVector<byte> bits_of() const {
+ }
+ OctetString& operator^=(const OctetString&);
+ void change(const MemoryRegion<byte>& in) {
+ bits = in;
+ }
+ OctetString(const MemoryRegion<byte>& in) {
+ change(in);
+ }
+ SecureVector<byte> bits;
+};
+OctetString& OctetString::operator^=(const OctetString& k) {
+ if(&k == this) {
+ bits.clear();
+ }
+}
+bool operator==(const OctetString& s1, const OctetString& s2) {
+ return (s1.bits_of() == s2.bits_of());
+}