summaryrefslogtreecommitdiff
path: root/test/FrontendC++/2008-10-29-WrongOffset.cpp
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-10-29 18:06:20 +0000
committerDuncan Sands <baldrick@free.fr>2008-10-29 18:06:20 +0000
commit492f04c20317bb4f46c7e4898b8467fb56e46be9 (patch)
treed0b42bb28489a77b81a96b77a5e4db396806df55 /test/FrontendC++/2008-10-29-WrongOffset.cpp
parentb99e740d71b68153284669c42ae9421d0f7e1cc2 (diff)
downloadllvm-492f04c20317bb4f46c7e4898b8467fb56e46be9.tar.gz
llvm-492f04c20317bb4f46c7e4898b8467fb56e46be9.tar.bz2
llvm-492f04c20317bb4f46c7e4898b8467fb56e46be9.tar.xz
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++/2008-10-29-WrongOffset.cpp')
-rw-r--r--test/FrontendC++/2008-10-29-WrongOffset.cpp489
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 0000000000..1b3be2132b
--- /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 > &centering, 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 ();
+}