re PR c++/67184 (Missed optimization with C++11 final specifier)
[official-gcc.git] / gcc / testsuite / g++.dg / other / armv7m-1.C
blob6aa686b10cd9b28adfd6794f334663f812fdcfb3
1 /* { dg-do run { target arm*-*-* } } */
2 /* Test Armv7m interrupt routines.  */
3 #include <stdlib.h>
5 #ifdef __ARM_ARCH_7M__
6 void __attribute__((interrupt))
7 foo(void)
9   long long n;
10   long p;
11   asm volatile ("" : "=r" (p) : "0" (&n));
12   if (p & 4)
13     abort ();
14   return;
17 void __attribute__((interrupt))
18 bar(void)
20   throw 42;
23 int main()
25   int a;
26   int before;
27   int after;
28   volatile register int sp asm("sp");
30   asm volatile ("mov %0, sp\n"
31                 "blx %2\n"
32                 "mov %1, sp\n"
33                 : "=&r" (before), "=r" (after) : "r" (foo)
34                 : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
35   if (before != after)
36     abort();
37   asm volatile ("mov %0, sp\n"
38                 "sub sp, sp, #4\n"
39                 "blx %2\n"
40                 "add sp, sp, #4\n"
41                 "mov %1, sp\n"
42                 : "=&r" (before), "=r" (after) : "r" (foo)
43                 : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
44   if (before != after)
45     abort();
46   before = sp;
47   try
48     {
49       bar();
50     }
51   catch (int i)
52     {
53       if (i != 42)
54         abort();
55     }
56   catch (...)
57     {
58       abort();
59     }
60   if (before != sp)
61     abort();
62   exit(0);
64 #else
65 int main()
67   exit (0);
69 #endif