| //===--- ParseReflect.cpp - C++26 Reflection Parsing ---------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements parsing for reflection facilities. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/AST/LocInfoType.h" |
| #include "clang/Basic/DiagnosticParse.h" |
| #include "clang/Parse/Parser.h" |
| #include "clang/Sema/EnterExpressionEvaluationContext.h" |
| using namespace clang; |
| |
| ExprResult Parser::ParseCXXReflectExpression() { |
| // TODO(reflection) : support parsing for global namespace, |
| // reflection-name, id-expression and remaining supports for |
| // type-id (placeholder type, alias template, etc.) |
| EnterExpressionEvaluationContext Unevaluated( |
| Actions, Sema::ExpressionEvaluationContext::Unevaluated); |
| assert(Tok.is(tok::caretcaret)); |
| SourceLocation CaretCaretLoc = ConsumeToken(); |
| SourceLocation OperandLoc = Tok.getLocation(); |
| |
| if (isCXXTypeId(TentativeCXXTypeIdContext::AsReflectionOperand)) { |
| TypeResult TR = ParseTypeName(/*TypeOf=*/nullptr); |
| if (TR.isInvalid()) |
| return ExprError(); |
| |
| TypeSourceInfo *TSI = nullptr; |
| QualType QT = Actions.GetTypeFromParser(TR.get(), &TSI); |
| |
| if (QT.isNull()) |
| return ExprError(); |
| |
| if (!TSI) |
| TSI = Actions.getASTContext().getTrivialTypeSourceInfo(QT, OperandLoc); |
| |
| QT = QT.getCanonicalType().getUnqualifiedType(); |
| if (TSI && QT.getTypePtr()->isBuiltinType()) { |
| // Only supports builtin types for now |
| return Actions.ActOnCXXReflectExpr(CaretCaretLoc, TSI); |
| } |
| } |
| |
| Diag(OperandLoc, diag::err_cannot_reflect_operand); |
| return ExprError(); |
| } |