pt.c (convert_nontype_argument): Don't create things that aren't PTRMEM_CSTs when...
* pt.c (convert_nontype_argument): Don't create things that aren't PTRMEM_CSTs when applying a qualification conversion to a PTRMEM_CST. From-SVN: r25929
This commit is contained in:
parent
6599009997
commit
93aa462d4e
3 changed files with 49 additions and 4 deletions
|
@ -1,3 +1,9 @@
|
|||
1999-03-23 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* pt.c (convert_nontype_argument): Don't create things that aren't
|
||||
PTRMEM_CSTs when applying a qualification conversion to a
|
||||
PTRMEM_CST.
|
||||
|
||||
1999-03-23 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* Makefile.in (OBJS): Don't mention hash.o.
|
||||
|
|
26
gcc/cp/pt.c
26
gcc/cp/pt.c
|
@ -2703,10 +2703,28 @@ convert_nontype_argument (type, expr)
|
|||
tree type_pointed_to = TREE_TYPE (type);
|
||||
|
||||
if (TYPE_PTRMEM_P (type))
|
||||
/* For a non-type template-parameter of type pointer to data
|
||||
member, qualification conversions (_conv.qual_) are
|
||||
applied. */
|
||||
return perform_qualification_conversions (type, expr);
|
||||
{
|
||||
tree e;
|
||||
|
||||
/* For a non-type template-parameter of type pointer to data
|
||||
member, qualification conversions (_conv.qual_) are
|
||||
applied. */
|
||||
e = perform_qualification_conversions (type, expr);
|
||||
if (TREE_CODE (e) == NOP_EXPR)
|
||||
{
|
||||
/* The call to perform_qualification_conversions will
|
||||
insert a NOP_EXPR over EXPR to do express
|
||||
conversion, if necessary. But, that will confuse
|
||||
us if we use this (converted) template parameter to
|
||||
instantiate another template; then the thing will
|
||||
not look like a valid template argument. So, just
|
||||
make a new constant, of the appropriate type. */
|
||||
e = make_node (PTRMEM_CST);
|
||||
TREE_TYPE (e) = type;
|
||||
PTRMEM_CST_MEMBER (e) = PTRMEM_CST_MEMBER (expr);
|
||||
}
|
||||
return e;
|
||||
}
|
||||
else if (TREE_CODE (type_pointed_to) == FUNCTION_TYPE)
|
||||
{
|
||||
/* For a non-type template-parameter of type pointer to
|
||||
|
|
21
gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C
Normal file
21
gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C
Normal file
|
@ -0,0 +1,21 @@
|
|||
// Build don't link:
|
||||
// Origin: Jason Merrill <jason@cygnus.com>
|
||||
|
||||
struct A
|
||||
{
|
||||
A() : x(123) { }
|
||||
int x;
|
||||
};
|
||||
A a;
|
||||
|
||||
template<const int A::*PX>
|
||||
struct B
|
||||
{
|
||||
static int g() { return a.*PX; }
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int n = B<&A::x>::g();
|
||||
}
|
Loading…
Add table
Reference in a new issue