changeset 626:e83ba4ae4878

Fix import visibility bugs 313 and 314.
author Christian Kamm <kamm incasoftware de>
date Wed, 01 Oct 2008 19:16:10 +0200
parents 7e0a766fef47
children 79cbe5034fec
files dmd/dsymbol.c dmd/import.c dmd/import.h gen/toobj.cpp
diffstat 4 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/dsymbol.c	Wed Oct 01 19:15:17 2008 +0200
+++ b/dmd/dsymbol.c	Wed Oct 01 19:16:10 2008 +0200
@@ -646,6 +646,11 @@
 
     // Look in symbols declared in this module
     Dsymbol *s = symtab ? symtab->lookup(ident) : NULL;
+
+    // hide private nonlocal symbols
+    if (flags & 1 && s && s->prot() == PROTprivate)
+	s = NULL;
+
     if (s)
     {
 	//printf("\ts = '%s.%s'\n",toChars(),s->toChars());
--- a/dmd/import.c	Wed Oct 01 19:15:17 2008 +0200
+++ b/dmd/import.c	Wed Oct 01 19:16:10 2008 +0200
@@ -33,6 +33,7 @@
     this->id = id;
     this->aliasId = aliasId;
     this->isstatic = isstatic;
+    protection = PROTundefined;
     pkg = NULL;
     mod = NULL;
 
@@ -60,6 +61,10 @@
     return isstatic ? (char *)"static import" : (char *)"import";
 }
 
+enum PROT Import::prot()
+{
+    return protection;
+}
 
 Dsymbol *Import::syntaxCopy(Dsymbol *s)
 {
@@ -131,14 +136,15 @@
 	}
 #endif
 
+	/* Default to private importing
+	 */
+	protection = sc->protection;
+	if (!sc->explicitProtection)
+	    protection = PROTprivate;
+
 	if (!isstatic && !aliasId && !names.dim)
 	{
-	    /* Default to private importing
-	     */
-	    enum PROT prot = sc->protection;
-	    if (!sc->explicitProtection)
-		prot = PROTprivate;
-	    sc->scopesym->importScope(mod, prot);
+	    sc->scopesym->importScope(mod, protection);
 	}
 
 	// Modules need a list of each imported module
@@ -149,13 +155,14 @@
 
 	sc = sc->push(mod);
 	for (size_t i = 0; i < aliasdecls.dim; i++)
-	{   Dsymbol *s = (Dsymbol *)aliasdecls.data[i];
+	{   AliasDeclaration *ad = (AliasDeclaration *)aliasdecls.data[i];
 
 	    //printf("\tImport alias semantic('%s')\n", s->toChars());
 	    if (!mod->search(loc, (Identifier *)names.data[i], 0))
 		error("%s not found", ((Identifier *)names.data[i])->toChars());
 
-	    s->semantic(sc);
+	    ad->semantic(sc);
+	    ad->protection = protection;
 	}
 	sc = sc->pop();
     }
--- a/dmd/import.h	Wed Oct 01 19:15:17 2008 +0200
+++ b/dmd/import.h	Wed Oct 01 19:16:10 2008 +0200
@@ -34,6 +34,7 @@
     Identifier *id;		// module Identifier
     Identifier *aliasId;
     int isstatic;		// !=0 if static import
+    enum PROT protection;
 
     // Pairs of alias=name to bind into current namespace
     Array names;
@@ -49,6 +50,7 @@
     void addAlias(Identifier *name, Identifier *alias);
 
     const char *kind();
+    enum PROT prot();
     Dsymbol *syntaxCopy(Dsymbol *s);	// copy only syntax trees
     void load(Scope *sc);
     void semantic(Scope *sc);
--- a/gen/toobj.cpp	Wed Oct 01 19:15:17 2008 +0200
+++ b/gen/toobj.cpp	Wed Oct 01 19:16:10 2008 +0200
@@ -64,7 +64,7 @@
     Logger::println("Generating module: %s\n", (md ? md->toChars() : toChars()));
     LOG_SCOPE;
 
-    printf("codegen: %s\n", srcfile->toChars());
+//    printf("codegen: %s\n", srcfile->toChars());
 
     // start by deleting the old object file
     deleteObjFile();