mirror of
https://github.com/Kitware/CMake.git
synced 2025-05-10 07:10:32 +08:00

While building CMake on EDG 603+-based compiler, such as LCC 1.27.x, an internal assertion failure may be experienced with a message like 'assertion failed at: "il.c", line 15635 in i_copy_dynamic_init'. This commit introduces a workaround that helps avoiding this. Workaround is enabled only for LCC based on this EDG frontend, it is not known if it is needed for any other compilers, since there were none found based on EDG 603 and later and having this bug.
77 lines
1.4 KiB
C++
77 lines
1.4 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#if defined(__SUNPRO_CC) || defined(__EDG__)
|
|
|
|
# include <string>
|
|
# include <vector>
|
|
|
|
namespace ArgumentParser {
|
|
|
|
template <typename T>
|
|
struct Maybe;
|
|
template <>
|
|
struct Maybe<std::string> : public std::string
|
|
{
|
|
using std::string::basic_string;
|
|
};
|
|
|
|
template <typename T>
|
|
struct MaybeEmpty;
|
|
# if defined(__LCC__) && (__EDG_VERSION__ >= 603)
|
|
template <>
|
|
struct MaybeEmpty<std::vector<std::string>> : public std::vector<std::string>
|
|
{
|
|
using std::vector<std::string>::vector;
|
|
};
|
|
# endif
|
|
template <typename T>
|
|
struct MaybeEmpty<std::vector<T>> : public std::vector<T>
|
|
{
|
|
using std::vector<T>::vector;
|
|
};
|
|
|
|
template <typename T>
|
|
struct NonEmpty;
|
|
template <typename T>
|
|
struct NonEmpty<std::vector<T>> : public std::vector<T>
|
|
{
|
|
using std::vector<T>::vector;
|
|
};
|
|
template <>
|
|
struct NonEmpty<std::string> : public std::string
|
|
{
|
|
using std::string::basic_string;
|
|
};
|
|
|
|
} // namespace ArgumentParser
|
|
|
|
#else
|
|
|
|
namespace ArgumentParser {
|
|
|
|
template <typename T>
|
|
struct Maybe : public T
|
|
{
|
|
using T::T;
|
|
};
|
|
|
|
template <typename T>
|
|
struct MaybeEmpty : public T
|
|
{
|
|
using T::T;
|
|
};
|
|
|
|
template <typename T>
|
|
struct NonEmpty : public T
|
|
{
|
|
using T::T;
|
|
};
|
|
|
|
} // namespace ArgumentParser
|
|
|
|
#endif
|