2015-03-21 1 views
1

J'ai un problème dans ce code - qui peut être copié 1: 1 dans un fichier cpp afin de tester la comporter:gcc 4.9.2 bug dans -Wmissing-champ-initialiseurs?

#include <atomic> 

typedef struct 
{ 
    char    sDateTime [20]; 
    char    sLogFileDirectory [300]; 
    char    sLogFileNameTemplate [300]; 
    char    sLogOutput [10][100]; 
    std::atomic<bool> bReadyToFlush; 
} LogEntries; 

typedef struct 
{ 
    LogEntries    leLogEntries [1] {}; 
} LogThreads; 

avec gcc 4.9.2 Compiler SLES 11 SP2 g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -c Je reçois ces très étranges avertissements:

gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sDateTime’ [-Wmissing-field-initializers] 
    LogEntries leLogEntries [1] {}; 
           ^
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileDirectory’ [-Wmissing-field-initializers] 
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileNameTemplate’ [-Wmissing-field-initializers] 
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogOutput’ [-Wmissing-field-initializers] 
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::bReadyToFlush’ [-Wmissing-field-initializers] 

Ajout du {} initialiseur dans cette ligne

std::atomic<bool> bReadyToFlush {}; 

même g ++ se plaint dans le 1er avertissement sur LogEntries::sDateTime alors les avertissements ont disparu.

L'avertissement est également parti lorsque je supprime la ligne std::atomic<bool>. Le code est très simple. quand vous avez g ++ 4.9.2 vérifiez - c'est vraiment très étrange.

EDIT: Peu importe à quel membre LogEntries struct-je ajouter le {} initialiseur les mises en garde sont partis.

Comment cela peut-il être expliqué? Pour moi, il est un bug ...

PS: je le considère comme un bug: Changer le spécificateur de tableau dans cette ligne à 1000:

LogEntries    leLogEntries [1000] {}; 

g ++ produira 5'000 avertissements! Je suppose que cela n'a pas vraiment de sens de répéter l'avertissement pour chaque valeur de tableau.

+0

Que diriez-vous d'écrire du code de style C++? ('typedef struct {...} name; 'ne peut pas être trouvé dans un tutoriel C++ que je connais) – Walter

+0

@Walter: Ceci est un projet écrit en code C pur pour CUDA de NVIDIA. Depuis que CUDA 7.0 a été publié mardi dernier, je suis en train de migrer étape par étape le code en C++ 11 standard. Merci pour cette remarque mais ce n'est pas le moment pour le moment. –

+0

@Walter: Je suis d'accord avec Al. Faire le changement trivial que vous suggérez ne change pas le comportement du compilateur. La définition de la structure de l'OP est après tout C++ valide. – TonyK

Répondre

2

MISE À JOUR:

Le 1er cas est maintenant confirmé par GNU est un bug mais déjà fixé dans gcc 5,0

L'ICE [Erreur du compilateur interne] est maintenant dans la base de données de bogueGNU bug database

Cela semble être un bug. Je jouais maintenant un peu autour et je reçois après une modification le message du compilateur gcc arrêté en raison d'une erreur interne.

MISE À JOUR: Comme demandé le code qui ne peut pas être compilé par gcc. Options du compilateur: g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -Werror -fno-strict-aliasing -fwrapv -fno-aggressive-loop-optimizations -c - certaines options sont disponibles car GNU le demande pour un rapport de bug.

#include <atomic> 

class LogEntries 
{ 
public: 
    char    sDateTime [20]; 
    std::atomic<bool> bReadyToFlush; 
}; 

class LogThreads 
{ 
public: 
    static LogEntries leLogEntries [10]; 
}; 

LogEntries LogThreads::leLogEntries [10] {}; 

échoue compilateur avec cette sortie:

gcc-warning-bug.cpp:16:43: internal compiler error: in gimplify_init_constructor, at gimplify.c:4007 
.... 
Please submit a full bug report, 
with preprocessed source if appropriate. 
Please include the complete backtrace with any bug report. 
See <http://gcc.gnu.org/bugs.html> for instructions. 

Je préparerai l'exemple de code et de le soumettre à l'équipe de développement. Dans mon projet, le membre leLogEntries est statique.

Lorsque vous supprimez la ligne std::atomic alors cela fonctionne -> problème dans l'implémentation std::atomic?

+0

Pouvez-vous nous montrer le code s'il vous plaît? – TonyK

+0

@TonyK: J'ai mis à jour la réponse avec le code. –