aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/expr/cond18.C
blob: 326985eed506255bce33fa0f3682b7975f3f39c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* PR c++/114525 */
/* { dg-do run } */

struct Foo {
  int x;
};

Foo& get (Foo& v) {
  return v;
}

int main () {
  bool cond = true;

  /* Testcase from PR; v.x would wrongly remain equal to 1.  */
  Foo v_ko;
  v_ko.x = 1;
  (cond ? get (v_ko) : get (v_ko)).*(&Foo::x) = 2;
  if (v_ko.x != 2)
    __builtin_abort ();

  /* Those would already work, i.e. x be changed to 2.  */
  Foo v_ok_1;
  v_ok_1.x = 1;
  (cond ? get (v_ok_1) : get (v_ok_1)).x = 2;
  if (v_ok_1.x != 2)
    __builtin_abort ();

  Foo v_ok_2;
  v_ok_2.x = 1;
  get (v_ok_2).*(&Foo::x) = 2;
  if (v_ok_2.x != 2)
    __builtin_abort ();

  return 0;
}