changeset 1401:e2cf1f67ca33

Don't print the entire declaration of the alliassee when `->toChars()` is called on an `AliasDeclaration`; just printing the name will do. This fixes #305, which otherwise tries to generate {{{ class E { void A() { alias /* recurse into E->toCBuffer() */ m; } } }}} by way of an infinite recursion (causing a segfault when the stack runs out).
author Frits van Bommel <fvbommel wxs.nl>
date Wed, 20 May 2009 16:20:59 +0200
parents 4100c49b753f
children 1311dabc6a1f
files dmd/declaration.c gen/toir.cpp tests/mini/compile_bug305.d
diffstat 3 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/declaration.c	Tue May 19 22:35:08 2009 +0200
+++ b/dmd/declaration.c	Wed May 20 16:20:59 2009 +0200
@@ -575,7 +575,7 @@
     {
 	if (haliassym)
 	{
-	    haliassym->toCBuffer(buf, hgs);
+	    buf->writestring(haliassym->toChars());
 	    buf->writeByte(' ');
 	    buf->writestring(ident->toChars());
 	}
@@ -587,7 +587,7 @@
     {
 	if (aliassym)
 	{
-	    aliassym->toCBuffer(buf, hgs);
+	    buf->writestring(aliassym->toChars());
 	    buf->writeByte(' ');
 	    buf->writestring(ident->toChars());
 	}
--- a/gen/toir.cpp	Tue May 19 22:35:08 2009 +0200
+++ b/gen/toir.cpp	Wed May 20 16:20:59 2009 +0200
@@ -1774,7 +1774,7 @@
         condty->ty == Tclass &&
         !((TypeClass*)condty)->sym->isInterfaceDeclaration())
     {
-        Logger::print("calling class invariant");
+        Logger::println("calling class invariant");
         llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_invariant");
         LLValue* arg = DtoBitCast(cond->getRVal(), fn->getFunctionType()->getParamType(0));
         gIR->CreateCallOrInvoke(fn, arg);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mini/compile_bug305.d	Wed May 20 16:20:59 2009 +0200
@@ -0,0 +1,7 @@
+module bug305;
+
+class E {
+    void A() {
+        alias E m;
+    }
+}