1//===-- lib/Parser/type-parser-implementation.h -----------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// Macros for implementing per-type parsers
10
11#ifndef FORTRAN_PARSER_TYPE_PARSER_IMPLEMENTATION_H_
12#define FORTRAN_PARSER_TYPE_PARSER_IMPLEMENTATION_H_
13
14#include "type-parsers.h"
15
16#undef TYPE_PARSER
17#undef TYPE_CONTEXT_PARSER
18
19// The result type of a parser combinator expression is determined
20// here via "decltype(attempt(pexpr))" to work around a g++ bug that
21// causes it to crash on "decltype(pexpr)" when pexpr's top-level
22// operator is an overridden || of parsing alternatives.
23#define TYPE_PARSER(pexpr) \
24 template <> \
25 auto Parser<typename decltype(attempt(pexpr))::resultType>::Parse( \
26 ParseState &state) \
27 ->std::optional<resultType> { \
28 static constexpr auto parser{(pexpr)}; \
29 return parser.Parse(state); \
30 }
31
32#define TYPE_CONTEXT_PARSER(contextText, pexpr) \
33 TYPE_PARSER(CONTEXT_PARSER((contextText), (pexpr)))
34
35#endif
36

source code of flang/lib/Parser/type-parser-implementation.h