================ @@ -0,0 +1,78 @@ +//===--- 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(SourceLocation DoubleCaretLoc) { + // TODO(reflection) : support parsing for more reflect-expressions. + EnterExpressionEvaluationContext Unevaluated( + Actions, Sema::ExpressionEvaluationContext::Unevaluated); + + CXXScopeSpec SS; + if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, + /*ObjectHasErrors=*/false, + /*EnteringContext=*/false)) { + SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); + return ExprError(); + } + + SourceLocation OperandLoc = Tok.getLocation(); + TentativeParsingAction TPA(*this); + + if (Tok.isOneOf(tok::identifier, tok::kw_operator, tok::kw_template, + tok::tilde, tok::annot_template_id)) { + // TODO(reflection) : support parsing for + // - type-name:: + // - nested-name-specifier identifier :: + // - namespace-name :: + // - nested-name-specifier template_opt simple-template-id + TPA.Revert(); + Diag(OperandLoc, diag::err_cannot_reflect_operand); + return ExprError(); + } else if (SS.isValid() && + SS.getScopeRep().getKind() == NestedNameSpecifier::Kind::Global) { + // global namespace ::. + TPA.Commit(); + Decl *TUDecl = Actions.getASTContext().getTranslationUnitDecl(); + return Actions.ActOnCXXReflectExpr(DoubleCaretLoc, SourceLocation(), + TUDecl); + } + TPA.Revert(); ---------------- Sirraide wrote:
The `TentativeParsingAction` isn’t doing anything at the moment since you’re not doing any parsing while it’s engaged; we might need it once we support more things, but we should add only at that point imo. https://github.com/llvm/llvm-project/pull/164692 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
