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()30int main() 31 { 32 const FixedString<0> empty; 33 34 print_length(empty); 35 36 return 0; 37 } 38