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>
|
1999-03-23 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* Makefile.in (OBJS): Don't mention hash.o.
|
* 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);
|
tree type_pointed_to = TREE_TYPE (type);
|
||||||
|
|
||||||
if (TYPE_PTRMEM_P (type))
|
if (TYPE_PTRMEM_P (type))
|
||||||
/* For a non-type template-parameter of type pointer to data
|
{
|
||||||
member, qualification conversions (_conv.qual_) are
|
tree e;
|
||||||
applied. */
|
|
||||||
return perform_qualification_conversions (type, expr);
|
/* 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)
|
else if (TREE_CODE (type_pointed_to) == FUNCTION_TYPE)
|
||||||
{
|
{
|
||||||
/* For a non-type template-parameter of type pointer to
|
/* 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