[flang] clean up for push
Original-commit: flang-compiler/f18@8b5bbcedba Reviewed-on: https://github.com/flang-compiler/f18/pull/111 Tree-same-pre-rewrite: false
This commit is contained in:
parent
4c11bc07d4
commit
efcbf1f7df
|
@ -85,7 +85,7 @@ template<typename... LAMBDAS> visitors(LAMBDAS... x)->visitors<LAMBDAS...>;
|
|||
// Invoke CLASS_TRAIT(traitName) to define a trait, then put
|
||||
// using traitName = std::true_type; (or false_type)
|
||||
// into the appropriate class definitions. You can then use
|
||||
// typename std::enable_if<traitName<...>, ...>::type
|
||||
// typename std::enable_if_t<traitName<...>, ...>
|
||||
// in template specialization definitions.
|
||||
#define CLASS_TRAIT(T) \
|
||||
namespace class_trait_ns_##T { \
|
||||
|
@ -94,14 +94,12 @@ template<typename... LAMBDAS> visitors(LAMBDAS... x)->visitors<LAMBDAS...>;
|
|||
template<typename A> \
|
||||
constexpr bool has_trait{decltype(test<A>(nullptr))::value}; \
|
||||
template<typename A> \
|
||||
constexpr typename std::enable_if<has_trait<A>, bool>::type \
|
||||
trait_value() { \
|
||||
constexpr typename std::enable_if_t<has_trait<A>, bool> trait_value() { \
|
||||
using U = typename A::T; \
|
||||
return U::value; \
|
||||
} \
|
||||
template<typename A> \
|
||||
constexpr typename std::enable_if<!has_trait<A>, bool>::type \
|
||||
trait_value() { \
|
||||
constexpr typename std::enable_if_t<!has_trait<A>, bool> trait_value() { \
|
||||
return false; \
|
||||
} \
|
||||
} \
|
||||
|
|
|
@ -18,7 +18,6 @@ add_library(FortranEvaluate
|
|||
integer.cc
|
||||
logical.cc
|
||||
real.cc
|
||||
type.cc
|
||||
)
|
||||
|
||||
target_link_libraries(FortranEvaluate
|
||||
|
|
|
@ -16,13 +16,14 @@
|
|||
#define FORTRAN_EVALUATE_COMMON_H_
|
||||
|
||||
#include "../common/enum-set.h"
|
||||
#include "../common/idioms.h"
|
||||
#include <cinttypes>
|
||||
|
||||
namespace Fortran::evaluate {
|
||||
|
||||
// Integers are always ordered; reals may not be.
|
||||
enum class Ordering { Less, Equal, Greater };
|
||||
enum class Relation { Less, Equal, Greater, Unordered };
|
||||
ENUM_CLASS(Ordering, Less, Equal, Greater)
|
||||
ENUM_CLASS(Relation, Less, Equal, Greater, Unordered)
|
||||
|
||||
static constexpr Ordering CompareUnsigned(std::uint64_t x, std::uint64_t y) {
|
||||
if (x < y) {
|
||||
|
@ -64,13 +65,8 @@ static constexpr Relation Reverse(Relation relation) {
|
|||
}
|
||||
}
|
||||
|
||||
enum class RealFlag {
|
||||
Overflow,
|
||||
DivideByZero,
|
||||
InvalidArgument,
|
||||
Underflow,
|
||||
Inexact
|
||||
};
|
||||
ENUM_CLASS(
|
||||
RealFlag, Overflow, DivideByZero, InvalidArgument, Underflow, Inexact)
|
||||
|
||||
using RealFlags = common::EnumSet<RealFlag, 5>;
|
||||
|
||||
|
@ -83,7 +79,7 @@ template<typename A> struct ValueWithRealFlags {
|
|||
RealFlags flags;
|
||||
};
|
||||
|
||||
enum class Rounding { TiesToEven, ToZero, Down, Up, TiesAwayFromZero };
|
||||
ENUM_CLASS(Rounding, TiesToEven, ToZero, Down, Up, TiesAwayFromZero)
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
constexpr bool IsHostLittleEndian{false};
|
||||
|
|
|
@ -16,10 +16,13 @@
|
|||
#define FORTRAN_EVALUATE_EXPRESSION_H_
|
||||
|
||||
// Represent Fortran expressions in a type-safe manner.
|
||||
// Expressions are the sole owners of their constituents; there is no
|
||||
// Expressions are the sole owners of their constituents; i.e., there is no
|
||||
// context-independent hash table or sharing of common subexpressions.
|
||||
// Both deep copy and move semantics are supported for expression construction.
|
||||
// Both deep copy and move semantics are supported for expression construction
|
||||
// and manipulation in place.
|
||||
// TODO: variable and function references
|
||||
// TODO: elevate some intrinsics to operations
|
||||
// TODO: convenience wrappers for constructing conversions
|
||||
|
||||
#include "common.h"
|
||||
#include "type.h"
|
||||
|
@ -41,7 +44,7 @@ struct AnyCharacterExpr;
|
|||
struct AnyIntegerOrRealExpr;
|
||||
|
||||
// Helper base classes to manage subexpressions, which are known as data members
|
||||
// named 'x' and (for binary operations) 'y'.
|
||||
// named 'x' and, for binary operations, 'y'.
|
||||
template<typename A> struct Unary {
|
||||
Unary(const A &a) : x{std::make_unique<A>(a)} {}
|
||||
Unary(std::unique_ptr<const A> &&a) : x{std::move(a)} {}
|
||||
|
@ -488,6 +491,9 @@ struct AnyIntegerOrRealExpr {
|
|||
};
|
||||
|
||||
// Convenience functions and operator overloadings for expression construction.
|
||||
// These definitions are created with temporary helper macros to reduce
|
||||
// C++ boilerplate. All combinations of lvalue and rvalue references are
|
||||
// allowed for operands.
|
||||
#define UNARY(FUNC, CONSTR) \
|
||||
template<typename A> A FUNC(const A &x) { return {typename A::CONSTR{x}}; }
|
||||
UNARY(Parentheses, Parentheses)
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "type.h"
|
||||
#include <string>
|
||||
|
||||
namespace Fortran::evaluate {
|
||||
|
||||
std::string CategoryName(Category c) {
|
||||
switch (c) {
|
||||
case Category::Integer: return "Integer";
|
||||
case Category::Real: return "Real";
|
||||
case Category::Complex: return "Complex";
|
||||
case Category::Logical: return "Logical";
|
||||
case Category::Character: return "Character";
|
||||
case Category::Derived: return "Derived";
|
||||
}
|
||||
return ""; // placate g++
|
||||
}
|
||||
} // namespace Fortran::evaluate
|
|
@ -24,21 +24,20 @@
|
|||
#include "integer.h"
|
||||
#include "logical.h"
|
||||
#include "real.h"
|
||||
#include "../common/idioms.h"
|
||||
#include <string>
|
||||
#include <variant>
|
||||
|
||||
namespace Fortran::evaluate {
|
||||
|
||||
enum class Category { Integer, Real, Complex, Logical, Character, Derived };
|
||||
|
||||
std::string CategoryName(Category);
|
||||
ENUM_CLASS(Category, Integer, Real, Complex, Logical, Character, Derived)
|
||||
|
||||
template<Category C, int KIND> struct TypeBase {
|
||||
static constexpr Category category{C};
|
||||
static constexpr int kind{KIND};
|
||||
static constexpr bool hasLen{false};
|
||||
static std::string Dump() {
|
||||
return CategoryName(category) + '(' + std::to_string(kind) + ')';
|
||||
return EnumToString(category) + '(' + std::to_string(kind) + ')';
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -969,18 +969,16 @@ private:
|
|||
// With a single argument that is a parser with a usable value of
|
||||
// type A, construct<T>(p) invokes T's explicit constructor T(A &&).
|
||||
template<class T, typename PA>
|
||||
constexpr
|
||||
typename std::enable_if<std::is_same_v<Success, typename PA::resultType>,
|
||||
Construct01<T, PA>>::type
|
||||
construct(const PA &parser) {
|
||||
constexpr std::enable_if_t<std::is_same_v<Success, typename PA::resultType>,
|
||||
Construct01<T, PA>>
|
||||
construct(const PA &parser) {
|
||||
return Construct01<T, PA>{parser};
|
||||
}
|
||||
|
||||
template<typename T, typename PA>
|
||||
constexpr
|
||||
typename std::enable_if<!std::is_same_v<Success, typename PA::resultType>,
|
||||
Construct1<T, PA>>::type
|
||||
construct(const PA &parser) {
|
||||
constexpr std::enable_if_t<!std::is_same_v<Success, typename PA::resultType>,
|
||||
Construct1<T, PA>>
|
||||
construct(const PA &parser) {
|
||||
return Construct1<T, PA>{parser};
|
||||
}
|
||||
|
||||
|
|
|
@ -35,17 +35,15 @@ namespace Fortran::parser {
|
|||
|
||||
// Default case for visitation of non-class data members and strings
|
||||
template<typename A, typename V>
|
||||
typename std::enable_if<!std::is_class_v<A> ||
|
||||
std::is_same_v<std::string, A>>::type
|
||||
Walk(const A &x, V &visitor) {
|
||||
std::enable_if_t<!std::is_class_v<A> || std::is_same_v<std::string, A>> Walk(
|
||||
const A &x, V &visitor) {
|
||||
if (visitor.Pre(x)) {
|
||||
visitor.Post(x);
|
||||
}
|
||||
}
|
||||
template<typename A, typename M>
|
||||
typename std::enable_if<!std::is_class_v<A> ||
|
||||
std::is_same_v<std::string, A>>::type
|
||||
Walk(A &x, M &mutator) {
|
||||
std::enable_if_t<!std::is_class_v<A> || std::is_same_v<std::string, A>> Walk(
|
||||
A &x, M &mutator) {
|
||||
if (mutator.Pre(x)) {
|
||||
mutator.Post(x);
|
||||
}
|
||||
|
@ -142,27 +140,27 @@ void Walk(std::pair<A, B> &x, M &mutator) {
|
|||
|
||||
// Trait-determined traversal of empty, tuple, union, and wrapper classes.
|
||||
template<typename A, typename V>
|
||||
typename std::enable_if<EmptyTrait<A>>::type Walk(const A &x, V &visitor) {
|
||||
std::enable_if_t<EmptyTrait<A>> Walk(const A &x, V &visitor) {
|
||||
if (visitor.Pre(x)) {
|
||||
visitor.Post(x);
|
||||
}
|
||||
}
|
||||
template<typename A, typename M>
|
||||
typename std::enable_if<EmptyTrait<A>>::type Walk(A &x, M &mutator) {
|
||||
std::enable_if_t<EmptyTrait<A>> Walk(A &x, M &mutator) {
|
||||
if (mutator.Pre(x)) {
|
||||
mutator.Post(x);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename A, typename V>
|
||||
typename std::enable_if<TupleTrait<A>>::type Walk(const A &x, V &visitor) {
|
||||
std::enable_if_t<TupleTrait<A>> Walk(const A &x, V &visitor) {
|
||||
if (visitor.Pre(x)) {
|
||||
Walk(x.t, visitor);
|
||||
visitor.Post(x);
|
||||
}
|
||||
}
|
||||
template<typename A, typename M>
|
||||
typename std::enable_if<TupleTrait<A>>::type Walk(A &x, M &mutator) {
|
||||
std::enable_if_t<TupleTrait<A>> Walk(A &x, M &mutator) {
|
||||
if (mutator.Pre(x)) {
|
||||
Walk(x.t, mutator);
|
||||
mutator.Post(x);
|
||||
|
@ -170,14 +168,14 @@ typename std::enable_if<TupleTrait<A>>::type Walk(A &x, M &mutator) {
|
|||
}
|
||||
|
||||
template<typename A, typename V>
|
||||
typename std::enable_if<UnionTrait<A>>::type Walk(const A &x, V &visitor) {
|
||||
std::enable_if_t<UnionTrait<A>> Walk(const A &x, V &visitor) {
|
||||
if (visitor.Pre(x)) {
|
||||
Walk(x.u, visitor);
|
||||
visitor.Post(x);
|
||||
}
|
||||
}
|
||||
template<typename A, typename M>
|
||||
typename std::enable_if<UnionTrait<A>>::type Walk(A &x, M &mutator) {
|
||||
std::enable_if_t<UnionTrait<A>> Walk(A &x, M &mutator) {
|
||||
if (mutator.Pre(x)) {
|
||||
Walk(x.u, mutator);
|
||||
mutator.Post(x);
|
||||
|
@ -185,14 +183,14 @@ typename std::enable_if<UnionTrait<A>>::type Walk(A &x, M &mutator) {
|
|||
}
|
||||
|
||||
template<typename A, typename V>
|
||||
typename std::enable_if<WrapperTrait<A>>::type Walk(const A &x, V &visitor) {
|
||||
std::enable_if_t<WrapperTrait<A>> Walk(const A &x, V &visitor) {
|
||||
if (visitor.Pre(x)) {
|
||||
Walk(x.v, visitor);
|
||||
visitor.Post(x);
|
||||
}
|
||||
}
|
||||
template<typename A, typename M>
|
||||
typename std::enable_if<WrapperTrait<A>>::type Walk(A &x, M &mutator) {
|
||||
std::enable_if_t<WrapperTrait<A>> Walk(A &x, M &mutator) {
|
||||
if (mutator.Pre(x)) {
|
||||
Walk(x.v, mutator);
|
||||
mutator.Post(x);
|
||||
|
|
Loading…
Reference in a new issue