Viewing file: array16.C (1.64 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// Causes timeout for the MMIX simulator on a 3GHz P4 and we can't // have "compile" for some targets and "run" for others. // { dg-do run { target { ! mmix-*-* } } }
// Copyright (C) 2004 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com>
// PR 16681 too much memory used // Origin: Matt LaFary <lafary@activmedia.com>
// NOTE: This test assumes that 4M instances of struct ELT can fit into // a 5MB array.
struct elt { static int count; static elt*ptr; static int abort; char c; elt (); ~elt (); };
int elt::count; elt *elt::ptr; int elt::abort;
elt::elt () :c () { if (count >= 0) { if (!ptr) ptr = this; if (count == 100) throw 2; if (this != ptr) abort = 1; count++; ptr++; } }
elt::~elt () { if (count >= 0) { ptr--; count--; if (ptr != this) abort = 2; } }
struct foo { elt buffer[4111222]; foo() ; bool check () const; };
foo::foo () : buffer() {}
bool foo::check () const { for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;) if (buffer[ix].c) return false; return true; }
void *operator new (__SIZE_TYPE__ size, void *p) { return p; }
char heap[5000000];
int main () { for (unsigned ix = sizeof (heap); ix--;) heap[ix] = ix;
try { foo *f = new (heap) foo (); return 1; } catch (...) { if (elt::count) return 2; if (elt::abort) return elt::abort + 3; }
for (unsigned ix = sizeof (heap); ix--;) heap[ix] = ix;
elt::count = -1; foo *f = new (heap) foo (); if (!f->check ()) return 3; return 0; }
|