Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/opt/pr56381.C @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// PR tree-optimization/56381 // { dg-do compile { target c++11 } } // { dg-options "-O2 -w" } template <class> class intrusive_ptr {}; class BasicReferenceCounted { }; template <class T> class ReferenceCountingPointer : intrusive_ptr <T> { }; typedef BasicReferenceCounted ReferenceCountedInConditions; class PointTag; template <typename T, typename> struct PreciseFloatType { typedef T Type; }; template <typename T, int N> struct ExtVecTraits { typedef T __attribute__ ((vector_size (N * sizeof (T)))) type; }; template <typename T, int N> using ExtVec = typename ExtVecTraits <T, N>::type; template <typename T> using Vec4 = ExtVec <T, 4>; template <typename Vec> Vec cross3 (Vec x, Vec y) { Vec x1200 = (Vec) { x[2], x[0] }; Vec y2010 { y[2], y[0], y[1], y[0] }; Vec x2010 = (Vec) { x[2], x[0], x[1], x[0] }; Vec y1200 = (Vec) { y[1], y[0] }; return x1200 * y2010 - x2010 * y1200; } template <typename T> struct Rot3 { typedef Vec4 <T> Vec; Vec axis[3]; }; class Basic2DVector { }; template <typename T> struct Basic3DVector { typedef Vec4 <T> MathVector; Basic3DVector (MathVector iv) : v { (iv[0]), (iv[1]), (iv[2]), (iv[3]) } {} T mag2 () {} Basic3DVector unit () { T my_mag = mag2 (); return (my_mag) ? (*this) * (T () / (my_mag)) : *this; } Basic3DVector cross (Basic3DVector lh) { return cross3 (v, lh.v); } Vec4 <T> v; }; template <class T> Basic3DVector <T> operator * (Basic3DVector <T>, T); template <class T, class, class> struct PV3DBase { typedef Basic3DVector <T> BasicVectorType; template <class U> PV3DBase (Basic3DVector <U> v) : theVector (v) {} BasicVectorType basicVector () { return theVector; } T x (); T y (); BasicVectorType theVector; }; class VectorTag; template <class T, class FrameTag> struct Vector3DBase:public PV3DBase <T, VectorTag, FrameTag> { typedef PV3DBase <T, VectorTag, FrameTag> BaseClass; template <class U> Vector3DBase (Basic3DVector <U> v) : BaseClass (v) {} Vector3DBase unit () { return (this->basicVector ().unit ()); } template <class U> Vector3DBase <typename PreciseFloatType <T, U>::Type, FrameTag> cross (Vector3DBase <U, FrameTag> v) { return (this->theVector.cross (v.basicVector ())); } }; template <class T, class FrameTag> class Point3DBase : public PV3DBase <T, PointTag, FrameTag> { }; template <typename T, typename U, class Frame> Vector3DBase <typename PreciseFloatType <T, U>::Type, Frame> operator - (Point3DBase <T, Frame>, Point3DBase <U, Frame>); class GlobalTag; template <class T> struct TkRotation { typedef Vector3DBase <T, GlobalTag> GlobalVector; TkRotation (GlobalVector aX, GlobalVector aY) { GlobalVector uX = aX.unit (); GlobalVector uY = aY.unit (); GlobalVector uZ (uX.cross (uY)); rot.axis[2] = uZ.basicVector ().v; } Basic3DVector <T> z (); Rot3 <T> rot; }; template <class T> struct GloballyPositioned { typedef Point3DBase <T, GlobalTag> PositionType; typedef TkRotation <T> RotationType; typedef Point3DBase <T, GlobalTag> GlobalPoint; typedef Vector3DBase <T, GlobalTag> GlobalVector; T iniPhi () { return 999.9978; } GloballyPositioned (PositionType pos, RotationType rot) : thePos (pos), theRot (rot) { resetCache (); } PositionType position () const; RotationType rotation () const; PositionType thePos; RotationType theRot; void resetCache () { if ((thePos.x () == 0.) && (thePos.y () == 0.)) thePhi = 0.; else thePhi = iniPhi (); } T thePhi; }; class Plane; using TangentPlane = Plane; struct Surface : public GloballyPositioned <float>, ReferenceCountedInConditions { typedef GloballyPositioned <float> Base; Surface (PositionType pos, RotationType rot): Base (pos, rot) {} }; struct Plane : Surface { template <typename ... Args> Plane (Args ... args): Surface ((args) ...) {} }; class Cylinder : Surface { void tangentPlane (const GlobalPoint &) const; }; void Cylinder::tangentPlane (const GlobalPoint & aPoint) const { GlobalVector yPlane (rotation ().z ()); GlobalVector xPlane (yPlane.cross (aPoint - position ())); new TangentPlane (aPoint, RotationType (xPlane, yPlane)); }