annotate gcc/testsuite/g++.dg/ext/attr-noinline.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. The test disables optimization to verify that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 // always_inline forces inlining.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 // { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 // { dg-options "-O0 -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 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 falways_inline_none ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 // Primary template should always be inlined, even without optimization.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 asm (""); // induce a no-op "side-effect"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 template <>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 inline void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 falways_inline_none<Special>()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 // The specialization should not be inlined without optimization, even
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 // though it's declared inline.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 asm ("");
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_none<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 // { dg-final { scan-tree-dump-not "falways_inline_none<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_none<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 // { dg-final { scan-tree-dump-times "falways_inline_none<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 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 falways_inline_noinline ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 asm (""); // induce a no-op "side-effect"
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 void __attribute__ ((noinline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 falways_inline_noinline<Special>() { asm (""); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 // Verify that a call to the primary is inlined but one to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 // the explicit specialization is not.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 void test_elim_primary_2 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 falways_inline_noinline<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 // { dg-final { scan-tree-dump-not "falways_inline_noinline<void> *\\(\\)" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 void test_keep_special_2 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 falways_inline_noinline<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 // { dg-final { scan-tree-dump-times "falways_inline_noinline<Special> *\\(\\);" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 inline void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 fnone_always_inline ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 asm (""); // induce a no-op "side-effect"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 template <>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 fnone_always_inline<Special>() { asm (""); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 // Verify that a call to the primary is not inlined but one to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 // the explicit specialization is.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 void test_keep_primary_3 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 fnone_always_inline<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 // { dg-final { scan-tree-dump-times "fnone_always_inline<void> *\\(\\);" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 void test_elim_special_3 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 fnone_always_inline<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 // { dg-final { scan-tree-dump-not "fnone_always_inline<Special> *\\(\\);" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 void __attribute__ ((noinline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 fnoinline_always_inline ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 asm (""); // induce a no-op "side-effect"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 template <>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 inline void __attribute__ ((always_inline))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 fnoinline_always_inline<Special>() // { dg-bogus "follows declaration" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 asm ("");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 // Verify that a call to the primary is not inlined but one to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 // the explicit specialization is.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 void test_keep_primary_4 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 fnoinline_always_inline<void>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 // { dg-final { scan-tree-dump-times "fnoinline_always_inline<void> *\\(\\);" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 void test_elim_special_4 (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 fnoinline_always_inline<Special>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 // { dg-final { scan-tree-dump-not "fnoinline_always_inline<Special> *\\(\\);" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 }