summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ir/comp.rs15
-rw-r--r--src/ir/ty.rs1
2 files changed, 12 insertions, 4 deletions
diff --git a/src/ir/comp.rs b/src/ir/comp.rs
index 2711c3cf..91593b79 100644
--- a/src/ir/comp.rs
+++ b/src/ir/comp.rs
@@ -975,6 +975,17 @@ impl Trace for CompInfo {
tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition);
}
+ for &ty in self.inner_types() {
+ tracer.visit_kind(ty, EdgeKind::InnerType);
+ }
+
+ // We unconditionally trace `CompInfo`'s template parameters and inner
+ // types for the the usage analysis. However, we don't want to continue
+ // tracing anything else, if this type is marked opaque.
+ if item.is_opaque(context) {
+ return;
+ }
+
for base in self.base_members() {
tracer.visit_kind(base.ty, EdgeKind::BaseMember);
}
@@ -983,10 +994,6 @@ impl Trace for CompInfo {
tracer.visit_kind(field.ty(), EdgeKind::Field);
}
- for &ty in self.inner_types() {
- tracer.visit_kind(ty, EdgeKind::InnerType);
- }
-
for &var in self.inner_vars() {
tracer.visit_kind(var, EdgeKind::InnerVar);
}
diff --git a/src/ir/ty.rs b/src/ir/ty.rs
index 9fabf980..c3f26572 100644
--- a/src/ir/ty.rs
+++ b/src/ir/ty.rs
@@ -345,6 +345,7 @@ impl Type {
/// item, so we can arrive to the proper item that needs to be generated.
pub fn should_be_traced_unconditionally(&self) -> bool {
match self.kind {
+ TypeKind::Comp(..) |
TypeKind::Function(..) |
TypeKind::Pointer(..) |
TypeKind::Array(..) |