1/* @title: Compiler Identification */
2#pragma once
3
4/*
5 * cn_* "Compiler Name", cn_id_* "Compiler Identity"
6 */
7
8#if defined(__has_builtin)
9#define cn_has_builtin(x) __has_builtin(x)
10#else
11#define cn_has_builtin(x) 0
12#endif
13
14#if defined(__has_attribute)
15#define cn_has_attribute(x) __has_attribute(x)
16#else
17#define cn_has_attribute(x) 0
18#endif
19
20#if defined(__has_feature)
21#define cn_has_feature(x) __has_feature(x)
22#else
23#define cn_has_feature(x) 0
24#endif
25
26#if defined(__has_extension)
27#define cn_has_extension(x) __has_extension(x)
28#else
29#define cn_has_extension(x) 0
30#endif
31
32#if defined(__has_warning)
33#define cn_has_warning(x) __has_warning(x)
34#else
35#define cn_has_warning(x) 0
36#endif
37
38#if defined(__has_include)
39#define cn_has_include(x) __has_include(x)
40#else
41#define cn_has_include(x) 0
42#endif
43
44/* ==== Compiler Identity (cn_id_) ==== */
45
46#if defined(__clang__)
47#define cn_id_clang
48#define cn_id_clang_major __clang_major__
49#define cn_id_clang_minor __clang_minor__
50#define cn_id_clang_patch __clang_patchlevel__
51#define cn_id_clang_version \
52 ((__clang_major__ * 10000) + (__clang_minor__ * 100) + __clang_patchlevel__)
53#endif
54
55#if defined(__GNUC__) && !defined(__clang__)
56#define cn_id_gcc
57#define cn_id_gcc_major __GNUC__
58#define cn_id_gcc_minor __GNUC_MINOR__
59#define cn_id_gcc_patch __GNUC_PATCHLEVEL__
60#define cn_id_gcc_version \
61 ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__)
62#endif
63
64#if defined(cn_id_clang)
65#define cn_id_clang_at_least(maj, min) \
66 ((cn_id_clang_major > (maj)) || \
67 (cn_id_clang_major == (maj) && cn_id_clang_minor >= (min)))
68#else
69#define cn_id_clang_at_least(maj, min) 0
70#endif
71
72#if defined(cn_id_gcc)
73#define cn_id_gcc_at_least(maj, min) \
74 ((cn_id_gcc_major > (maj)) || \
75 (cn_id_gcc_major == (maj) && cn_id_gcc_minor >= (min)))
76#else
77#define cn_id_gcc_at_least(maj, min) 0
78#endif
79
80#if defined(cn_id_clang)
81#define cn_id_name "Clang"
82#endif
83
84#if defined(cn_id_gcc)
85#define cn_id_name "GCC"
86#endif
87
88#if !defined(cn_id_name)
89#define cn_id_name "Unknown"
90#endif
91