https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90855

            Bug ID: 90855
           Summary: OpenMP: collapse clause rejects template argument as
                    parameter
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: christian.men...@t-online.de
  Target Milestone: ---

Created attachment 46482
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46482&action=edit
preprocessed file

I implemented a template class containing parallelized, nested for-loops which
are collapsed using OpenMP collapse clause. This class is used by multiple
other classes which require different depths of collapsion. Therefore, I wanted
to implement the collapse parameter as a non-type template parameter, but this
leads to the following compiler error: collapse argument needs positive
constant integer expression

This requirement is also mentioned in the OpenMP specification, but a template
parameter of type int fulfills this requirement.

I wrote a minimal (not very reasonable) program causing the same error:

// @file main.cpp
#include <iostream>

template <int collapseDepth>
class Foo{
public:
    void print() {
#pragma omp parallel for collapse(collapseDepth)
        for (int x = 0; x < 1000; x++) {
            for (int y = 0; y < 1000; y++) {
                std::cout << "x: " << x << " y: " << y << std::endl;
            }
        }
    }
};

int main() {
    Foo<2> fooInstance;
    fooInstance.print();
}

Output generated by gcc -v -save-temps -fopenmp main.cpp

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --prefix=/lrz/sys/compilers/gcc/8.3
--enable-multilib --enable-languages=ada,c,c++,fortran,lto,go,objc,obj-c++
Thread model: posix
gcc version 8.3.0 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-mtune=generic'
'-march=x86-64' '-pthread'

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.3.0/cc1plus
-E -quiet -v -iprefix
/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/
-D_GNU_SOURCE -D_REENTRANT main.cpp -mtune=generic -march=x86-64 -fopenmp
-fpch-preprocess -o main.ii
ignoring nonexistent directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/include"
ignoring duplicate directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0"
ignoring duplicate directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/x86_64-pc-linux-gnu"
ignoring duplicate directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/backward"
ignoring duplicate directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/include"
ignoring duplicate directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/include-fixed"
ignoring nonexistent directory
"/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/x86_64-pc-linux-gnu

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/backward

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/include

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/x86_64-pc-linux-gnu/8.3.0/include-fixed
 /usr/local/include
 /lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../lib/gcc/../../include
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-mtune=generic'
'-march=x86-64' '-pthread'

/lrz/mnt/sys.x86_sles12/compilers/gcc/8.3/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.3.0/cc1plus
-fpreprocessed main.ii -quiet -dumpbase main.cpp -mtune=generic -march=x86-64
-auxbase main -version -fopenmp -o main.s
GNU C++14 (GCC) version 8.3.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 8.3.0, GMP version 6.1.0, MPFR version 3.1.4,
MPC version 1.0.3, isl version isl-0.18-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++14 (GCC) version 8.3.0 (x86_64-pc-linux-gnu)
        compiled by GNU C version 8.3.0, GMP version 6.1.0, MPFR version 3.1.4,
MPC version 1.0.3, isl version isl-0.18-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: e3a620bdbb2e7b865b8d75366fe9cc42
main.cpp: In member function ‘void Foo<collapseDepth>::print()’:
main.cpp:7:34: error: collapse argument needs positive constant integer
expression
 #pragma omp parallel for collapse(collapseDepth)
                                  ^

Reply via email to