+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.
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
--- /dev/null
+// 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();
+}