This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gccgo] Give an error for conflicting initialization functions
- From: Ian Lance Taylor <iant at google dot com>
- To: gcc-patches at gcc dot gnu dot org, gofrontend-dev at googlegroups dot com
- Date: Wed, 10 Nov 2010 15:38:03 -0800
- Subject: [gccgo] Give an error for conflicting initialization functions
Go permits importing multiple packages with the same name. Doing this
with gccgo requires using the -fgo-prefix command line option to give
each package a unique prefix. If somebody forgets to do that, then
there will be name conflicts. This patch detects a particular nefarious
case of that, in which there is a conflict in the package initialization
function. Initializing a package twice can have various bad effects.
Committed to gccgo branch.
Ian
diff -r fbdd25514551 go/gogo.cc
--- a/go/gogo.cc Wed Nov 10 14:55:00 2010 -0800
+++ b/go/gogo.cc Wed Nov 10 15:35:38 2010 -0800
@@ -329,6 +329,33 @@
delete stream;
}
+// Add an import control function for an imported package to the list.
+
+void
+Gogo::add_import_init_fn(const std::string& package_name,
+ const std::string& init_name, int prio)
+{
+ for (std::set<Import_init>::const_iterator p =
+ this->imported_init_fns_.begin();
+ p != this->imported_init_fns_.end();
+ ++p)
+ {
+ if (p->init_name() == init_name
+ && (p->package_name() != package_name || p->priority() != prio))
+ {
+ error("duplicate package initialization name %qs", init_name.c_str());
+ inform(UNKNOWN_LOCATION, "used by package %qs at priority %d",
+ p->package_name().c_str(), p->priority());
+ inform(UNKNOWN_LOCATION, " and by package %qs at priority %d",
+ package_name.c_str(), prio);
+ return;
+ }
+ }
+
+ this->imported_init_fns_.insert(Import_init(package_name, init_name,
+ prio));
+}
+
// Return whether we are at the global binding level.
bool
diff -r fbdd25514551 go/gogo.h
--- a/go/gogo.h Wed Nov 10 14:55:00 2010 -0800
+++ b/go/gogo.h Wed Nov 10 15:35:38 2010 -0800
@@ -374,11 +374,7 @@
// list.
void
add_import_init_fn(const std::string& package_name,
- const std::string& init_name, int prio)
- {
- this->imported_init_fns_.insert(Import_init(package_name, init_name,
- prio));
- }
+ const std::string& init_name, int prio);
// Turn short-cut operators (&&, ||) into explicit if statements.
void