This site is currently read-only as we are migrating to Oracle Forums for an improved community experience. You will not be able to initiate activity until January 31st, when you will be able to use this site as normal.

    Forum Stats

  • 3,890,588 Users
  • 2,269,776 Discussions
  • 7,916,825 Comments

Discussions

std::index_sequence limited to 255 elements

koval
koval Member Posts: 72 Blue Ribbon

Studio 12.6 imposes a limit of 255 elements in std::index_sequence.

Trying to use more elements leads exeeds template nesting depth in the compiler.

#include <utility>using seq = std::make_index_sequence<256>;

Error:

"developerstudio12.6/lib/compilers/CC-gcc/include/c++/5.4.0/utility", line 215: Error: Templates nested too deeply (recursively?)."developerstudio12.6/lib/compilers/CC-gcc/include/c++/5.4.0/utility", line 215:     Where: While specializing "std::_Index_tuple<>"."developerstudio12.6/lib/compilers/CC-gcc/include/c++/5.4.0/utility", line 215:     Where: Specialized in std::_Build_index_tuple<...>."developerstudio12.6/lib/compilers/CC-gcc/include/c++/5.4.0/utility", line 215:     Where: Specialized in std::_Build_index_tuple<...>."developerstudio12.6/lib/compilers/CC-gcc/include/c++/5.4.0/utility", line 215:     Information: 254 contexts omitted...... many other similar messages

Seems like the implementation is linear which makes index_sequence of little use for things like processing compile-time string constants.

I have a library which encodes strings with template<char...> and I use it for building SQL queries at compile time. The resulting strings easily get over 255 characters and the processing requires using std::index_sequence.

With Studio 12.5 I used my own implementation of make_index_sequence (12.5 does not support index_sequence even with -std=c++14) but wanted to use library version with 12.6 as it is available. Seems like it is currently of no use for similar purposes as mine.

Comments

  • Steve.Clamage-Oracle
    Steve.Clamage-Oracle Oracle Studio C++ Project Lead Santa Clara, CA, USAMember Posts: 775
    edited Aug 7, 2017 1:28PM

    The compiler has a check on nested template depth to guard against runaway compilations when a template definition is infinitely recursive. Hitting the limit is generally friendlier than the compiler aborting when it runs out of memory.

    The compiler has an undocumented "Q option" (or "Wizard option") that lets you increase the allowed depth:

        -Qoption ccfe -tmpldepth=N

         -W0,-tmpldepth=N

    (Note W-zero, not W-oh)

    The two options are equivalent.

    N is an integer representing the desired maximum nesting level, where 256 is the default.

    koval
This discussion has been closed.