From: rguenth Date: Mon, 21 Jan 2008 09:34:19 +0000 (+0000) Subject: 2008-01-21 Richard Guenther X-Git-Tag: upstream/4.9.2~44074 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c89421d85768b3dfea9bc1b22a1b52d3533410e2;p=platform%2Fupstream%2Flinaro-gcc.git 2008-01-21 Richard Guenther PR c++/34850 cp/ * error.c (cp_print_error_function): Deal with recursive BLOCK trees. * g++.dg/torture/pr34850.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131690 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + + PR c++/34850 + * error.c (cp_print_error_function): Deal with recursive + BLOCK trees. + 2008-01-20 Paolo Carlini 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 + + PR c++/34850 + * g++.dg/torture/pr34850.C: New testcase. + 2008-01-21 Alon Dayan Olga Golovanevsky 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 class MemoryRegion { +public: + u32bit size() const { + } + const T* begin() const { + } + void set(const T in[], u32bit n) { + create(n); + } + void set(const MemoryRegion& 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 void MemoryRegion::create(u32bit n) { + if(n <= allocated) { + clear(); + } +} +template class SecureVector : public MemoryRegion { +public: + SecureVector& operator=(const MemoryRegion& in) { + if(this != &in) set(in); + } +}; +class OctetString { +public: + SecureVector bits_of() const { + } + OctetString& operator^=(const OctetString&); + void change(const MemoryRegion& in) { + bits = in; + } + OctetString(const MemoryRegion& in) { + change(in); + } + SecureVector 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()); +}