diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-03-23 16:13:44 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-03-23 16:13:44 +0000 |
commit | 93aa462d4e86df64f9d9952fdbd5b0825ce55703 (patch) | |
tree | e1470339308cba23f2690dea073ff69a4ba15c1e | |
parent | 6599009997e9ff24167006b936c4d63a485fe522 (diff) | |
download | gcc-93aa462d4e86df64f9d9952fdbd5b0825ce55703.zip gcc-93aa462d4e86df64f9d9952fdbd5b0825ce55703.tar.gz gcc-93aa462d4e86df64f9d9952fdbd5b0825ce55703.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C | 21 |
3 files changed, 49 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e189f6d..3bac892 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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. (OBJDEPS): Likewise. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 38e317c..aa8c9e9 100644 --- a/gcc/cp/pt.c +++ b/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 diff --git a/gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C b/gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C new file mode 100644 index 0000000..4c01056 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/ptrmem7.C @@ -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(); +} |