e4f6600eab2c12652242a9e4fee20772afcb4747
[openbsd] /
1 // This is a reproducer for a crash in codegen. It happens when we have a
2 // RecordDecl used in an expression and one of the FieldDecl are not complete.
3 // This case happens when:
4 // - A RecordDecl (E) has a FieldDecl which is a reference member variable
5 // - The underlying type of the FieldDec is a TypedefDecl
6 // - The typedef refers to a ClassTemplateSpecialization (DWrapper)
7 // - The typedef is not present in the DeclContext of B
8 // - The typedef shows up as a return value of a member function of E (f())
9 template <typename T> struct DWrapper {};
10
11 struct D {};
12
13 namespace NS {
14 typedef DWrapper<D> DW;
15 }
16
17 struct B {
18   NS::DW spd;
19   int a = 0;
20 };
21
22 struct E {
23   E(B &b) : b_ref(b) {}
24   NS::DW f() { return {}; };
25   void g() {
26     return; //%self.expect("p b_ref", substrs=['(B) $0 =', '(spd = NS::DW', 'a = 0)'])
27   }
28
29   B &b_ref;
30 };
31
32 int main() {
33   B b;
34   E e(b);
35
36   e.g();
37
38   return 0;
39 }