mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-09 23:45:36 +00:00
Log the bug report code into the git repo.
This commit is contained in:
parent
9386522543
commit
8e1b5dda4b
23
gcc-bug-report/README
Normal file
23
gcc-bug-report/README
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153
|
||||||
|
|
||||||
|
Grid code breaks on GCC4.8, 4.9, 5.0 due to the
|
||||||
|
peekIndex<n> operating on lattice.
|
||||||
|
|
||||||
|
It erroneously recurses back into the Lattice<obj> variant, even though
|
||||||
|
the lattice container is dropped.
|
||||||
|
|
||||||
|
Work around is possible; if the Lattice routine is given a disambiguating
|
||||||
|
name prefix, such as
|
||||||
|
|
||||||
|
latPeekIndex<n>
|
||||||
|
|
||||||
|
GCC5 works.
|
||||||
|
|
||||||
|
However this is ugly and for now I have submitted a bug report to see the reaction and
|
||||||
|
speed of fixing.
|
||||||
|
|
||||||
|
The simple testcase in this directory is the submitted bug report that encapsulates the
|
||||||
|
problem. The test case works with icpc and with clang++, but fails consistently on g++
|
||||||
|
current variants.
|
||||||
|
|
||||||
|
Peter
|
59
gcc-bug-report/broken.cc
Normal file
59
gcc-bug-report/broken.cc
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#include <vector>
|
||||||
|
#include <complex>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
typedef std::complex<double> ComplexD;
|
||||||
|
|
||||||
|
template <class T> class TypeMapper {
|
||||||
|
public:
|
||||||
|
enum { NestLevel = T::NestLevel };
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> class TypeMapper<ComplexD> {
|
||||||
|
public:
|
||||||
|
enum { NestLevel = 0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class obj> class Container {
|
||||||
|
public:
|
||||||
|
std::vector<obj> data;
|
||||||
|
Container(int size) : data (size){};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class obj> class Recursive {
|
||||||
|
public:
|
||||||
|
enum { NestLevel = TypeMapper<obj>::NestLevel + 1};
|
||||||
|
obj internal;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<int N,class obj,typename std::enable_if<N==obj::NestLevel >::type * = nullptr > auto function(const obj &arg)-> obj
|
||||||
|
{
|
||||||
|
std::cout<<"Leaf "<<obj::NestLevel<<std::endl;
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
template<int N,class obj,typename std::enable_if<N!=obj::NestLevel >::type * = nullptr > auto function(const obj &arg)-> obj
|
||||||
|
{
|
||||||
|
std::cout<<"Node "<<obj::NestLevel<<std::endl;
|
||||||
|
obj ret;
|
||||||
|
ret.internal=function<N>(arg.internal);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<int N,class obj> auto function(const Container<obj> & arg)-> Container<decltype(function<N>(arg.data[0]))>
|
||||||
|
{
|
||||||
|
Container<decltype(function<N>(arg.data[0]))> ret(arg.data.size());
|
||||||
|
for(int ss=0;ss<arg.data.size();ss++){
|
||||||
|
ret.data[ss] = function<N>(arg.data[ss]);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc,char **argv)
|
||||||
|
{
|
||||||
|
Container<Recursive<Recursive<ComplexD> > > array(10);
|
||||||
|
Container<Recursive<Recursive<ComplexD> > > ret(10);
|
||||||
|
|
||||||
|
ret = function<1>(array);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user