[cfe-users] Possible C++ template instantiation bug?
Andreas Schäfer
gentryx at gmx.de
Mon Aug 19 14:46:01 PDT 2013
Filed under http://llvm.org/bugs/show_bug.cgi?id=16936
On 22:50 Tue 13 Aug , Andreas Schäfer wrote:
> Dear clang developers,
>
> I was investigating whether our computer simulation library
> LibGeoDecomp would work with clang++, when I noticed that some of the
> unit tests were failing. Apparently clang++ handles partial
> specialization of member function templates in combination with
> inheritance differently from other compilers (e.g. g++ and icpc).
>
> I've tried to come up with a minimal test program which reproduces the
> odd behavior (attached). Having been pruned so much, the program
> itself doesn't make much sense. It was originally part of our code
> which handles boundary conditions. IMHO the program should yield the
> output "function2" twice, but with clang++ I get "function5" for the
> first invocation. Is this a bug in clang++, or is this simply
> undefined behavior?
>
> Reproduction:
> -------------
>
> icpc test3.cpp -o test && ./test && echo "-------------------------" && g++ test3.cpp -o test && ./test && echo "------------" && clang++ test3.cpp -o test && ./test
>
> Output:
> -------
>
> function2
> function2
> -------------------------
> function2
> function2
> ------------
> function5
> function2
>
> Thanks!
> -Andreas
>
>
> --
> ==========================================================
> Andreas Schäfer
> HPC and Grid Computing
> Chair of Computer Science 3
> Friedrich-Alexander-Universität Erlangen-Nürnberg, Germany
> +49 9131 85-27910
> PGP/GPG key via keyserver
> http://www.libgeodecomp.org
> ==========================================================
>
> (\___/)
> (+'.'+)
> (")_(")
> This is Bunny. Copy and paste Bunny into your
> signature to help him gain world domination!
> #include <iostream>
>
> template<int X=0, int Y=0, int Z=0>
> class FixedCoord
> {};
>
> template<typename CELL, bool FLAG>
> class MyWest
> {
> public:
> void access(MyWest) const
> {
> std::cout << "function1\n";
> }
> };
>
> template<typename CELL>
> class MyWest<CELL, true>
> {
> public:
> const CELL access(FixedCoord<-1, -1, 0>, const CELL **lines) const
> {
> std::cout << "function2\n";
> return 2;
> }
> };
>
> template<typename CELL, bool FLAG>
> class MyTop
> {
> public:
> void access(MyTop) const
> {
> std::cout << "function3\n";
> }
> };
>
> template<typename CELL>
> class MyTop<CELL, true>
> {
> public:
> template<int X>
> const CELL access(FixedCoord< X, -1, 0>, const CELL **lines) const
> {
> std::cout << "function4\n";
> return 4;
> }
> };
>
> template<typename CELL, bool BOUNDARY_WEST, bool BOUNDARY_TOP>
> class MyLinePointerNeighborhood :
> public MyWest< CELL, BOUNDARY_WEST>,
> public MyTop< CELL, BOUNDARY_TOP>
> {
> public:
> using MyWest< CELL, BOUNDARY_WEST >::access;
> using MyTop< CELL, BOUNDARY_TOP >::access;
>
> MyLinePointerNeighborhood(const CELL **lines) :
> lines(lines)
> {}
>
> template<int X, int Y, int Z>
> const CELL access(FixedCoord<X, Y, Z>, const CELL **lines) const
> {
> std::cout << "function5\n";
> return 5;
> }
>
> template<int X, int Y, int Z>
> const CELL operator[](FixedCoord<X, Y, Z>) const
> {
> return access(FixedCoord<X, Y, Z>(), lines);
> }
>
> private:
> const CELL **lines;
> };
>
> int main(int argc, char **argv)
> {
> int foo = -1;
>
> const int *pointers[] = {
> &foo
> };
>
> MyLinePointerNeighborhood<int, true, false> hood(pointers);
> hood[FixedCoord<-1, -1>()];
> hood.access(FixedCoord<-1, -1>(), pointers);
>
> return 0;
> }
> _______________________________________________
> cfe-users mailing list
> cfe-users at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users
--
==========================================================
Andreas Schäfer
HPC and Grid Computing
Chair of Computer Science 3
Friedrich-Alexander-Universität Erlangen-Nürnberg, Germany
+49 9131 85-27910
PGP/GPG key via keyserver
http://www.libgeodecomp.org
==========================================================
(\___/)
(+'.'+)
(")_(")
This is Bunny. Copy and paste Bunny into your
signature to help him gain world domination!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20130819/63cb6379/attachment.sig>
More information about the cfe-users
mailing list