annotate gcc/testsuite/gdc.test/compilable/test7815.d @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // REQUIRED_ARGS: -o-
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 /*
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 TEST_OUTPUT:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 ---
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 ---
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 mixin template Helpers()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 static if (is(Flags!Move))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 Flags!Move flags;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 pragma(msg, "X: ", __traits(derivedMembers, Flags!Move));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 template Flags(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 mixin({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 int defs = 1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 foreach (name; __traits(derivedMembers, Move))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 defs++;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 if (defs)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 return "struct Flags { bool x; }";
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 return "";
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 }());
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 struct Move
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 int a;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 mixin Helpers!();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 enum a7815 = Move.init.flags;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 /+
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 This originally was an invalid case:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 When the Move struct member is analyzed:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 1. mixin Helpers!() is instantiated.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 2. In Helpers!(), static if and its condition is(Flags!Move)) evaluated.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 3. In Flags!Move, string mixin evaluates and CTFE lambda.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 4. __traits(derivedMembers, Move) tries to see the member of Move.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 4a. mixin Helpers!() member is analyzed.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 4b. `static if (is(Flags!Move))` in Helpers!() is evaluated
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 4c. The Flags!Move instantiation is already in progress, so it cannot be resolved.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 4d. `static if` fails because Flags!Move cannot be determined as a type.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 5. __traits(derivedMembers, Move) returns a 1-length tuple("a").
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 6. The lambda in Flags!Move returns a string "struct Flags {...}", then
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 Flags!Move is instantiated to a new struct Flags.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 7. Finally Move struct does not have flags member, then the `enum a7815`
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 definition will fail in its initializer.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 Now, static if will behave like a string mixin: it is invisible during its own expansion.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 +/