llvm-project/clang/test/SemaCXX/diagnose_if-warning-group.cpp
Nikolas Klauser 0865ecc515
[clang] Extend diagnose_if to accept more detailed warning information, take 2 (#119712)
This is take two of #70976. This iteration of the patch makes sure that
custom
diagnostics without any warning group don't get promoted by `-Werror` or
`-Wfatal-errors`.

This implements parts of the extension proposed in
https://discourse.llvm.org/t/exposing-the-diagnostic-engine-to-c/73092/7.

Specifically, this makes it possible to specify a diagnostic group in an
optional third argument.
2025-01-28 08:41:31 +01:00

64 lines
2.7 KiB
C++

// RUN: %clang_cc1 %s -verify=expected,wall -fno-builtin -Wno-pedantic -Werror=comment -Wno-error=abi -Wfatal-errors=assume -Wno-fatal-errors=assume -Wno-format
// RUN: %clang_cc1 %s -verify=expected,wno-all,pedantic,format -fno-builtin -Wno-all -Werror=comment -Wno-error=abi -Werror=assume -Wformat
#define diagnose_if(...) __attribute__((diagnose_if(__VA_ARGS__)))
#ifndef EMTY_WARNING_GROUP
void bougus_warning() diagnose_if(true, "oh no", "warning", "bogus warning") {} // expected-error {{unknown warning group 'bogus warning'}}
void show_in_system_header() diagnose_if(true, "oh no", "warning", "assume", "Banane") {} // expected-error {{'diagnose_if' attribute takes no more than 4 arguments}}
#endif // EMTY_WARNING_GROUP
template <bool b>
void diagnose_if_wcomma() diagnose_if(b, "oh no", "warning", "comma") {}
template <bool b>
void diagnose_if_wcomment() diagnose_if(b, "oh no", "warning", "comment") {}
void empty_warning_group() diagnose_if(true, "oh no", "warning", "") {} // expected-error {{unknown warning group ''}}
void empty_warning_group_error() diagnose_if(true, "oh no", "error", "") {} // expected-error {{unknown warning group ''}}
void diagnose_if_wabi_default_error() diagnose_if(true, "ABI stuff", "error", "abi") {}
void diagnose_assume() diagnose_if(true, "Assume diagnostic", "warning", "assume") {}
void Wall() diagnose_if(true, "oh no", "warning", "all") {}
void Wpedantic() diagnose_if(true, "oh no", "warning", "pedantic") {}
void Wformat_extra_args() diagnose_if(true, "oh no", "warning", "format-extra-args") {}
void call() {
diagnose_if_wcomma<true>(); // expected-warning {{oh no}}
diagnose_if_wcomma<false>();
diagnose_if_wcomment<true>(); // expected-error {{oh no}}
diagnose_if_wcomment<false>();
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wcomma"
diagnose_if_wcomma<true>();
diagnose_if_wcomment<true>(); // expected-error {{oh no}}
#pragma clang diagnostic pop
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wcomment"
diagnose_if_wcomma<true>(); // expected-warning {{oh no}}
diagnose_if_wcomment<true>();
#pragma clang diagnostic pop
diagnose_if_wcomma<true>(); // expected-warning {{oh no}}
diagnose_if_wcomment<true>(); // expected-error {{oh no}}
diagnose_if_wabi_default_error(); // expected-warning {{ABI stuff}}
diagnose_assume(); // expected-error {{Assume diagnostic}}
// Make sure that the -Wassume diagnostic isn't fatal
diagnose_if_wabi_default_error(); // expected-warning {{ABI stuff}}
Wall(); // wall-warning {{oh no}}
Wpedantic(); // pedantic-warning {{oh no}}
Wformat_extra_args(); // format-warning {{oh no}}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat"
Wformat_extra_args();
#pragma clang diagnostic pop
}