• [^] # Re: Meilleurs erreurs

    Posté par (Mastodon) . En réponse au journal C++11 : sur le fil. Évalué à 2.

    Sur les erreurs, Clang restera meilleur que GCC sur un point : les erreurs liés aux macros. Quand une erreur est dû à une macro, GCC donne uniquement la ligne de l'instantiation de la macro, pas la ligne à l'intérieur de la macro. Clang lui est capable de donner la ligne de la macro concerné. Et comme je ne suis pas très clair, je vais donner un exemple.

    #define MACRO(type) do { \
     type var; \
     var++; \
    } while (0);
    struct foo {
    };
    int main() {
     MACRO(int);
     MACRO(struct foo);
     return 0;
    }
    
    

    Avec gcc 4.7.3 :

    $ gcc -Wall macro.c 
    macro.c: In function ‘main’:
    macro.c:12:3: error: wrong type argument to increment
    
    

    Avec clang 3.0 :

    $ clang -Wall macro.c 
    macro.c:12:3: error: cannot increment value of type 'struct foo'
     MACRO(struct foo);
     ^~~~~~~~~~~~~~~~~
    macro.c:3:6: note: expanded from:
     var++; \
     ~~~^
    1 error generated.
    
    

    Et ça, GCC ne pourra jamais le faire, à moins de revoir profondément son architecture. GCC appelle le préprocesseur dans un processus à part (comme toutes les étapes de la compilation) et donc perd les informations précises dans ce cas tandis que Clang fait toute la compilation dans un seul processus, lui permettant de suivre les informations.

    On pourrait faire le même genre d'exemple avec l'assembleur inline.