Re: [eigen] eigen3 compile error on jaunty (gcc 4.3.3)

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Can you try the following patch against the current revision?

If it works, and you need to backport it to beta1, that should be easy
enough (it might even apply!)

Benoit

2010/9/2 Radu Bogdan Rusu <rusu@xxxxxxxxxxxxxxxx>:
> Thanks Benoit and Gael!
>
> Is there a way for someone else with 4.3.3 to try this? Should I send you
> our chroot? (clean plain install of Ubuntu 9.04)
>
> Radu.
>
> On 09/02/2010 04:17 AM, Benoit Jacob wrote:
>>
>> So the last reasonable explanation is that this is a bug in gcc 4.3.3
>> that was fixed in 4.3.4....
>>
>> Benoit
>>
>> 2010/9/2 Gael Guennebaud<gael.guennebaud@xxxxxxxxx>:
>>>
>>> sorry but I cannot reproduce. I tried with gcc 4.2, 4.3.4, 4.5 in both
>>> 32 and 64 bits.....
>>>
>>>
>>> gael
>>>
>>> On Wed, Sep 1, 2010 at 11:21 PM, Radu Bogdan Rusu<rusu@xxxxxxxxxxxxxxxx>
>>>  wrote:
>>>>
>>>> Benoit, I just checked the latest revision, and I get the same errors
>>>>
>>>> In file included from eigen3/eigen/Eigen/Core:244,
>>>>                 from eigen3/eigen/Eigen/QR:4,
>>>>                 from
>>>> eigen3/eigen/unsupported/test/../../test/main.h:163,
>>>>                 from
>>>> eigen3/eigen/unsupported/test/polynomialutils.cpp:25:
>>>> eigen3/eigen/Eigen/src/Core/MatrixBase.h:355: error: template argument 2
>>>> is
>>>> invalid
>>>> eigen3/eigen/Eigen/src/Core/MatrixBase.h:356: warning: type qualifiers
>>>> ignored on function return type
>>>> In file included from eigen3/eigen/Eigen/Core:258,
>>>>                 from eigen3/eigen/Eigen/QR:4,
>>>>                 from
>>>> eigen3/eigen/unsupported/test/../../test/main.h:163,
>>>>                 from
>>>> eigen3/eigen/unsupported/test/polynomialutils.cpp:25:
>>>> eigen3/eigen/Eigen/src/Core/DenseStorageBase.h: In member function 'void
>>>> Eigen::DenseStorageBase<Derived>::resize(typename
>>>> Eigen::ei_traits<Derived>::Index)':
>>>> eigen3/eigen/Eigen/src/Core/DenseStorageBase.h:188: error: template
>>>> argument
>>>> 1 is invalid
>>>> eigen3/eigen/Eigen/src/Core/DenseStorageBase.h: In member function 'void
>>>> Eigen::DenseStorageBase<Derived>::_init2(const typename
>>>> Eigen::ei_traits<Derived>::Scalar&, const typename
>>>> Eigen::ei_traits<Derived>::Scalar&, typename
>>>> Eigen::ei_enable_if<(Eigen::ei_dense_xpr_base::type::SizeAtCompileTime
>>>> ==
>>>> 2), T0>::type*)':
>>>> eigen3/eigen/Eigen/src/Core/DenseStorageBase.h:495: error: template
>>>> argument
>>>> 1 is invalid
>>>> make[3]: ***
>>>>
>>>> [unsupported/test/CMakeFiles/polynomialutils_8.dir/polynomialutils.cpp..o]
>>>> Error 1
>>>> make[2]: *** [unsupported/test/CMakeFiles/polynomialutils_8.dir/all]
>>>> Error 2
>>>> make[1]: *** [test/CMakeFiles/check.dir/rule] Error 2
>>>> make: *** [check] Error 2
>>>>
>>>>
>>>> Except the line numbers are different. This is:
>>>>
>>>> $ hg clone https://bitbucket.org/eigen/eigen/
>>>> $ cd eigen&&  mkdir build&&  cd build&&  cmake ..&&  make check
>>>>
>>>> or something :)
>>>>
>>>> Thanks,
>>>> Radu.
>>>>
>>>> On 09/01/2010 12:57 PM, Benoit Jacob wrote:
>>>>>
>>>>> As I said on IRC, your line numbers are strange and don't match what I
>>>>> have in these files.
>>>>>
>>>>> Can you cd to your source directory and do:
>>>>>   hg diff
>>>>>   hg parent
>>>>>
>>>>> Thanks
>>>>> Benoit
>>>>>
>>>>> 2010/9/1 Radu Bogdan Rusu<rusu@xxxxxxxxxxxxxxxx>:
>>>>>>
>>>>>> We first got build error in PCL. The errors that I posted in my
>>>>>> previous
>>>>>> e-mail are from "make check" in eigen3 beta1 (clean tgz +
>>>>>> tridiag_3x3.patch
>>>>>> from Gael).
>>>>>> This is in a 32bit Jaunty (Ubuntu 9.04) chroot with gcc 4.3.3.
>>>>>>
>>>>>> I wonder what causes it... hmm.
>>>>>>
>>>>>> Thanks,
>>>>>> Radu.
>>>>>>
>>>>>> On 09/01/2010 12:14 PM, Benoit Jacob wrote:
>>>>>>>
>>>>>>> So, I have tried building polynomialsolver_9 with GCC 4.3 here, and
>>>>>>> it
>>>>>>> works for me. I can't reproduce your error.
>>>>>>>
>>>>>>> [bjacob@cahouette test]$ /home/bjacob/prefix/bin/c++ -v
>>>>>>> Using built-in specs.
>>>>>>> Target: x86_64-unknown-linux-gnu
>>>>>>> Configured with: /home/bjacob/Downloads/gcc-4.3.5/configure
>>>>>>> --prefix=/home/bjacob/prefix/ --disable-multilib
>>>>>>> Thread model: posix
>>>>>>> gcc version 4.3.5 (GCC)
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Benoit
>>>>>>>
>>>>>>> 2010/9/1 Benoit Jacob<jacob.benoit.1@xxxxxxxxx>:
>>>>>>>>
>>>>>>>> sorry, I am really stupid, disregard my previous email.
>>>>>>>> Your original mail had all the information.
>>>>>>>>
>>>>>>>> Benoit
>>>>>>>>
>>>>>>>> 2010/9/1 Benoit Jacob<jacob.benoit.1@xxxxxxxxx>:
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Here a simple test program compiles with GCC 4.3, with current
>>>>>>>>> Eigen.
>>>>>>>>>
>>>>>>>>> Can you send us a simple test case that fails to build? Or point us
>>>>>>>>> to
>>>>>>>>> a specific test in our test suite? I'm at work now and can't build
>>>>>>>>> the
>>>>>>>>> test suite with gcc 4.3 easily.
>>>>>>>>>
>>>>>>>>> Benoit
>>>>>>>>>
>>>>>>>>> 2010/9/1 Radu Bogdan Rusu<rusu@xxxxxxxxxxxxxxxx>:
>>>>>>>>>>
>>>>>>>>>> We just noticed a compilation error on Ubuntu Jaunty on eigen3
>>>>>>>>>> today.
>>>>>>>>>>
>>>>>>>>>> $ gcc -v
>>>>>>>>>> Using built-in specs.
>>>>>>>>>> Target: i486-linux-gnu
>>>>>>>>>> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
>>>>>>>>>> 4.3.3-5ubuntu4'
>>>>>>>>>> --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
>>>>>>>>>> --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
>>>>>>>>>> --enable-shared
>>>>>>>>>> --with-system-zlib --libexecdir=/usr/lib
>>>>>>>>>> --without-included-gettext
>>>>>>>>>> --enable-threads=posix --enable-nls
>>>>>>>>>> --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3
>>>>>>>>>> --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
>>>>>>>>>> --enable-mpfr
>>>>>>>>>> --enable-targets=all --with-tune=generic --enable-checking=release
>>>>>>>>>> --build=i486-linux-gnu --host=i486-linux-gnu
>>>>>>>>>> --target=i486-linux-gnu
>>>>>>>>>> Thread model: posix
>>>>>>>>>> gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
>>>>>>>>>>
>>>>>>>>>> $ lsb_release -a
>>>>>>>>>> LSB Version:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> core-2.0-ia32:core-2.0-noarch:core-3.0-ia32:core-3.0-noarch:core-3.1-ia32:core-3.1-noarch:core-3.2-ia32:core-3.2-noarch:core-4.0-ia32:core-4.0-noarch:cxx-3.0-ia32:cxx-3.0-noarch:cxx-3.1-ia32:cxx-3.1-noarch:cxx-3.2-ia32:cxx-3.2-noarch:cxx-4.0-ia32:cxx-4.0-noarch:desktop-3.1-ia32:desktop-3.1-noarch:desktop-3.2-ia32:desktop-3.2-noarch:desktop-4.0-ia32:desktop-4.0-noarch:graphics-2.0-ia32:graphics-2.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch:graphics-3.1-ia32:graphics-3.1-noarch:graphics-3.2-ia32:graphics-3.2-noarch:graphics-4.0-ia32:graphics-4.0-noarch:qt4-3.1-ia32:qt4-3.1-noarch
>>>>>>>>>> Distributor ID: Ubuntu
>>>>>>>>>> Description:    Ubuntu 9.04
>>>>>>>>>> Release:        9.04
>>>>>>>>>> Codename:       jaunty
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> eigen3/build/eigen/build$ make check
>>>>>>>>>> [  0%] Building CXX object
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> unsupported/test/CMakeFiles/polynomialsolver_9.dir/polynomialsolver.cpp.o
>>>>>>>>>> In file included from eigen3/build/eigen/Eigen/Core:235,
>>>>>>>>>>                 from eigen3/build/eigen/Eigen/QR:4,
>>>>>>>>>>                 from
>>>>>>>>>> eigen3/build/eigen/unsupported/test/../../test/main.h:162,
>>>>>>>>>>                 from
>>>>>>>>>> eigen3/build/eigen/unsupported/test/polynomialsolver.cpp:25:
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/MatrixBase.h:352: error:
>>>>>>>>>> template
>>>>>>>>>> argument
>>>>>>>>>> 2 is invalid
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/MatrixBase.h:353: warning: type
>>>>>>>>>> qualifiers
>>>>>>>>>> ignored on function return type
>>>>>>>>>> In file included from eigen3/build/eigen/Eigen/Core:249,
>>>>>>>>>>                 from eigen3/build/eigen/Eigen/QR:4,
>>>>>>>>>>                 from
>>>>>>>>>> eigen3/build/eigen/unsupported/test/../../test/main.h:162,
>>>>>>>>>>                 from
>>>>>>>>>> eigen3/build/eigen/unsupported/test/polynomialsolver.cpp:25:
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/DenseStorageBase.h: In member
>>>>>>>>>> function
>>>>>>>>>> 'void Eigen::DenseStorageBase<Derived>::resize(typename
>>>>>>>>>> Eigen::ei_traits<Derived>::Index)':
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/DenseStorageBase.h:187: error:
>>>>>>>>>> template
>>>>>>>>>> argument 1 is invalid
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/DenseStorageBase.h: In member
>>>>>>>>>> function
>>>>>>>>>> 'void Eigen::DenseStorageBase<Derived>::_init2(const typename
>>>>>>>>>> Eigen::ei_traits<Derived>::Scalar&, const typename
>>>>>>>>>> Eigen::ei_traits<Derived>::Scalar&, typename
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Eigen::ei_enable_if<(Eigen::ei_dense_xpr_base::type::SizeAtCompileTime
>>>>>>>>>> ==
>>>>>>>>>> 2), T0>::type*)':
>>>>>>>>>> eigen3/build/eigen/Eigen/src/Core/DenseStorageBase.h:493: error:
>>>>>>>>>> template
>>>>>>>>>> argument 1 is invalid
>>>>>>>>>> make[3]: ***
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> [unsupported/test/CMakeFiles/polynomialsolver_9.dir/polynomialsolver.cpp.o]
>>>>>>>>>> Error 1
>>>>>>>>>> make[2]: ***
>>>>>>>>>> [unsupported/test/CMakeFiles/polynomialsolver_9.dir/all]
>>>>>>>>>> Error
>>>>>>>>>> 2
>>>>>>>>>> make[1]: *** [test/CMakeFiles/check.dir/rule] Error 2
>>>>>>>>>> make: *** [check] Error 2
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Is this a known issue/bug with older compilers?
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Radu.
>>>>>>>>>> --
>>>>>>>>>> | Radu Bogdan Rusu | http://rbrusu.com/
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> | Radu Bogdan Rusu | http://rbrusu.com/
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> | Radu Bogdan Rusu | http://rbrusu.com/
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>
> --
> | Radu Bogdan Rusu | http://rbrusu.com/
>
diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h
--- a/Eigen/src/Core/MatrixBase.h
+++ b/Eigen/src/Core/MatrixBase.h
@@ -336,29 +336,33 @@ template<typename Derived> class MatrixB
 /////////// Geometry module ///////////
 
     template<typename OtherDerived>
     PlainObject cross(const MatrixBase<OtherDerived>& other) const;
     template<typename OtherDerived>
     PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
     PlainObject unitOrthogonal(void) const;
     Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;
-    const ScalarMultipleReturnType operator*(const UniformScaling<Scalar>& s) const;
+    ScalarMultipleReturnType operator*(const UniformScaling<Scalar>& s) const;
     enum {
       SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1
     };
     typedef Block<Derived,
                   ei_traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,
                   ei_traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> StartMinusOne;
     typedef CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>,
                 StartMinusOne > HNormalizedReturnType;
 
-    const HNormalizedReturnType hnormalized() const;
-    typedef Homogeneous<Derived,MatrixBase<Derived>::ColsAtCompileTime==1?Vertical:Horizontal> HomogeneousReturnType;
-    const HomogeneousReturnType homogeneous() const;
+    HNormalizedReturnType hnormalized() const;
+
+    // put this as separate enum value to work around possible GCC 4.3 bug (?)
+    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1?Vertical:Horizontal };
+    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
+
+    HomogeneousReturnType homogeneous() const;
 
 ////////// Householder module ///////////
 
     void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
     template<typename EssentialPart>
     void makeHouseholder(EssentialPart& essential,
                          Scalar& tau, RealScalar& beta) const;
     template<typename EssentialPart>
diff --git a/Eigen/src/Core/VectorwiseOp.h b/Eigen/src/Core/VectorwiseOp.h
--- a/Eigen/src/Core/VectorwiseOp.h
+++ b/Eigen/src/Core/VectorwiseOp.h
@@ -458,17 +458,17 @@ template<typename ExpressionType, int Di
     operator-(const DenseBase<OtherDerived>& other) const
     {
       EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived);
       return m_matrix - extendedTo(other.derived());
     }
 
 /////////// Geometry module ///////////
 
-    const Homogeneous<ExpressionType,Direction> homogeneous() const;
+    Homogeneous<ExpressionType,Direction> homogeneous() const;
 
     typedef typename ExpressionType::PlainObject CrossReturnType;
     template<typename OtherDerived>
     const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
 
     enum {
       HNormalized_Size = Direction==Vertical ? ei_traits<ExpressionType>::RowsAtCompileTime
                                              : ei_traits<ExpressionType>::ColsAtCompileTime,
@@ -486,17 +486,17 @@ template<typename ExpressionType, int Di
             HNormalized_Factors;
     typedef CwiseBinaryOp<ei_scalar_quotient_op<typename ei_traits<ExpressionType>::Scalar>,
                 HNormalized_Block,
                 Replicate<HNormalized_Factors,
                   Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
                   Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
             HNormalizedReturnType;
 
-    const HNormalizedReturnType hnormalized() const;
+    HNormalizedReturnType hnormalized() const;
 
   protected:
     ExpressionTypeNested m_matrix;
 };
 
 /** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
   *
   * Example: \include MatrixBase_colwise.cpp
diff --git a/Eigen/src/Core/util/StaticAssert.h b/Eigen/src/Core/util/StaticAssert.h
--- a/Eigen/src/Core/util/StaticAssert.h
+++ b/Eigen/src/Core/util/StaticAssert.h
@@ -95,22 +95,22 @@
     };
 
     // Specialized implementation for MSVC to avoid "conditional
     // expression is constant" warnings.  This implementation doesn't
     // appear to work under GCC, hence the multiple implementations.
     #ifdef _MSC_VER
 
       #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
-        {Eigen::ei_static_assert<CONDITION ? true : false>::MSG;}
+        {Eigen::ei_static_assert<(CONDITION)>::MSG;}
 
     #else
 
       #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
-        if (Eigen::ei_static_assert<CONDITION ? true : false>::MSG) {}
+        if (Eigen::ei_static_assert<(CONDITION)>::MSG) {}
 
     #endif
 
   #endif // not CXX0X
 
 #else // EIGEN_NO_STATIC_ASSERT
 
   #define EIGEN_STATIC_ASSERT(CONDITION,MSG) ei_assert((CONDITION) && #MSG);
diff --git a/Eigen/src/Geometry/Homogeneous.h b/Eigen/src/Geometry/Homogeneous.h
--- a/Eigen/src/Geometry/Homogeneous.h
+++ b/Eigen/src/Geometry/Homogeneous.h
@@ -138,48 +138,48 @@ template<typename MatrixType,int _Direct
   * \only_for_vectors
   *
   * Example: \include MatrixBase_homogeneous.cpp
   * Output: \verbinclude MatrixBase_homogeneous.out
   *
   * \sa class Homogeneous
   */
 template<typename Derived>
-inline const typename MatrixBase<Derived>::HomogeneousReturnType
+inline typename MatrixBase<Derived>::HomogeneousReturnType
 MatrixBase<Derived>::homogeneous() const
 {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return derived();
 }
 
 /** \geometry_module
   *
   * \returns a matrix expression of homogeneous column (or row) vectors
   *
   * Example: \include VectorwiseOp_homogeneous.cpp
   * Output: \verbinclude VectorwiseOp_homogeneous.out
   *
   * \sa MatrixBase::homogeneous() */
 template<typename ExpressionType, int Direction>
-inline const Homogeneous<ExpressionType,Direction>
+inline Homogeneous<ExpressionType,Direction>
 VectorwiseOp<ExpressionType,Direction>::homogeneous() const
 {
   return _expression();
 }
 
 /** \geometry_module
   *
   * \returns an expression of the homogeneous normalized vector of \c *this
   *
   * Example: \include MatrixBase_hnormalized.cpp
   * Output: \verbinclude MatrixBase_hnormalized.out
   *
   * \sa VectorwiseOp::hnormalized() */
 template<typename Derived>
-inline const typename MatrixBase<Derived>::HNormalizedReturnType
+inline typename MatrixBase<Derived>::HNormalizedReturnType
 MatrixBase<Derived>::hnormalized() const
 {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return StartMinusOne(derived(),0,0,
     ColsAtCompileTime==1?size()-1:1,
     ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);
 }
 
@@ -187,17 +187,17 @@ MatrixBase<Derived>::hnormalized() const
   *
   * \returns an expression of the homogeneous normalized vector of \c *this
   *
   * Example: \include DirectionWise_hnormalized.cpp
   * Output: \verbinclude DirectionWise_hnormalized.out
   *
   * \sa MatrixBase::hnormalized() */
 template<typename ExpressionType, int Direction>
-inline const typename VectorwiseOp<ExpressionType,Direction>::HNormalizedReturnType
+inline typename VectorwiseOp<ExpressionType,Direction>::HNormalizedReturnType
 VectorwiseOp<ExpressionType,Direction>::hnormalized() const
 {
   return HNormalized_Block(_expression(),0,0,
       Direction==Vertical   ? _expression().rows()-1 : _expression().rows(),
       Direction==Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(
       Replicate<HNormalized_Factors,
                 Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
                 Direction==Horizontal ? HNormalized_SizeMinusOne : 1>
diff --git a/Eigen/src/Geometry/Scaling.h b/Eigen/src/Geometry/Scaling.h
--- a/Eigen/src/Geometry/Scaling.h
+++ b/Eigen/src/Geometry/Scaling.h
@@ -110,17 +110,17 @@ public:
   bool isApprox(const UniformScaling& other, typename NumTraits<Scalar>::Real prec = NumTraits<Scalar>::dummy_precision()) const
   { return ei_isApprox(m_factor, other.factor(), prec); }
 
 };
 
 /** Concatenates a linear transformation matrix and a uniform scaling */
 // NOTE this operator is defiend in MatrixBase and not as a friend function
 // of UniformScaling to fix an internal crash of Intel's ICC
-template<typename Derived> const typename MatrixBase<Derived>::ScalarMultipleReturnType
+template<typename Derived> typename MatrixBase<Derived>::ScalarMultipleReturnType
 MatrixBase<Derived>::operator*(const UniformScaling<Scalar>& s) const
 { return derived() * s.factor(); }
 
 /** Constructs a uniform scaling from scale factor \a s */
 static inline UniformScaling<float> Scaling(float s) { return UniformScaling<float>(s); }
 /** Constructs a uniform scaling from scale factor \a s */
 static inline UniformScaling<double> Scaling(double s) { return UniformScaling<double>(s); }
 /** Constructs a uniform scaling from scale factor \a s */


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/