From ecd8a2ac07033fc8f4d4ec8b4aaae1f5a0bd19d3 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Mon, 6 Oct 2008 14:06:55 +0200 Subject: [PATCH] Support structs that are merely a forward reference. See mini/forwdecl1.d --- gen/structs.cpp | 12 +++++++++--- gen/toir.cpp | 6 +++--- tests/mini/forwdecl1.d | 12 ++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 tests/mini/forwdecl1.d diff --git a/gen/structs.cpp b/gen/structs.cpp index bdaa070a..1c74a104 100644 --- a/gen/structs.cpp +++ b/gen/structs.cpp @@ -131,11 +131,17 @@ void DtoResolveStruct(StructDeclaration* sd) Logger::println("DtoResolveStruct(%s): %s", sd->toChars(), sd->loc.toChars()); LOG_SCOPE; - if (sd->prot() == PROTprivate && sd->getModule() != gIR->dmodule) - Logger::println("using a private struct from outside its module"); - TypeStruct* ts = (TypeStruct*)sd->type->toBasetype(); + // this struct is a forward declaration + // didn't even know had those ... + if (sd->sizeok != 1) + { + sd->ir.irStruct = new IrStruct(ts); + ts->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); + return; + } + bool ispacked = (ts->alignsize() == 1); IrStruct* irstruct = new IrStruct(ts); diff --git a/gen/toir.cpp b/gen/toir.cpp index 1d4d99d1..089615d0 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -129,10 +129,10 @@ DValue* VarExp::toElem(IRState* p) if (vd->isDataseg() || (vd->storage_class & STCextern)) { vd->toObjFile(0); // TODO: multiobj } - if (!vd->ir.isSet() || !vd->ir.getIrValue() || DtoType(vd->type)->isAbstract()) { - error("global variable %s not resolved", vd->toChars()); + if (!vd->ir.isSet() || !vd->ir.getIrValue()) { + error("variable %s not resolved", vd->toChars()); if (Logger::enabled()) - Logger::cout() << "unresolved global had type: " << *DtoType(vd->type) << '\n'; + Logger::cout() << "unresolved variable had type: " << *DtoType(vd->type) << '\n'; fatal(); } if (vd->isDataseg() || (vd->storage_class & STCextern)) { diff --git a/tests/mini/forwdecl1.d b/tests/mini/forwdecl1.d new file mode 100644 index 00000000..c8674067 --- /dev/null +++ b/tests/mini/forwdecl1.d @@ -0,0 +1,12 @@ +struct Foo; + +Foo* foo() +{ + return null; +} + +void main() +{ + Foo* f = foo(); + assert(f is null); +}