Cppcheck
sourcelocation.h
Go to the documentation of this file.
1 /*
2  * Cppcheck - A tool for static C/C++ code analysis
3  * Copyright (C) 2007-2023 Cppcheck team.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #ifndef sourcelocationH
20 #define sourcelocationH
21 
22 #include "config.h"
23 
24 #ifdef __CPPCHECK__
25 #define CPPCHECK_HAS_SOURCE_LOCATION 0
26 #define CPPCHECK_HAS_SOURCE_LOCATION_TS 0
27 #define CPPCHECK_HAS_SOURCE_LOCATION_INTRINSICS 0
28 #else
29 
30 #if __has_include(<source_location>) && __cplusplus >= 202003L
31 #define CPPCHECK_HAS_SOURCE_LOCATION 1
32 #else
33 #define CPPCHECK_HAS_SOURCE_LOCATION 0
34 #endif
35 #if __has_include(<experimental/source_location>) && __cplusplus >= 201402L
36 #define CPPCHECK_HAS_SOURCE_LOCATION_TS 1
37 #else
38 #define CPPCHECK_HAS_SOURCE_LOCATION_TS 0
39 #endif
40 
41 #if __has_builtin(__builtin_FILE)
42 #define CPPCHECK_HAS_SOURCE_LOCATION_INTRINSICS 1
43 #if !__has_builtin(__builtin_COLUMN)
44 #define __builtin_COLUMN() 0
45 #endif
46 #else
47 #define CPPCHECK_HAS_SOURCE_LOCATION_INTRINSICS 0
48 #endif
49 
50 #endif
51 
52 #if CPPCHECK_HAS_SOURCE_LOCATION
53 #include <source_location>
54 using SourceLocation = std::source_location;
55 #elif CPPCHECK_HAS_SOURCE_LOCATION_TS
56 #include <experimental/source_location>
57 using SourceLocation = std::experimental::source_location;
58 #else
59 #include <cstdint>
61 #if CPPCHECK_HAS_SOURCE_LOCATION_INTRINSICS
62  static SourceLocation current(std::uint_least32_t line = __builtin_LINE(),
63  std::uint_least32_t column = __builtin_COLUMN(),
64  const char* file_name = __builtin_FILE(),
65  const char* function_name = __builtin_FUNCTION())
66  {
67  SourceLocation result{};
68  result.m_line = line;
69  result.m_column = column;
70  result.m_file_name = file_name;
71  result.m_function_name = function_name;
72  return result;
73  }
74 #else
76  return SourceLocation();
77  }
78 #endif
79  std::uint_least32_t m_line = 0;
80  std::uint_least32_t m_column = 0;
81  const char* m_file_name = "";
82  const char* m_function_name = "";
83  std::uint_least32_t line() const {
84  return m_line;
85  }
86  std::uint_least32_t column() const {
87  return m_column;
88  }
89  const char* file_name() const {
90  return m_file_name;
91  }
92  const char* function_name() const {
93  return m_function_name;
94  }
95 };
96 #endif
97 
98 #endif
std::uint_least32_t m_line
std::uint_least32_t column() const
static SourceLocation current()
const char * m_function_name
const char * function_name() const
const char * file_name() const
const char * m_file_name
std::uint_least32_t m_column
std::uint_least32_t line() const