annotate gcc/testsuite/g++.dg/ext/attr-noinline-2.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // Bug c++/83871 - wrong code due to attributes on distinct template
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // specializations
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 // Test to verify that an explicit template specifialization does not
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 // "inherit" attributes always_inline or noinline from a primary template
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 // declared with either. Unlike attr-noinline.C, this test enables
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 // optimization to verify that noinline prevents inlining.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 // { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 // { dg-options "-O2 -Wall -fdump-tree-optimized" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 enum Special { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 int global;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 falways_inline_noinline ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 // Create a side-effect that's unique to this function.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 global = __LINE__;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 template <>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 void __attribute__ ((noinline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 falways_inline_noinline<Special>()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 global = __LINE__;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 // Verify that a call to the primary is inlined but one to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 // the explicit specialization is not.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 void test_elim_primary_1 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 // Should be inlined.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 falways_inline_noinline<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 // { dg-final { scan-tree-dump-not "falways_inline_noinline<void> *\\(\\)" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 void test_keep_special_1 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 // Should not be inlined.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 falways_inline_noinline<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 // { dg-final { scan-tree-dump-times "falways_inline_noinline<Special> *\\(\\);" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 void __attribute__ ((noinline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 fnoinline_always_inline ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 global = __LINE__;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 template <>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 fnoinline_always_inline<Special>() // { dg-bogus "follows declaration" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 global = __LINE__;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 void test_keep_primary_2 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 // Should not be inlined.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 fnoinline_always_inline<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 // { dg-final { scan-tree-dump-times "fnoinline_always_inline<void> *\\(\\);" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 void test_elim_special_2 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 // Should be inlined.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 fnoinline_always_inline<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 // { dg-final { scan-tree-dump-not "fnoinline_always_inline<Special> *\\(\\);" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 }