Merged revisions 208012,208018-208019,208021,208023-208030,208033,208037,208040-20804...
[official-gcc.git] / main / gcc / testsuite / g++.dg / abi / regparm1.C
blobc4710464acc2748bc2b07b18db23218ec3834d8d
1 // PR c++/29911 (9381)
2 // { dg-do run { target i?86-*-* x86_64-*-* } }
3 // { dg-require-effective-target c++11 }
5 extern "C" int printf(const char *, ...);
7 void *save_this;
8 int *save_addr1, *save_addr2;
10 int fail;
12 struct Base
14   __attribute((regparm(3))) void
15   set(int *addr1, int *addr2)
16   {
17     if (this != save_this)
18       {
19         ++fail;
20         printf("error! this == %p, should be %p\n", this, save_this);
21       }
22     if (addr1 != save_addr1)
23       {
24         ++fail;
25         printf("error! addr1 == %p, should be %p\n", addr1, save_addr1);
26       }
27     if (addr2 != save_addr2)
28       {
29         ++fail;
30         printf("error! addr2 == %p, should be %p\n", addr2, save_addr1);
31       }
32   }
35 int main()
37   void (__attribute((regparm(3))) Base::* pfm)(int *, int *) = &Base::set;
38   __typeof (&Base::set) pfm2 = &Base::set;
39   decltype (&Base::set) pfm3 = &Base::set;
40   auto pfm4 = &Base::set;
42   Base obj; save_this = &obj;
43   int x, y; save_addr1 = &x; save_addr2 = &y;
45   (obj.* pfm) (&x, &y);
46   (obj.* pfm2) (&x, &y);
47   (obj.* pfm3) (&x, &y);
48   (obj.* pfm4) (&x, &y);
50   return fail;