================
@@ -6409,6 +6409,59 @@ static void handleRequiresCapabilityAttr(Sema &S, Decl
*D,
D->addAttr(RCA);
}
+static void handleCxx26AnnotationAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
+ Expr *CE = AL.getArgAsExpr(0);
+ if (CE->isLValue()) {
+ if (CE->getType()->isRecordType()) {
+ InitializedEntity Entity = InitializedEntity::InitializeTemporary(
+ CE->getType().getUnqualifiedType());
+ InitializationKind Kind =
+ InitializationKind::CreateCopy(CE->getExprLoc(), SourceLocation());
+ InitializationSequence Seq(S, Entity, Kind, CE);
+
+ ExprResult CopyResult = Seq.Perform(S, Entity, Kind, CE);
+ if (CopyResult.isInvalid())
+ return;
+
+ CE = CopyResult.get();
+ } else {
+ ExprResult RVExprResult = S.DefaultLvalueConversion(AL.getArgAsExpr(0));
+ assert(!RVExprResult.isInvalid() && RVExprResult.get());
+
+ CE = RVExprResult.get();
+ }
+ }
+
+ Expr::EvalResult Result;
+
+ SmallVector<PartialDiagnosticAt, 4> Notes;
+ Result.Diag = &Notes;
+
+ if (!CE->isValueDependent()) {
+ ConstantExprKind CEKind =
+ (CE->getType()->isClassType()
+ ? ConstantExprKind::ClassTemplateArgument
+ : ConstantExprKind::NonClassTemplateArgument);
+
+ if (!CE->EvaluateAsConstantExpr(Result, S.Context, CEKind)) {
+ S.Diag(CE->getBeginLoc(), diag::err_attribute_argument_type)
+ << "C++26 annotation" << 4 << CE->getSourceRange();
+ for (auto P : Notes)
+ S.Diag(P.first, P.second);
+
+ return;
+ } else if (!CE->getType()->isStructuralType()) {
----------------
tbaederr wrote:
Don't need the `else` here.
https://github.com/llvm/llvm-project/pull/166287
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits