annotate gcc/testsuite/g++.dg/ext/attr-noreturn.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" attribute noreturn from a primary template declared with
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 // one.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 // { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 // { dg-options "-O -Wall -fdump-tree-optimized" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 struct Noreturn { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 struct Returns { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 // Primary declared noreturn but explicit specialization is not.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 template <class T> int __attribute__ ((noreturn)) f ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 template <> int f<Returns>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 // Explicit specialization is noreturn but primary is not.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 template <class T> int g ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 template <> int __attribute__ ((noreturn)) g<Noreturn>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 int val;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 int test_primary_noreturn (char, short)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 // Only the first call should be emitted, the second one should
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 // be eliminated because the first one doesn't return.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 val = f<char>() + f<short>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 } // expect no -Wreturn-type warning here
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 int test_noreturn (int)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 // Call should be retained.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 f<int>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 } // expect no -Wreturn-type warning here
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 int test_special_return (int)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 // Both calls must be emitted.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 int val = f<Returns>() + f<Returns>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 (void)&val;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 } // { dg-warning "no return statement in function returning non-void" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 int test_primary_return (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 int val = g<char>() + g<int>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 (void)&val;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 } // { dg-warning "no return statement in function returning non-void" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 int test_special_noreturn (int, long)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 g<Noreturn>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 } // expect no -Wreturn-type warning here
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 // Verify that the call to f<short>() above is eliminated but the call
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 // to f<int>() and the two calls to f<Returns>() are retained.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 // { dg-final { scan-tree-dump-not "f<short>" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 // { dg-final { scan-tree-dump-times "f<Returns>" 2 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 // Verify that the second call to f<Returns>() in test_special_return()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 // is followed by __builtin_unreachable() because there is no return
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 // statement in the function.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 // { dg-final { scan-tree-dump-times "f<Returns> \\(\\);\[\n\r \]+__builtin_unreachable" 1 "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 // Verify that the call to g<short>() above is eliminated but the call
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 // to g<char>() and to g<Noreturn>() are both retained.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 // { dg-final { scan-tree-dump-not "g<short>" "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 // { dg-final { scan-tree-dump-times "g<char>" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 // { dg-final { scan-tree-dump-times "g<Noreturn>" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 // Verify that the call to g<int>() in test_primary_return() is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 // followed by __builtin_unreachable() because there is no return
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 // statement in the function.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 // { dg-final { scan-tree-dump-times "g<int> *\\(\\);\[\n\r \]+__builtin_unreachable" 1 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 // Verify that the call to g<Noreturn>() in test_special_noreturn()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 // is not followed by __builtin_unreachable() even though there is no
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 // return statement in the function.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 // { dg-final { scan-tree-dump-times "g<Noreturn> *\\(\\);\[\n\r \]+__builtin_unreachable" 0 "optimized" } }