From: Jason Merrill Date: Mon, 18 Mar 2002 13:38:00 +0000 (-0500) Subject: re PR c++/4377 (more errors with multiple non-type template parameters) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=001ad76c41fb6725f6834c063199e8ea6540a9ee;p=gcc.git re PR c++/4377 (more errors with multiple non-type template parameters) PR c++/4377 * mangle.c (write_expression): Strip NOP_EXPRs sooner. Also strip NON_LVALUE_EXPRs. From-SVN: r50967 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 632a25726a8..94682bcf317 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,10 @@ 2002-03-18 Jason Merrill - PR c++/4003 - template/friend.C + PR c++/4377 + * mangle.c (write_expression): Strip NOP_EXPRs sooner. Also strip + NON_LVALUE_EXPRs. + + PR c++/4003 * pt.c (tsubst_friend_function): Use decl_namespace_context. PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 623fc3d3504..a71cc006525 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1788,6 +1788,16 @@ write_expression (expr) code = TREE_CODE (expr); } + /* Skip NOP_EXPRs. They can occur when (say) a pointer argument + is converted (via qualification conversions) to another + type. */ + while (TREE_CODE (expr) == NOP_EXPR + || TREE_CODE (expr) == NON_LVALUE_EXPR) + { + expr = TREE_OPERAND (expr, 0); + code = TREE_CODE (expr); + } + /* Handle template parameters. */ if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM @@ -1807,15 +1817,6 @@ write_expression (expr) { int i; - /* Skip NOP_EXPRs. They can occur when (say) a pointer argument - is converted (via qualification conversions) to another - type. */ - while (TREE_CODE (expr) == NOP_EXPR) - { - expr = TREE_OPERAND (expr, 0); - code = TREE_CODE (expr); - } - /* When we bind a variable or function to a non-type template argument with reference type, we create an ADDR_EXPR to show the fact that the entity's address has been taken. But, we diff --git a/gcc/testsuite/g++.dg/template/non-type1.C b/gcc/testsuite/g++.dg/template/non-type1.C new file mode 100644 index 00000000000..70e81d362ba --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-type1.C @@ -0,0 +1,49 @@ +// PR c++/4377 + +template < int I1, int I2 > +class unit +{ +public: + typedef unit my_type; + + unit() {} + unit( const unit& ) {} + + template< int Q1, int Q2 > + unit< I1 + Q1, I2 + Q2 > operator * ( const unit< Q1, Q2 >& rhs ) const { + return unit< I1 + Q1, I2 + Q2 >(); + } + + template< int Q1, int Q2 > + unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const { + return unit< I1 - Q1, I2 - Q2 >(); + } +}; + +// specialization added to first test +// +template <> +class unit<0,0> { +public: + typedef unit<0,0> my_type; + + unit() {} + + friend unit<0,0> operator*( const unit<0,0>& lhs, const unit<0,0>& rhs ) { + return unit<0,0>(); + } + friend unit<0,0> operator/( const unit<0,0>& lhs, const unit<0,0>& rhs ) { + return unit<0,0>(); + } + +}; + + +int main() +{ + const unit<1,0> u1; + const unit<2,0> u2; + + unit<-1,0> u3( u1 / u2 ); + unit< 3,0> u4( u1 * u2 ); +}