libcody: Fix build for older GCC versions

Before CWG DR 1955 the controlling expression for an #elif must be
syntactically correct, meaning this won't compile with C++11 compilers
such as gcc 4.8:

The solution is to define __has_include(X) as 0 for compilers that don't
support it.

The second problem is that when <source_location> is found, it is used
without the std:: qualification.

libcody/ChangeLog:

	* internal.hh: Define fallback macros for __has_builtin and
	__has_include. Use __has_builtin for __builtin_FILE and
	__builtin_LINE. Define alias for std::source_location.
This commit is contained in:
Jonathan Wakely 2020-12-16 13:37:17 +00:00
parent 96d9670e88
commit 4e42f6ebf4

View File

@ -4,14 +4,23 @@
#include "cody.hh"
#ifndef __has_builtin
#define __has_builtin(X) 0
#endif
#ifndef __has_include
#define __has_include(X) 0
#endif
// C++
#if __GNUC__ >= 10
#if __has_builtin(__builtin_FILE) && __has_builtin(__builtin_LINE)
#define CODY_LOC_BUILTIN 1
#elif !defined (__has_include)
#elif __has_include (<source_location>)
#include <source_location>
#ifdef __cpp_lib_source_location
#define CODY_LOC_SOURCE 1
#endif
#endif
// C
#include <cstdio>
@ -44,6 +53,8 @@ public:
}
#if !CODY_LOC_BUILTIN && CODY_LOC_SOURCE
using source_location = std::source_location;
constexpr Location (source_location loc = source_location::current ())
: Location (loc.file (), loc.line ())
{