1 // { dg-do compile }
2 // { dg-options "-O2 -Warray-bounds" }
3 
4 class String
5 {
6 public:
7   virtual unsigned long length() const = 0;
8   virtual char get(unsigned long index) const = 0;
9   virtual void set(unsigned long index, char value) = 0;
10   virtual char& operator[] (unsigned long value) = 0;
~String()11   virtual ~String() {};
12 };
13 
14 template<unsigned long size> class FixedString : public String
15 {
16 private:
17   char contents[size];
18 
19 public:
length()20   virtual unsigned long length() const { return size; }
get(unsigned long index)21   virtual char get(unsigned long index) const { return contents[index]; }
set(unsigned long index,char value)22   virtual void set(unsigned long index, char value) { contents[index] = value; }
23   virtual char& operator[] (unsigned long index) { return contents[index]; }
24 
FixedString()25   FixedString() { contents[0] = '\0'; } // { dg-warning "above array bounds" }
26 };
27 
28 void print_length (const String& string);
29 
main()30 int main()
31 {
32   const FixedString<0> empty;
33 
34   print_length(empty);
35 
36   return 0;
37 }
38