[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