1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/* Language-independent APIs to enable/disable per-location warnings.
Copyright (C) 2021-2022 Free Software Foundation, Inc.
Contributed by Martin Sebor <msebor@redhat.com>
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#ifndef DIAGNOSTIC_SPEC_H_INCLUDED
#define DIAGNOSTIC_SPEC_H_INCLUDED
#include "hash-map.h"
/* A "bitset" of warning groups. */
class nowarn_spec_t
{
public:
enum
{
/* Middle end warnings about invalid accesses. */
NW_ACCESS = 1 << 0,
/* Front end/lexical warnings. */
NW_LEXICAL = 1 << 1,
/* Warnings about null pointers. */
NW_NONNULL = 1 << 2,
/* Warnings about uninitialized reads. */
NW_UNINIT = 1 << 3,
/* Warnings about arithmetic overflow. */
NW_VFLOW = 1 << 4,
/* Warnings about dangling pointers. */
NW_DANGLING = 1 << 5,
/* All other unclassified warnings. */
NW_OTHER = 1 << 6,
/* All groups of warnings. */
NW_ALL = (NW_ACCESS | NW_LEXICAL | NW_NONNULL
| NW_UNINIT | NW_VFLOW | NW_DANGLING | NW_OTHER)
};
nowarn_spec_t (): m_bits () { }
nowarn_spec_t (opt_code);
/* Return the raw bitset. */
operator unsigned() const
{
return m_bits;
}
/* Return true if the bitset is clear. */
bool operator!() const
{
return !m_bits;
}
/* Return the inverse of the bitset. */
nowarn_spec_t operator~() const
{
nowarn_spec_t res (*this);
res.m_bits &= ~NW_ALL;
return res;
}
/* Set *THIS to the bitwise OR of *THIS and RHS. */
nowarn_spec_t& operator|= (const nowarn_spec_t &rhs)
{
m_bits |= rhs.m_bits;
return *this;
}
/* Set *THIS to the bitwise AND of *THIS and RHS. */
nowarn_spec_t& operator&= (const nowarn_spec_t &rhs)
{
m_bits &= rhs.m_bits;
return *this;
}
/* Set *THIS to the bitwise exclusive OR of *THIS and RHS. */
nowarn_spec_t& operator^= (const nowarn_spec_t &rhs)
{
m_bits ^= rhs.m_bits;
return *this;
}
private:
/* Bitset of warning groups. */
unsigned m_bits;
};
/* Return the bitwise OR of LHS and RHS. */
inline nowarn_spec_t
operator| (const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
{
return nowarn_spec_t (lhs) |= rhs;
}
/* Return the bitwise AND of LHS and RHS. */
inline nowarn_spec_t
operator& (const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
{
return nowarn_spec_t (lhs) &= rhs;
}
/* Return true if LHS is equal RHS. */
inline bool
operator== (const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
{
return static_cast<unsigned>(lhs) == static_cast<unsigned>(rhs);
}
/* Return true if LHS is not equal RHS. */
inline bool
operator!= (const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
{
return !(lhs == rhs);
}
typedef hash_map<location_hash, nowarn_spec_t> nowarn_map_t;
/* A mapping from a 'location_t' to the warning spec set for it. */
extern GTY(()) nowarn_map_t *nowarn_map;
#endif // DIAGNOSTIC_SPEC_H_INCLUDED
|