18 votes

GCC provoque un défaut de segmentation pour le paquet de paramètres capturés par lambda

J'ai le SSCCE suivant :

#include <iostream>
#include <string>

void foo(const std::string &a) {
  std::cout << a << std::endl;
}

template <typename... Args>
void bar(Args &&... args) {
  [&]() {
    [&]() {
          foo(args...);
      }();
  }();
}

int main() {
 const std::string x("Hello World!");
 bar(x);
}

Sous clang++ (3.9.1), cela compile et émet "Hello World". Gcc 6.3 échoue avec une erreur de segmentation sous -O3 .

Je peux résoudre le problème en passant explicitement le pointeur et le pack par référence, en remplaçant [&]() avec [&args...]() . Cependant, jusqu'à présent, je pensais que [&] ferait la même chose que de lister tous les arguments un par un.

Alors, qu'est-ce qui ne va pas ici ?

P.S : Ceci n'est pas limité à -O3 . -O0 n'est pas en défaut mais ne renvoie pas le résultat attendu ("Hello World !") :

[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out

[:~/tmp] $

P.P.S : Le SSCCE a encore été réduit. Maintenant, je n'obtiens même pas un diagnostic avec -Wall -Wextra plus.

9voto

AMA Points 2817

Je soupçonne fortement un bug de g++ .


Voici quelques notes :

erreur de compilation interne : in make_decl_rtl, at varasm.c:1304

...

S'il vous plaît soumettre un rapport de bogue complet, avec les sources prétraitées si nécessaire.

Veuillez inclure le backtrace complet avec tout rapport de bogue. Voir http://gcc.gnu.org/bugs.html pour les instructions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X