clang W флаг порядка

Я заметил забавное поведение с clang (я использую 3.6.0), и я не нашел никаких упоминаний об этом ни в документации, ни где-либо еще. Вот небольшой пример:

int main(){
    int a;
    return 0;
}

Я компилирую его с помощью clang++ -Wall -W -Werror -Wno-error=unused-variable main.cpp и получаю ожидаемое предупреждение:

main.cpp:2:9: warning: unused variable 'a' [-Wunused-variable]
    int a;
1 warning generated.

Теперь попробуем clang++ -Werror -Wno-error=unused-variable -Wall -W main.cpp

main.cpp:2:9: error: unused variable 'a' [-Werror,-Wunused-variable]
    int a;
1 error generated.

Я что-то пропустил? Это ожидается? Если это имеет значение, gcc компилирует обе строки.


person Jeremad    schedule 06.08.2015    source источник
comment
Ваш первый пример должен быть ошибкой, так как у вас есть -Werror нет?   -  person NathanOliver    schedule 06.08.2015
comment
@NathanOliver нет, так как он указывает -Wno-error=unused-variable.   -  person The Paramagnetic Croissant    schedule 06.08.2015
comment
@ThePara MagneticCroissant спасибо за это. мой мозг почему-то видел -Werro.   -  person NathanOliver    schedule 06.08.2015
comment
@ Натан Оливер, нет проблем. Он действительно есть, но в особых случаях флаг -Wno-error= в принципе должен переопределять его.   -  person The Paramagnetic Croissant    schedule 06.08.2015
comment
Он также просто выдаст предупреждение при использовании clang++ -Wall -Werror -Wno-error=unused-variable -W main.cpp. живой пример   -  person NathanOliver    schedule 06.08.2015
comment
Это может быть ложный отрицательный результат, вызванный ошибкой в ​​порядке -Wno-error, а затем -Wall. Обширная и полная диагностика -Weverything (только clang) работает должным образом   -  person Marco A.    schedule 06.08.2015
comment
@МаркоА. действительно хороший улов! Я сообщу об этом в llvm   -  person Jeremad    schedule 06.08.2015
comment
Для всех, кто интересуется прогрессом: llvm.org/bugs/show_bug.cgi?id=24376 (было бы любезно не сообщать, как только ответ будет опубликован, и дать OP возможность опубликовать ответ самостоятельно).   -  person Marco A.    schedule 07.08.2015


Ответы (1)


Вот что мне ответили:

Я думаю, что лучшим заголовком было бы то, что -Wno-error зависит от позиции командной строки, а -Werror - нет. Важной частью является то, является ли диагностика ошибкой или предупреждением. На примере:

int main() {
  int a;
  return 0;
}

$ clang main.cpp -Wunused-variable

Это дает предупреждение о неиспользуемой переменной.

$ clang main.cpp -Werror -Wunused-variable
$ clang main.cpp -Wunused-variable -Werror

Оба они дают ошибку неиспользуемой переменной. -Werror не меняет поведение в зависимости от позиции.

$ clang main.cpp -Werror -Wno-error=unused-variable -Wunused-variable
$ clang main.cpp -Werror -Wunused-variable -Wno-error=unused-variable

Первый выдает ошибку, а второй выдает предупреждение. Это означает, что -Wno-error=* зависит от позиции. (GCC выдаст предупреждения для обеих этих строк.)

-Werror не взаимодействует и не зависит от предупреждений в командной строке. -Wno-error=warning зависит от его положения относительно -Wwarning.

Что меня вполне устраивает. Просто это надо где-то написать (может пропустил!)

person Jeremad    schedule 07.08.2015