diff options
author | Richard Guenther <rguenther@suse.de> | 2008-01-21 09:34:19 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-01-21 09:34:19 +0000 |
commit | 02dcf7badb93cc064051e6719746293987eeb662 (patch) | |
tree | 6f554d4813d2c8677f8ccb321f6fad2ad910ca4e /gcc | |
parent | b158b5c6aa0a3773622552c165ee88ebc31ab004 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/error.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr34850.C | 74 |
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()); +} |