Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 37c6f77ebfefad5a39e5cf500acf63edf0a162ea)
+++ src/GenPoly/Box.cc	(revision 801978b5b1723c9d972a705d0172df3c7cfc721f)
@@ -1546,11 +1546,28 @@
 			long i = 0;
 			for(std::list< Declaration* >::const_iterator decl = baseDecls.begin(); decl != baseDecls.end(); ++decl, ++i ) {
-				if ( memberDecl->get_name() != (*decl)->get_name() ) continue;
-
-				if ( DeclarationWithType *declWithType = dynamic_cast< DeclarationWithType* >( *decl ) ) {
-					if ( memberDecl->get_mangleName().empty() || declWithType->get_mangleName().empty()
-					     || memberDecl->get_mangleName() == declWithType->get_mangleName() ) return i;
-					else continue;
-				} else return i;
+				if ( memberDecl->get_name() != (*decl)->get_name() )
+					continue;
+
+				if ( memberDecl->get_name().empty() ) {
+					// plan-9 field: match on unique_id
+					if ( memberDecl->get_uniqueId() == (*decl)->get_uniqueId() )
+						return i;
+					else
+						continue;
+				}
+
+				DeclarationWithType *declWithType = strict_dynamic_cast< DeclarationWithType* >( *decl );
+
+				if ( memberDecl->get_mangleName().empty() || declWithType->get_mangleName().empty() ) {
+					// tuple-element field: expect neither had mangled name; accept match on simple name (like field_2) only
+					assert( memberDecl->get_mangleName().empty() && declWithType->get_mangleName().empty() );
+					return i;
+				}
+
+				// ordinary field: use full name to accommodate overloading
+				if ( memberDecl->get_mangleName() == declWithType->get_mangleName() )
+					return i;
+				else
+					continue;
 			}
 			return -1;
Index: tests/.expect/polymorphism.txt
===================================================================
--- tests/.expect/polymorphism.txt	(revision 37c6f77ebfefad5a39e5cf500acf63edf0a162ea)
+++ tests/.expect/polymorphism.txt	(revision 801978b5b1723c9d972a705d0172df3c7cfc721f)
@@ -1,2 +1,9 @@
 123 456 456
 5 5
+=== checkPlan9offsets
+static:
+  offset of inner double: 8
+  offset of inner float:  16
+dynamic:
+  offset of inner double: 8
+  offset of inner float:  16
Index: tests/polymorphism.cfa
===================================================================
--- tests/polymorphism.cfa	(revision 37c6f77ebfefad5a39e5cf500acf63edf0a162ea)
+++ tests/polymorphism.cfa	(revision 801978b5b1723c9d972a705d0172df3c7cfc721f)
@@ -54,4 +54,38 @@
 	b.i = s.i;
 	return b.j;
+}
+
+void checkPlan9offsets() {
+
+	forall( T )
+	struct thing {
+		T q;                // variable-sized padding
+		inline double;
+		inline float;
+	};
+
+	#define SHOW_OFFSETS \
+		double & x_inner_double = x; \
+		float  & x_inner_float  = x; \
+		printf("  offset of inner double: %ld\n", ((char *) & x_inner_double) - ((char *) & x) ); \
+		printf("  offset of inner float:  %ld\n", ((char *) & x_inner_float ) - ((char *) & x) );
+
+	void showStatic( thing(int) & x ) {
+		printf("static:\n");
+		SHOW_OFFSETS
+	}
+
+	forall( T )
+	void showDynamic( thing(T) & x ) {
+		printf("dynamic:\n");
+		SHOW_OFFSETS
+	}
+
+	#undef SHOW_OFFSETS
+
+	printf("=== checkPlan9offsets\n");
+	thing(int) x;
+	showStatic(x);
+	showDynamic(x);
 }
 
@@ -114,4 +148,6 @@
 		assertf(ret == u.f2, "union operation fails in polymorphic context.");
 	}
+
+	checkPlan9offsets();
 }
 
