comparison 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
comparison
equal deleted inserted replaced
111:04ced10e8804 131:84e7813d76e9
1 // Bug c++/83871 - wrong code due to attributes on distinct template
2 // specializations
3 // Test to verify that an explicit template specifialization does not
4 // "inherit" attributes always_inline or noinline from a primary template
5 // declared with either. The test disables optimization to verify that
6 // always_inline forces inlining.
7 // { dg-do compile }
8 // { dg-options "-O0 -Wall -fdump-tree-optimized" }
9
10 enum Special { };
11
12 template <class T>
13 inline void __attribute__ ((always_inline))
14 falways_inline_none ()
15 {
16 // Primary template should always be inlined, even without optimization.
17 asm (""); // induce a no-op "side-effect"
18 }
19
20 template <>
21 inline void
22 falways_inline_none<Special>()
23 {
24 // The specialization should not be inlined without optimization, even
25 // though it's declared inline.
26 asm ("");
27 }
28
29 // Verify that a call to the primary is inlined but one to
30 // the explicit specialization is not.
31
32 void test_elim_primary_1 (void)
33 {
34 // Should be inlined.
35 falways_inline_none<void>();
36 // { dg-final { scan-tree-dump-not "falways_inline_none<void> *\\(\\)" "optimized" } }
37 }
38
39 void test_keep_special_1 (void)
40 {
41 // Should not be inlined.
42 falways_inline_none<Special>();
43 // { dg-final { scan-tree-dump-times "falways_inline_none<Special> *\\(\\);" 1 "optimized" } }
44 }
45
46
47 template <class T>
48 inline void __attribute__ ((always_inline))
49 falways_inline_noinline ()
50 {
51 asm (""); // induce a no-op "side-effect"
52 }
53
54 template <>
55 void __attribute__ ((noinline))
56 falways_inline_noinline<Special>() { asm (""); }
57
58 // Verify that a call to the primary is inlined but one to
59 // the explicit specialization is not.
60
61 void test_elim_primary_2 (void)
62 {
63 falways_inline_noinline<void>();
64 // { dg-final { scan-tree-dump-not "falways_inline_noinline<void> *\\(\\)" "optimized" } }
65 }
66
67 void test_keep_special_2 (void)
68 {
69 falways_inline_noinline<Special>();
70 // { dg-final { scan-tree-dump-times "falways_inline_noinline<Special> *\\(\\);" 1 "optimized" } }
71 }
72
73
74 template <class T>
75 inline void
76 fnone_always_inline ()
77 {
78 asm (""); // induce a no-op "side-effect"
79 }
80
81 template <>
82 inline void __attribute__ ((always_inline))
83 fnone_always_inline<Special>() { asm (""); }
84
85 // Verify that a call to the primary is not inlined but one to
86 // the explicit specialization is.
87
88 void test_keep_primary_3 (void)
89 {
90 fnone_always_inline<void>();
91 // { dg-final { scan-tree-dump-times "fnone_always_inline<void> *\\(\\);" 1 "optimized" } }
92 }
93
94 void test_elim_special_3 (void)
95 {
96 fnone_always_inline<Special>();
97 // { dg-final { scan-tree-dump-not "fnone_always_inline<Special> *\\(\\);" "optimized" } }
98 }
99
100
101 template <class T>
102 void __attribute__ ((noinline))
103 fnoinline_always_inline ()
104 {
105 asm (""); // induce a no-op "side-effect"
106 }
107
108 template <>
109 inline void __attribute__ ((always_inline))
110 fnoinline_always_inline<Special>() // { dg-bogus "follows declaration" }
111 {
112 asm ("");
113 }
114
115 // Verify that a call to the primary is not inlined but one to
116 // the explicit specialization is.
117
118 void test_keep_primary_4 (void)
119 {
120 fnoinline_always_inline<void>();
121 // { dg-final { scan-tree-dump-times "fnoinline_always_inline<void> *\\(\\);" 1 "optimized" } }
122 }
123
124 void test_elim_special_4 (void)
125 {
126 fnoinline_always_inline<Special>();
127 // { dg-final { scan-tree-dump-not "fnoinline_always_inline<Special> *\\(\\);" "optimized" } }
128 }