https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/123332
Emit the invalid note instead of nothing. >From 3b04b61f352684331c919e716eb1a3589f855125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Fri, 17 Jan 2025 14:11:08 +0100 Subject: [PATCH] [clang][bytecode] Fix rejecting invalid sizeof expressions Emit the invalid note instead of nothing. --- clang/lib/AST/ByteCode/Compiler.cpp | 9 ++++----- clang/test/AST/ByteCode/literals.cpp | 25 ++++++++++--------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 4bfb80589620c1..ebef706d5fbb6a 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -2056,6 +2056,9 @@ bool Compiler<Emitter>::VisitUnaryExprOrTypeTraitExpr( if (Kind == UETT_SizeOf || Kind == UETT_DataSizeOf) { QualType ArgType = E->getTypeOfArgument(); + if (DiscardResult) + return true; + // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, // the result is the size of the referenced type." if (const auto *Ref = ArgType->getAs<ReferenceType>()) @@ -2066,17 +2069,13 @@ bool Compiler<Emitter>::VisitUnaryExprOrTypeTraitExpr( Size = CharUnits::One(); else { if (ArgType->isDependentType() || !ArgType->isConstantSizeType()) - return false; + return this->emitInvalid(E); if (Kind == UETT_SizeOf) Size = ASTCtx.getTypeSizeInChars(ArgType); else Size = ASTCtx.getTypeInfoDataSizeInChars(ArgType).Width; } - - if (DiscardResult) - return true; - return this->emitConst(Size.getQuantity(), E); } diff --git a/clang/test/AST/ByteCode/literals.cpp b/clang/test/AST/ByteCode/literals.cpp index 3d415a93a392a5..fdf1a6820e4466 100644 --- a/clang/test/AST/ByteCode/literals.cpp +++ b/clang/test/AST/ByteCode/literals.cpp @@ -261,31 +261,26 @@ namespace SizeOf { } #if __cplusplus >= 201402L - constexpr int IgnoredRejected() { // ref-error {{never produces a constant expression}} + constexpr int IgnoredRejected() { // both-error {{never produces a constant expression}} int n = 0; sizeof(int[n++]); // both-warning {{expression result unused}} \ - // ref-note 2{{subexpression not valid in a constant expression}} + // both-note 2{{subexpression not valid in a constant expression}} return n; } - /// FIXME: This is rejected because the parameter so sizeof() is not constant. - /// produce a proper diagnostic. static_assert(IgnoredRejected() == 0, ""); // both-error {{not an integral constant expression}} \ - // ref-note {{in call to 'IgnoredRejected()'}} + // both-note {{in call to 'IgnoredRejected()'}} #endif #if __cplusplus >= 202002L /// FIXME: The following code should be accepted. - consteval int foo(int n) { // ref-error {{consteval function never produces a constant expression}} - return sizeof(int[n]); // ref-note 3{{not valid in a constant expression}} - } - constinit int var = foo(5); // ref-error {{not a constant expression}} \ - // ref-note 2{{in call to}} \ - // ref-error {{does not have a constant initializer}} \ - // ref-note {{required by 'constinit' specifier}} \ - // expected-error {{is not a constant expression}} \ - // expected-error {{does not have a constant initializer}} \ - // expected-note {{required by 'constinit' specifier}} \ + consteval int foo(int n) { // both-error {{consteval function never produces a constant expression}} + return sizeof(int[n]); // both-note 3{{not valid in a constant expression}} + } + constinit int var = foo(5); // both-error {{not a constant expression}} \ + // both-note 2{{in call to}} \ + // both-error {{does not have a constant initializer}} \ + // both-note {{required by 'constinit' specifier}} #endif }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits