1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2008-2017 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 #include <string.h> 19 20 struct s 21 { 22 int a; 23 int *b; 24 }; 25 26 struct ss 27 { 28 struct s a; 29 struct s b; 30 }; 31 32 struct arraystruct 33 { 34 int y; 35 struct s x[2]; 36 }; 37 38 struct ns { 39 const char *null_str; 40 int length; 41 }; 42 43 struct lazystring { 44 const char *lazy_str; 45 /* If -1, don't pass length to gdb.lazy_string(). */ 46 int len; 47 }; 48 49 struct hint_error { 50 int x; 51 }; 52 53 struct children_as_list { 54 int x; 55 }; 56 57 #ifdef __cplusplus 58 struct S : public s { 59 int zs; 60 }; 61 62 struct SS { 63 int zss; 64 S s; 65 }; 66 67 struct SSS 68 { 69 SSS (int x, const S& r); 70 int a; 71 const S &b; 72 }; 73 SSS::SSS (int x, const S& r) : a(x), b(r) { } 74 75 class VirtualTest 76 { 77 private: 78 int value; 79 80 public: 81 VirtualTest () 82 { 83 value = 1; 84 } 85 }; 86 87 class Vbase1 : public virtual VirtualTest { }; 88 class Vbase2 : public virtual VirtualTest { }; 89 class Vbase3 : public virtual VirtualTest { }; 90 91 class Derived : public Vbase1, public Vbase2, public Vbase3 92 { 93 private: 94 int value; 95 96 public: 97 Derived () 98 { 99 value = 2; 100 } 101 }; 102 103 class Fake 104 { 105 int sname; 106 107 public: 108 Fake (const int name = 0): 109 sname (name) 110 { 111 } 112 }; 113 #endif 114 115 struct substruct { 116 int a; 117 int b; 118 }; 119 120 struct outerstruct { 121 struct substruct s; 122 int x; 123 }; 124 125 struct outerstruct 126 substruct_test (void) 127 { 128 struct outerstruct outer; 129 outer.s.a = 0; 130 outer.s.b = 0; 131 outer.x = 0; 132 133 outer.s.a = 3; /* MI outer breakpoint here */ 134 135 return outer; 136 } 137 138 typedef struct string_repr 139 { 140 struct whybother 141 { 142 const char *contents; 143 } whybother; 144 } string; 145 146 /* This lets us avoid malloc. */ 147 int array[100]; 148 int narray[10]; 149 150 struct justchildren 151 { 152 int len; 153 int *elements; 154 }; 155 156 typedef struct justchildren nostring_type; 157 158 struct memory_error 159 { 160 const char *s; 161 }; 162 163 struct container 164 { 165 string name; 166 int len; 167 int *elements; 168 }; 169 170 typedef struct container zzz_type; 171 172 string 173 make_string (const char *s) 174 { 175 string result; 176 result.whybother.contents = s; 177 return result; 178 } 179 180 zzz_type 181 make_container (const char *s) 182 { 183 zzz_type result; 184 185 result.name = make_string (s); 186 result.len = 0; 187 result.elements = 0; 188 189 return result; 190 } 191 192 void 193 add_item (zzz_type *c, int val) 194 { 195 if (c->len == 0) 196 c->elements = array; 197 c->elements[c->len] = val; 198 ++c->len; 199 } 200 201 void 202 set_item(zzz_type *c, int i, int val) 203 { 204 if (i < c->len) 205 c->elements[i] = val; 206 } 207 208 void init_s(struct s *s, int a) 209 { 210 s->a = a; 211 s->b = &s->a; 212 } 213 214 void init_ss(struct ss *s, int a, int b) 215 { 216 init_s(&s->a, a); 217 init_s(&s->b, b); 218 } 219 220 void do_nothing(void) 221 { 222 int c; 223 224 c = 23; /* Another MI breakpoint */ 225 } 226 227 struct nullstr 228 { 229 char *s; 230 }; 231 232 struct string_repr string_1 = { { "one" } }; 233 struct string_repr string_2 = { { "two" } }; 234 235 int 236 eval_func (int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) 237 { 238 return p1; 239 } 240 241 static void 242 eval_sub (void) 243 { 244 struct eval_type_s { int x; } eval1 = { 1 }, eval2 = { 2 }, eval3 = { 3 }, 245 eval4 = { 4 }, eval5 = { 5 }, eval6 = { 6 }, 246 eval7 = { 7 }, eval8 = { 8 }, eval9 = { 9 }; 247 248 eval1.x++; /* eval-break */ 249 } 250 251 static void 252 bug_14741() 253 { 254 zzz_type c = make_container ("bug_14741"); 255 add_item (&c, 71); 256 set_item(&c, 0, 42); /* breakpoint bug 14741 */ 257 set_item(&c, 0, 5); 258 } 259 260 int 261 main () 262 { 263 struct ss ss; 264 struct ss ssa[2]; 265 struct arraystruct arraystruct; 266 string x = make_string ("this is x"); 267 zzz_type c = make_container ("container"); 268 zzz_type c2 = make_container ("container2"); 269 const struct string_repr cstring = { { "const string" } }; 270 /* Clearing by being `static' could invoke an other GDB C++ bug. */ 271 struct nullstr nullstr; 272 nostring_type nstype, nstype2; 273 struct memory_error me; 274 struct ns ns, ns2; 275 struct lazystring estring, estring2, estring3; 276 struct hint_error hint_error; 277 struct children_as_list children_as_list; 278 279 nstype.elements = narray; 280 nstype.len = 0; 281 282 me.s = "blah"; 283 284 init_ss(&ss, 1, 2); 285 init_ss(ssa+0, 3, 4); 286 init_ss(ssa+1, 5, 6); 287 memset (&nullstr, 0, sizeof nullstr); 288 289 arraystruct.y = 7; 290 init_s (&arraystruct.x[0], 23); 291 init_s (&arraystruct.x[1], 24); 292 293 ns.null_str = "embedded\0null\0string"; 294 ns.length = 20; 295 296 /* Make a "corrupted" string. */ 297 ns2.null_str = NULL; 298 ns2.length = 20; 299 300 estring.lazy_str = "embedded x\201\202\203\204"; 301 estring.len = -1; 302 303 /* Incomplete UTF-8, but ok Latin-1. */ 304 estring2.lazy_str = "embedded x\302"; 305 estring2.len = -1; 306 307 estring3.lazy_str = NULL; 308 estring3.len = 42; 309 310 #ifdef __cplusplus 311 S cps; 312 313 cps.zs = 7; 314 init_s(&cps, 8); 315 316 SS cpss; 317 cpss.zss = 9; 318 init_s(&cpss.s, 10); 319 320 SS cpssa[2]; 321 cpssa[0].zss = 11; 322 init_s(&cpssa[0].s, 12); 323 cpssa[1].zss = 13; 324 init_s(&cpssa[1].s, 14); 325 326 SSS sss(15, cps); 327 328 SSS& ref (sss); 329 330 Derived derived; 331 332 Fake fake (42); 333 #endif 334 335 add_item (&c, 23); /* MI breakpoint here */ 336 add_item (&c, 72); 337 338 #ifdef MI 339 add_item (&c, 1011); 340 c.elements[0] = 1023; 341 c.elements[0] = 2323; 342 343 add_item (&c2, 2222); 344 add_item (&c2, 3333); 345 346 substruct_test (); 347 do_nothing (); 348 #endif 349 350 nstype.elements[0] = 7; 351 nstype.elements[1] = 42; 352 nstype.len = 2; 353 354 nstype2 = nstype; 355 356 eval_sub (); 357 358 bug_14741(); /* break to inspect struct and union */ 359 return 0; 360 } 361