1*67e74705SXin Li
2*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "PR16214",{{.*}} line: [[@LINE+2]],{{.*}}
3*67e74705SXin Li // CHECK-NOT: DIFlagFwdDecl
4*67e74705SXin Li struct PR16214 {
5*67e74705SXin Li int i;
6*67e74705SXin Li };
7*67e74705SXin Li
8*67e74705SXin Li typedef PR16214 bar;
9*67e74705SXin Li
10*67e74705SXin Li bar *a;
11*67e74705SXin Li bar b;
12*67e74705SXin Li
13*67e74705SXin Li namespace PR14467 {
14*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo",{{.*}} line: [[@LINE+2]],{{.*}}
15*67e74705SXin Li // CHECK-NOT: DIFlagFwdDecl
16*67e74705SXin Li struct foo {
17*67e74705SXin Li };
18*67e74705SXin Li
bar(foo * a)19*67e74705SXin Li foo *bar(foo *a) {
20*67e74705SXin Li foo *b = new foo(*a);
21*67e74705SXin Li return b;
22*67e74705SXin Li }
23*67e74705SXin Li }
24*67e74705SXin Li
25*67e74705SXin Li namespace test1 {
26*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo",{{.*}} line: [[@LINE+1]],{{.*}} flags: DIFlagFwdDecl
27*67e74705SXin Li struct foo {
28*67e74705SXin Li };
29*67e74705SXin Li
30*67e74705SXin Li extern int bar(foo *a);
baz(foo * a)31*67e74705SXin Li int baz(foo *a) {
32*67e74705SXin Li return bar(a);
33*67e74705SXin Li }
34*67e74705SXin Li }
35*67e74705SXin Li
36*67e74705SXin Li namespace test2 {
37*67e74705SXin Li // FIXME: if we were a bit fancier, we could realize that the 'foo' type is only
38*67e74705SXin Li // required because of the 'bar' type which is not required at all (or might
39*67e74705SXin Li // only be required to be declared)
40*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo",{{.*}} line: [[@LINE+2]],{{.*}}
41*67e74705SXin Li // CHECK-NOT: DIFlagFwdDecl
42*67e74705SXin Li struct foo {
43*67e74705SXin Li };
44*67e74705SXin Li
45*67e74705SXin Li struct bar {
46*67e74705SXin Li foo f;
47*67e74705SXin Li };
48*67e74705SXin Li
func()49*67e74705SXin Li void func() {
50*67e74705SXin Li foo *f;
51*67e74705SXin Li }
52*67e74705SXin Li }
53