2002-03-18 Jason Merrill <jason@redhat.com>
- 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.
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
{
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
--- /dev/null
+// PR c++/4377
+
+template < int I1, int I2 >
+class unit
+{
+public:
+ typedef unit<I1,I2> my_type;
+
+ unit() {}
+ unit( const unit<I1,I2>& ) {}
+
+ 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 );
+}