diff options
author | Duncan Sands <baldrick@free.fr> | 2008-10-29 18:06:20 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-10-29 18:06:20 +0000 |
commit | 7e1cf741f7ababa2bdd659936f9f18075adcb447 (patch) | |
tree | d0b42bb28489a77b81a96b77a5e4db396806df55 /test/FrontendC++ | |
parent | 560946481ef1aaa704e2916bcaf7f1b904ffb666 (diff) | |
download | external_llvm-7e1cf741f7ababa2bdd659936f9f18075adcb447.zip external_llvm-7e1cf741f7ababa2bdd659936f9f18075adcb447.tar.gz external_llvm-7e1cf741f7ababa2bdd659936f9f18075adcb447.tar.bz2 |
Testcase for PR2917.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58389 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/FrontendC++')
-rw-r--r-- | test/FrontendC++/2008-10-29-WrongOffset.cpp | 489 |
1 files changed, 489 insertions, 0 deletions
diff --git a/test/FrontendC++/2008-10-29-WrongOffset.cpp b/test/FrontendC++/2008-10-29-WrongOffset.cpp new file mode 100644 index 0000000..1b3be21 --- /dev/null +++ b/test/FrontendC++/2008-10-29-WrongOffset.cpp @@ -0,0 +1,489 @@ +// RUN: %llvmgxx %s -c -o /dev/null +// PR2917 + +#include <complex> +template < int Dim, class T, class EngineTag > class Engine; +template < class Subject, class Sub1, bool SV > struct View1Implementation; +template < class LayoutTag, class PatchTag > struct MultiPatch; +template < class LayoutTag, class PatchTag, int Dim2 > struct MultiPatchView; +template < class Engine, class SubDomain > struct NewEngine +{ +}; +template < class T > class DomainTraits; +template < class DomT, class T, int Dim > struct DomainTraitsDomain +{ + typedef DomT NewDomain1_t; +}; +template < int Dim > class Interval; +template < int Dim > class Loc; +template < class DT > class DomainBase +{ +}; + +template < int Dim, class DT > class Domain:public DomainBase < DT > +{ +}; +template < int Dim > struct DomainTraits <Interval < Dim > + >:public DomainTraitsDomain < Interval < Dim >, int, Dim > +{ + enum + { + singleValued = false + }; +}; +template < class T1 > struct NewDomain1 +{ + typedef typename DomainTraits < T1 >::NewDomain1_t SliceType_t; +}; +template < class Domain, class Sub > struct TemporaryNewDomain1 +{ + typedef typename NewDomain1 < Sub >::SliceType_t SliceType_t; +}; +template < int Dim > class Interval:public Domain < Dim, + DomainTraits < Interval < Dim > > > +{ +}; +template < int Dim > class GuardLayers +{ +}; +template < class T > class Observer +{ +}; + +template < class T > class Observable +{ +private:T & observed_m; + int count_m; +}; + +class RefCounted +{ +}; +template < class T > class RefCountedPtr +{ +public:typedef RefCountedPtr < T > This_t; + RefCountedPtr (T * const pT):ptr_m (pT) + { + } + inline T *operator-> () const + { + } + T *ptr_m; +}; + +template < class Dom, class T > class DomainMap +{ +}; + +template < class LayoutTag, int Dim > struct MultiPatchLayoutTraits +{ +}; +template < int Dim > class LayoutBaseData +{ +public:typedef Interval < Dim > Domain_t; + Domain_t domain_m; +}; +template < int Dim, class LBD > class LayoutBase +{ +public:typedef LayoutBaseData < Dim > LayoutData_t; + typedef typename LayoutData_t::Domain_t Domain_t; + typedef GuardLayers < Dim > GuardLayers_t; + inline const Domain_t & domain () const + { + return pdata_m->domain_m; + } + inline const Domain_t & innerDomain () const + { + } + inline GuardLayers_t externalGuards () const + { + } + RefCountedPtr < LBD > pdata_m; +}; +template < class Tag > struct Remote; +struct Brick +{ +}; +template < class Thing, class Sub > struct View1 +{ +}; +template < int Dim, class T, class LayoutTag, + class PatchTag > struct NewEngine <Engine < Dim, T, MultiPatch < LayoutTag, + PatchTag > >, Interval < Dim > > +{ + typedef Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, + Dim > >Type_t; +}; +template < int Dim, class T, class LayoutTag, class PatchTag, + int Dim2 > struct NewEngine <Engine < Dim, T, MultiPatchView < LayoutTag, + PatchTag, Dim2 > >, Interval < Dim > > +{ + typedef Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, + Dim2 > >Type_t; +}; +template < int Dim, class T, class LayoutTag, + class PatchTag > class Engine < Dim, T, MultiPatch < LayoutTag, + PatchTag > >:public Observer < typename MultiPatchLayoutTraits < LayoutTag, + Dim >::Layout_t > +{ +public:typedef MultiPatch < LayoutTag, PatchTag > Tag_t; + typedef Interval < Dim > Domain_t; +}; +template < int Dim, class T, class LayoutTag, class PatchTag, + int Dim2 > class Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, + Dim2 > > +{ +public:typedef MultiPatchView < LayoutTag, PatchTag, Dim2 > Tag_t; + typedef Interval < Dim > Domain_t; + typedef T Element_t; + enum + { + dimensions = Dim + }; +}; +class Full; +template < int Dim, class T = double, class EngineTag = Full > class Vector { +}; + +template < int Dim > inline Interval < Dim > +shrinkRight (const Interval < Dim > &dom, int s) +{ +} + +template < int Dim > class GridLayout; +struct GridTag +{ +}; +template < int Dim > struct MultiPatchLayoutTraits <GridTag, Dim > +{ + typedef GridLayout < Dim > Layout_t; +}; +template < int Dim > class GridLayoutData:public LayoutBaseData < Dim >, + public RefCounted, public Observable < GridLayoutData < Dim > > +{ + typedef int AxisIndex_t; + mutable DomainMap < Interval < 1 >, AxisIndex_t > mapAloc_m[Dim]; +}; +template < int Dim > class GridLayout:public LayoutBase < Dim, + GridLayoutData < Dim > >, public Observable < GridLayout < Dim > >, + public Observer < GridLayoutData < Dim > > +{ +public:typedef GridLayout < Dim > This_t; + GridLayout (); +}; +template < class MeshTag, class T, class EngineTag > class Field; +enum CenteringType +{ + VertexType, EdgeType, FaceType, CellType +}; +enum ContinuityType +{ + Continuous = 0, Discontinuous +}; +template < int Dim > class Centering +{ +public:typedef Loc < Dim > Orientation; + inline int size () const + { + } +}; +template < int Dim > const Centering < Dim > +canonicalCentering (const enum CenteringType type, + const enum ContinuityType discontinuous, + const int dimension = 0); +template < class Mesh, class T, class EngineTag > class FieldEngine +{ +public:enum + { + dimensions = Mesh::dimensions + }; + enum + { + Dim = dimensions + }; + typedef Engine < Dim, T, EngineTag > Engine_t; + typedef typename Engine_t::Domain_t Domain_t; + typedef GuardLayers < Dim > GuardLayers_t; +template < class Layout2 > FieldEngine (const Centering < Dim > ¢ering, const Layout2 & layout, const Mesh & mesh, int materials = 1):num_materials_m (materials), centering_m (centering), + stride_m (centering.size ()), physicalCellDomain_m (layout.domain ()), + guards_m (layout.externalGuards ()), mesh_m (mesh) + { + } + unsigned int num_materials_m; + Centering < Dim > centering_m; + int stride_m; + Domain_t physicalCellDomain_m; + GuardLayers_t guards_m; + Mesh mesh_m; +}; + +template < class Subject > class SubFieldView; +template < class Mesh, class T, + class EngineTag > class SubFieldView < Field < Mesh, T, EngineTag > > +{ +public:typedef Field < Mesh, T, EngineTag > Type_t; +}; + +template < int Dim, class Mesh, class Domain > struct NewMeshTag +{ + typedef Mesh Type_t; +}; +template < class Mesh, class T, class EngineTag, + class Domain > struct View1Implementation <Field < Mesh, T, EngineTag >, + Domain, false > +{ + typedef Field < Mesh, T, EngineTag > Subject_t; + typedef typename Subject_t::Engine_t Engine_t; + typedef typename NewEngine < Engine_t, Domain >::Type_t NewEngine_t; + typedef typename NewEngine_t::Element_t NewT_t; + typedef typename NewEngine_t::Tag_t NewEngineTag_t; + typedef typename NewMeshTag < NewEngine_t::dimensions, Mesh, + Domain >::Type_t NewMeshTag_t; + typedef Field < NewMeshTag_t, NewT_t, NewEngineTag_t > Type_t; +}; +template < class Mesh, class T, class EngineTag, + class Sub1 > struct View1 <Field < Mesh, T, EngineTag >, Sub1 > +{ + typedef Field < Mesh, T, EngineTag > Subject_t; + typedef typename Subject_t::Domain_t Domain_t; + typedef TemporaryNewDomain1 < Domain_t, Sub1 > NewDomain_t; + typedef typename NewDomain_t::SliceType_t SDomain_t; + enum + { + sv = DomainTraits < SDomain_t >::singleValued + }; + typedef View1Implementation < Subject_t, SDomain_t, sv > Dispatch_t; + typedef typename Dispatch_t::Type_t Type_t; +}; +template < class Mesh, class T = double, class EngineTag = Brick > class Field { +public:typedef Mesh MeshTag_t; + typedef Mesh Mesh_t; + typedef Field < Mesh, T, EngineTag > This_t; + typedef FieldEngine < Mesh, T, EngineTag > FieldEngine_t; + enum + { + dimensions = FieldEngine_t::dimensions + }; + typedef Engine < dimensions, T, EngineTag > Engine_t; + typedef typename Engine_t::Domain_t Domain_t; + typedef Centering < dimensions > Centering_t; + template < class Layout2 > Field (const Centering_t & centering, + const Layout2 & layout, + const Mesh_t & + mesh):fieldEngine_m (centering, layout, + mesh) + { + } + inline typename SubFieldView < This_t >::Type_t center (int c) const + { + } + inline typename View1 < This_t, Domain_t >::Type_t all () const + { + } + template < class T1 > const This_t & operator= (const T1 & rhs) const + { + } +private: FieldEngine_t fieldEngine_m; +}; + +struct UniformRectilinearTag +{ +}; +struct CartesianTag +{ +}; +template < class MeshTraits > struct CartesianURM; +template < class MeshTraits > class UniformRectilinearMeshData; +template < class MeshTraits > class UniformRectilinearMesh; +template < int Dim, typename T = double, class MeshTag = + UniformRectilinearTag, class CoordinateSystemTag = CartesianTag, int CDim = + Dim > struct MeshTraits; +template < int Dim, typename T, class MeshTag, class CoordinateSystemTag, + int CDim > struct MeshTraitsBase +{ + typedef MeshTraits < Dim, T, MeshTag, CoordinateSystemTag, + CDim > MeshTraits_t; + enum + { + dimensions = Dim + }; + typedef Vector < CDim, T > PointType_t; +}; +template < int Dim, typename T, int CDim > struct MeshTraits <Dim, T, + UniformRectilinearTag, CartesianTag, CDim >:public MeshTraitsBase < Dim, T, + UniformRectilinearTag, CartesianTag, CDim > +{ + typedef typename MeshTraitsBase < Dim, T, UniformRectilinearTag, + CartesianTag, CDim >::MeshTraits_t MeshTraits_t; + typedef CartesianURM < MeshTraits_t > CoordinateSystem_t; + typedef UniformRectilinearMeshData < MeshTraits_t > MeshData_t; + typedef UniformRectilinearMesh < MeshTraits_t > Mesh_t; + typedef Vector < CDim, T > SpacingsType_t; +}; +template < int Dim > class NoMeshData:public RefCounted +{ +public:NoMeshData () + { + } + template < class Layout > + explicit NoMeshData (const Layout & + layout):physicalVertexDomain_m (layout. + innerDomain ()), + physicalCellDomain_m (shrinkRight (physicalVertexDomain_m, 1)), + totalVertexDomain_m (layout.domain ()), + totalCellDomain_m (shrinkRight (totalVertexDomain_m, 1)) + { + } +private:Interval < Dim > physicalVertexDomain_m, physicalCellDomain_m; + Interval < Dim > totalVertexDomain_m, totalCellDomain_m; +}; + +template < class MeshTraits > class UniformRectilinearMeshData:public NoMeshData < + MeshTraits:: + dimensions > +{ +public:typedef typename + MeshTraits::MeshData_t + MeshData_t; + typedef typename + MeshTraits::PointType_t + PointType_t; + typedef typename + MeshTraits::SpacingsType_t + SpacingsType_t; + enum + { + dimensions = MeshTraits::dimensions + }; + template < class Layout > UniformRectilinearMeshData (const Layout & layout, + const PointType_t & + origin, + const SpacingsType_t & + spacings): + NoMeshData < + dimensions > (layout), + origin_m (origin), + spacings_m (spacings) + { + } +private:PointType_t origin_m; + SpacingsType_t + spacings_m; +}; + +template < class MeshTraits > class UniformRectilinearMesh:public MeshTraits:: + CoordinateSystem_t +{ +public:typedef MeshTraits + MeshTraits_t; + typedef typename + MeshTraits::MeshData_t + MeshData_t; + typedef typename + MeshTraits::PointType_t + PointType_t; + typedef typename + MeshTraits::SpacingsType_t + SpacingsType_t; + enum + { + dimensions = MeshTraits::dimensions + }; + template < class Layout > + inline UniformRectilinearMesh (const Layout & layout, + const PointType_t & origin, + const SpacingsType_t & spacings): + data_m (new MeshData_t (layout, origin, spacings)) + { + } +private:RefCountedPtr < MeshData_t > data_m; +}; + +template < class MeshTraits > struct GenericURM +{ +}; +template < class MeshTraits > struct CartesianURM: + public + GenericURM < + MeshTraits > +{ +}; +template < int + dim, + class + MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag > struct ParallelTraits { + enum + { + Dim = dim + }; + typedef + GridLayout < + dim > + Layout_t; + typedef + MeshTraits < + dim, double, + MeshTag, + CoordinateSystemTag > + MeshTraits_t; + typedef typename + MeshTraits_t::Mesh_t + Mesh_t; + typedef + MultiPatch < + GridTag, + Remote < + Brick > > + Engine_t; +}; +template < class ComputeTraits > struct RhalkTraits: + public + ComputeTraits +{ + typedef typename + ComputeTraits::Mesh_t + Mesh_t; + typedef typename + ComputeTraits::Engine_t + Engine_t; + enum + { + Dim = ComputeTraits::Dim + }; + typedef + Centering < + Dim > + Centering_t; + typedef typename + Mesh_t::SpacingsType_t + Spacings_t; + typedef + Field < + Mesh_t, double, + Engine_t > + Scalar_t; +}; +enum +{ + Dim = 3 +}; +typedef + RhalkTraits < + ParallelTraits < + Dim, + UniformRectilinearTag, +CartesianTag > > + Traits_t; +Vector < Dim > origin; +Traits_t::Spacings_t spacings; +int +main (int argc, char **argv) +{ + Traits_t::Layout_t layout; + Traits_t::Mesh_t mesh (layout, origin, spacings); + Traits_t::Centering_t face = + canonicalCentering < Traits_t::Dim > (FaceType, Continuous); + Traits_t::Scalar_t v (face, layout, mesh); + for (int i = 0; i < Dim; ++i) + v.center (i).all () = std::numeric_limits < double >::signaling_NaN (); +} |