llvm::DIType T = getCompletedTypeOrNull(Ty);
- if (T.Verify())
+ if (T.Verify()) {
+ // If we're looking for a definition, make sure we have definitions of any
+ // underlying types.
+ if (const TypedefType* TTy = dyn_cast<TypedefType>(Ty))
+ getOrCreateType(TTy->getDecl()->getUnderlyingType(), Unit, Declaration);
+ if (Ty.hasLocalQualifiers())
+ getOrCreateType(QualType(Ty.getTypePtr(), 0), Unit, Declaration);
return T;
+ }
// Otherwise create the type.
llvm::DIType Res = CreateTypeNode(Ty, Unit, Declaration);
--- /dev/null
+// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s
+
+namespace PR16214_1 {
+// CHECK: [[PR16214_1:![0-9]*]] = {{.*}} [ DW_TAG_namespace ] [PR16214_1]
+// CHECK: = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[PR16214_1]], {{.*}} ; [ DW_TAG_structure_type ] [foo] {{.*}} [def]
+struct foo {
+ int i;
+};
+
+typedef foo bar;
+
+bar *f;
+bar g;
+}