coan
6.0.1
A C/C++ Configuration Analyzer
|
Class contradiction
handles contradictions between commandline options and directives.
More...
#include <contradiction.h>
Public Types | |
enum | cause { cause::DIFFERENTLY_REDEFING_D, cause::UNDEFING_D, cause::DEFINING_U } |
Reasons for reporting a contadiction. More... | |
Static Public Member Functions | |
static void | set_contradiction_policy (contradiction_policy p) |
Set the operative contradiction policy. More... | |
static void | forget () |
Forget about an apparent contradiction. More... | |
static void | flush () |
Discharge any pending contradiction. More... | |
static void | insert (cause why, std::string const &symname) |
Insert an error diagnostic into the output as a error directive or comment. More... | |
static void | save (cause why, std::string const &symname) |
Save diagnostic details of a potential contradiction. More... | |
static std::string const & | last_conflicted_symbol_id () |
Get the name of the latest #undef -ed symbol. More... | |
Static Private Member Functions | |
static void | insert_pending () |
Insert a stored error diagnostic into output. More... | |
Static Private Attributes | |
static contradiction_policy | _policy_ = CONTRADICTION_COMMENT |
The operative contradiction policy. | |
static unsigned | _policy_code_ |
The reason-code of diagnostics associated with the operative contradiction policy. | |
static std::string | _subst_text_ |
Text for substitution in output. More... | |
static std::string | _last_conflicted_symbol_ |
The name of the latest #undef -ed symbol. More... | |
static unsigned | _errored_lines_ |
The number of lines converted to error directives. | |
static unsigned | _unconditional_errored_lines_ |
The number of lines converted to unconditional error directives. | |
Class contradiction
handles contradictions between commandline options and directives.
The contradiction
class manages contradictions detected between commandline -D
or -U
options and in-source \#define
or #undef
directives.
If, for example, a commandline -DFOO
option is given and an #undef FOO
directive is parsed in-source, a contradiction arises. It will be handled in accordance with the specified or default --conflict
option.
Definition at line 60 of file contradiction.h.
|
strong |
Reasons for reporting a contadiction.
Enumerator | |
---|---|
DIFFERENTLY_REDEFING_D |
An in-souce |
UNDEFING_D |
An in-souce |
DEFINING_U |
An in-souce |
Definition at line 63 of file contradiction.h.
|
static |
Discharge any pending contradiction.
When an apparent contradiction transpires to be genuine in the light of the following input we have a pending diagnostic action to discharge. It will consist of writing a warning to cerr, unless warnings are suppressed, and inserting a diagnostic comment or error
in the output, unless the operative --conflict
policy is delete
. This function discharges any such the pending action and otherwise is a no-op.
Definition at line 80 of file contradiction.cpp.
|
static |
Forget about an apparent contradiction.
The function causes the program to forget about a contradiction that would be governed by the --conflict
policy when later input shows it to be innocuous. Its purpose is to cope with the complication created by the common precautionary idioms:
#undef FOO
#define FOO
and:
#undef FOO
#define FOO XYZ
These idioms may be encountered when FOO
is the subject of a --define
option. In this case the precautionary #undef FOO
will at first appear to conflict with that --define
, but the ensuing #define
will show that the conflict is only apparent.
To cater for these cases, we defer diagnostic action on the #undef
until we see what follows. If a #define
follows that agrees with the --define
options, with only whitespace and comments intervening, then we forget about the pending contradiction. This function clears the pending diagnostic action.
#undef
that is prima facie conflicting will always be be dropped, whether or not it is anulled by a following #define
. If is not anulled by a following #define
, then it will dropped because any of the 3 possible --conflict
policies will require it either to be simply dropped, or else dropped and replaced with a diagnostic insertion. If the #undef
is anulled by a following #define
, then both will be dropped because the #define
in isolation would be dropped. Definition at line 87 of file contradiction.cpp.
|
static |
Insert an error diagnostic into the output as a error
directive or comment.
why | The reason for the potential contradiction. |
symname | The name of symbol in the conflicting #define or #undef . |
The functions inserts a diagnostic as a error
directive or comment (depending on the operative --conflict
policy) to replace a #undef
or #define
directive that conflicts with a --define
or --undef
option. The diagnostic is also written as a warning to cerr.
Definition at line 74 of file contradiction.cpp.
|
staticprivate |
Insert a stored error diagnostic into output.
Insert a stored error diagnostic into the output as a error
directive or a comment (depending on the --conflict
policy) to replace a #undef
or #define
directive that conflicts with a --define
option. Reiterate the diagnostic as a warning on cerr.
If the --conflict delete
is in force, there will be no diagnostic to insert in output, but the diagnostic is still written to cerr
.
Definition at line 57 of file contradiction.cpp.
|
inlinestatic |
Get the name of the latest #undef
-ed symbol.
Return the symbol name that was undefined by the last #undef
directive that conflicts with a -define
option, if any.
Definition at line 168 of file contradiction.h.
|
static |
Save diagnostic details of a potential contradiction.
why | The reason for the potential contradiction. |
symname | The name of symbol in the conflicting #define or #undef . |
A potential contradiction can require confirmation after parsing further input. When an #undef
directive is read that conflicts with a --define
option, we will diagnose a conflict only if the #undef
is not followed by a #define
that agrees with the conflicting --define
. This function stores the relevant diagnostics for writing if the contradiction is confirmed. Otherwise the contradiction is forgotten.
Definition at line 93 of file contradiction.cpp.
|
inlinestatic |
Set the operative contradiction policy.
p | The contradiction policy to be applied. |
Definition at line 76 of file contradiction.h.
|
staticprivate |
The name of the latest #undef
-ed symbol.
The symbol name that was undefined by the last #undef
directive that conflicts with a --define
option, if any.
Definition at line 208 of file contradiction.h.
|
staticprivate |
Text for substitution in output.
The substitute text that will be inserted in output is placed of a contradicted directive.
Definition at line 200 of file contradiction.h.