c++: Stat-hack for members [PR 98530]

This was a header file that deployed the stat-hack inside a class
(both a member-class and a [non-static data] member had the same
name).  Due to the way that's represented in name lookup we missed the
class.  Sadly just changing the representation globally has
detrimental effects elsewhere, and this is a rare case, so just
creating a new overload on the fly shouldn't be a problem.

	PR c++/98530
	gcc/cp/
	* name-lookup.c (lookup_class_binding): Rearrange a stat-hack.
	gcc/testsuite/
	* g++.dg/modules/stat-mem-1.h: New.
	* g++.dg/modules/stat-mem-1_a.H: New.
	* g++.dg/modules/stat-mem-1_b.C: New.
This commit is contained in:
Nathan Sidwell 2021-01-21 04:48:39 -08:00
parent a1a967ce1f
commit 3c1cf7350b
4 changed files with 23 additions and 3 deletions

View File

@ -3926,11 +3926,16 @@ lookup_class_binding (tree klass, tree name)
vec<tree, va_gc> *member_vec = CLASSTYPE_MEMBER_VEC (klass);
found = member_vec_binary_search (member_vec, name);
if (IDENTIFIER_CONV_OP_P (name))
if (!found)
;
else if (STAT_HACK_P (found))
/* Rearrange the stat hack so that we don't need to expose that
internal detail. */
found = ovl_make (STAT_TYPE (found), STAT_DECL (found));
else if (IDENTIFIER_CONV_OP_P (name))
{
gcc_checking_assert (name == conv_op_identifier);
if (found)
found = OVL_CHAIN (found);
found = OVL_CHAIN (found);
}
}
else

View File

@ -0,0 +1,6 @@
struct fpu {
struct NAME {
int state;
} NAME;
};

View File

@ -0,0 +1,5 @@
// { dg-additional-options -fmodule-header }
// PR c++ 98530 stat-hack inside a structure
// { dg-module-cmi {} }
#include "stat-mem-1.h"

View File

@ -0,0 +1,4 @@
// { dg-additional-options "-fmodules-ts -fno-module-lazy" }
#include "stat-mem-1.h"
import "stat-mem-1_a.H";