1// PR sanitizer/65004 2// { dg-do compile } 3// { dg-options "-fcompare-debug -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all" } 4 5namespace N { 6 template <typename Signature> struct function; 7 namespace detail { 8 namespace function { 9 struct vtable_base { }; 10 } 11 } 12 struct function_base { 13 detail::function::vtable_base * vtable; 14 }; 15 template <typename R, typename T0> struct function1 : public function_base { }; 16 template <typename R, typename T0> struct function <R (T0)> : public function1 <R, T0> { }; 17} 18namespace Bar { 19 typedef N::function <void (const char *)> WarningHandler; 20} 21namespace Foo { 22 struct FooRecord { 23 virtual ~FooRecord (); 24 }; 25 struct TestRecord : public FooRecord { 26 long x; 27 }; 28} 29namespace Foo { 30 using Bar::WarningHandler; 31 struct FooScanner { 32 WarningHandler warnHandler; 33 int readByte (); 34 long readSignedInteger (); 35 }; 36 struct FooRecordReader { 37 FooScanner & scanner; 38 long readSInt (); 39 void readTestRecord (TestRecord * recp); 40 }; 41 inline long FooRecordReader::readSInt () { 42 return scanner.readSignedInteger (); 43 } 44 void FooRecordReader::readTestRecord (TestRecord * recp) { 45 int infoByte = scanner.readByte (); 46 recp->x = readSInt (); 47 } 48} 49