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