Author: Kirill Bobyrev Date: 2020-06-15T12:14:15+02:00 New Revision: 550c4562d18a6ab6ce60a062dceb163313da0ddd
URL: https://github.com/llvm/llvm-project/commit/550c4562d18a6ab6ce60a062dceb163313da0ddd DIFF: https://github.com/llvm/llvm-project/commit/550c4562d18a6ab6ce60a062dceb163313da0ddd.diff LOG: Revert "Prevent IR-gen from emitting consteval declarations" This reverts commit 3bab88b7baa20b276faaee0aa7ca87f636c91877. This patch causes test failures: http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/17260 Added: Modified: clang/lib/AST/Expr.cpp clang/lib/AST/ExprConstant.cpp clang/lib/CodeGen/CGCall.cpp clang/lib/CodeGen/CGDecl.cpp clang/lib/CodeGen/CGExpr.cpp clang/lib/CodeGen/CGExprAgg.cpp clang/lib/CodeGen/CGExprComplex.cpp clang/lib/CodeGen/CGExprConstant.cpp clang/lib/CodeGen/CGExprScalar.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CodeGenFunction.h clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/ConstantEmitter.h clang/lib/Sema/SemaExpr.cpp clang/test/SemaCXX/cxx2a-consteval.cpp Removed: clang/test/CodeGenCXX/cxx2a-consteval.cpp ################################################################################ diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 27a12b880a7b..89eb8e9c0220 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -272,7 +272,6 @@ void ConstantExpr::DefaultInit(ResultStorageKind StorageKind) { ConstantExprBits.ResultKind = StorageKind; ConstantExprBits.APValueKind = APValue::None; ConstantExprBits.HasCleanup = false; - ConstantExprBits.IsImmediateInvocation = false; if (StorageKind == ConstantExpr::RSK_APValue) ::new (getTrailingObjects<APValue>()) APValue(); } diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 870bf7696093..c8f1a92d0725 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -9986,6 +9986,8 @@ class IntExprEvaluator // Visitor Methods //===--------------------------------------------------------------------===// + bool VisitConstantExpr(const ConstantExpr *E); + bool VisitIntegerLiteral(const IntegerLiteral *E) { return Success(E->getValue(), E); } @@ -10767,6 +10769,13 @@ static bool tryEvaluateBuiltinObjectSize(const Expr *E, unsigned Type, return true; } +bool IntExprEvaluator::VisitConstantExpr(const ConstantExpr *E) { + llvm::SaveAndRestore<bool> InConstantContext(Info.InConstantContext, true); + if (E->getResultAPValueKind() != APValue::None) + return Success(E->getAPValueResult(), E); + return ExprEvaluatorBaseTy::VisitConstantExpr(E); +} + bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { if (unsigned BuiltinOp = E->getBuiltinCallee()) return VisitBuiltinCallExpr(E, BuiltinOp); diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 78a0ecef4f3f..17282e2bafe6 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1272,17 +1272,18 @@ static llvm::Value *CreateCoercedLoad(Address Src, llvm::Type *Ty, // store the elements rather than the aggregate to be more friendly to // fast-isel. // FIXME: Do we need to recurse here? -void CodeGenFunction::EmitAggregateStore(llvm::Value *Val, Address Dest, - bool DestIsVolatile) { +static void BuildAggStore(CodeGenFunction &CGF, llvm::Value *Val, + Address Dest, bool DestIsVolatile) { // Prefer scalar stores to first-class aggregate stores. - if (llvm::StructType *STy = dyn_cast<llvm::StructType>(Val->getType())) { + if (llvm::StructType *STy = + dyn_cast<llvm::StructType>(Val->getType())) { for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) { - Address EltPtr = Builder.CreateStructGEP(Dest, i); - llvm::Value *Elt = Builder.CreateExtractValue(Val, i); - Builder.CreateStore(Elt, EltPtr, DestIsVolatile); + Address EltPtr = CGF.Builder.CreateStructGEP(Dest, i); + llvm::Value *Elt = CGF.Builder.CreateExtractValue(Val, i); + CGF.Builder.CreateStore(Elt, EltPtr, DestIsVolatile); } } else { - Builder.CreateStore(Val, Dest, DestIsVolatile); + CGF.Builder.CreateStore(Val, Dest, DestIsVolatile); } } @@ -1333,7 +1334,7 @@ static void CreateCoercedStore(llvm::Value *Src, // If store is legal, just bitcast the src pointer. if (SrcSize <= DstSize) { Dst = CGF.Builder.CreateElementBitCast(Dst, SrcTy); - CGF.EmitAggregateStore(Src, Dst, DstIsVolatile); + BuildAggStore(CGF, Src, Dst, DstIsVolatile); } else { // Otherwise do coercion through memory. This is stupid, but // simple. @@ -5069,7 +5070,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, DestPtr = CreateMemTemp(RetTy, "agg.tmp"); DestIsVolatile = false; } - EmitAggregateStore(CI, DestPtr, DestIsVolatile); + BuildAggStore(*this, CI, DestPtr, DestIsVolatile); return RValue::getAggregate(DestPtr); } case TEK_Scalar: { diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index f2549769080e..52ed90d837fd 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -762,8 +762,9 @@ void CodeGenFunction::EmitScalarInit(const Expr *init, const ValueDecl *D, // If we're emitting a value with lifetime, we have to do the // initialization *before* we leave the cleanup scopes. - if (const ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(init)) - init = EWC->getSubExpr(); + if (const FullExpr *fe = dyn_cast<FullExpr>(init)) + init = fe->getSubExpr(); + CodeGenFunction::RunCleanupsScope Scope(*this); // We have to maintain the illusion that the variable is diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index bead7e8996c0..c8147ede93c9 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1302,15 +1302,8 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) { return EmitVAArgExprLValue(cast<VAArgExpr>(E)); case Expr::DeclRefExprClass: return EmitDeclRefLValue(cast<DeclRefExpr>(E)); - case Expr::ConstantExprClass: { - const ConstantExpr *CE = cast<ConstantExpr>(E); - if (llvm::Value *Result = ConstantEmitter(*this).tryEmitConstantExpr(CE)) { - QualType RetType = cast<CallExpr>(CE->getSubExpr()->IgnoreImplicit()) - ->getCallReturnType(getContext()); - return MakeNaturalAlignAddrLValue(Result, RetType); - } + case Expr::ConstantExprClass: return EmitLValue(cast<ConstantExpr>(E)->getSubExpr()); - } case Expr::ParenExprClass: return EmitLValue(cast<ParenExpr>(E)->getSubExpr()); case Expr::GenericSelectionExprClass: diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index fb96d70732e8..74702dda789d 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -127,11 +127,6 @@ class AggExprEmitter : public StmtVisitor<AggExprEmitter> { } void VisitConstantExpr(ConstantExpr *E) { - if (llvm::Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) { - CGF.EmitAggregateStore(Result, Dest.getAddress(), - E->getType().isVolatileQualified()); - return; - } return Visit(E->getSubExpr()); } diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index 13a571352137..1cf497c7dfda 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -13,7 +13,6 @@ #include "CGOpenMPRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" -#include "ConstantEmitter.h" #include "clang/AST/StmtVisitor.h" #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Constants.h" @@ -103,9 +102,6 @@ class ComplexExprEmitter } ComplexPairTy VisitExpr(Expr *S); ComplexPairTy VisitConstantExpr(ConstantExpr *E) { - if (llvm::Constant *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) - return ComplexPairTy(Result->getAggregateElement(0U), - Result->getAggregateElement(1U)); return Visit(E->getSubExpr()); } ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());} diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index a01571633f6c..0138edbb9df8 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1011,8 +1011,6 @@ class ConstExprEmitter : } llvm::Constant *VisitConstantExpr(ConstantExpr *CE, QualType T) { - if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(CE)) - return Result; return Visit(CE->getSubExpr(), T); } @@ -1360,20 +1358,6 @@ ConstantEmitter::tryEmitAbstract(const APValue &value, QualType destType) { return validateAndPopAbstract(C, state); } -llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) { - if (!CE->hasAPValueResult()) - return nullptr; - const Expr *Inner = CE->getSubExpr()->IgnoreImplicit(); - QualType RetType; - if (auto *Call = dyn_cast<CallExpr>(Inner)) - RetType = Call->getCallReturnType(CGF->getContext()); - else if (auto *Ctor = dyn_cast<CXXConstructExpr>(Inner)) - RetType = Ctor->getType(); - llvm::Constant *Res = - emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType); - return Res; -} - llvm::Constant * ConstantEmitter::emitAbstract(const Expr *E, QualType destType) { auto state = pushAbstract(); @@ -1919,8 +1903,6 @@ ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) { ConstantLValue ConstantLValueEmitter::VisitConstantExpr(const ConstantExpr *E) { - if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(E)) - return Result; return Visit(E->getSubExpr()); } diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index f48f7185b55f..6b33d807a7bd 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -419,12 +419,6 @@ class ScalarExprEmitter Value *VisitExpr(Expr *S); Value *VisitConstantExpr(ConstantExpr *E) { - if (Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) { - if (E->isGLValue()) - return CGF.Builder.CreateLoad(Address( - Result, CGF.getContext().getTypeAlignInChars(E->getType()))); - return Result; - } return Visit(E->getSubExpr()); } Value *VisitParenExpr(ParenExpr *PE) { diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index 672909849bb7..c9b8da1d4d39 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -1119,8 +1119,9 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) { SaveRetExprRAII SaveRetExpr(RV, *this); RunCleanupsScope cleanupScope(*this); - if (const auto *EWC = dyn_cast_or_null<ExprWithCleanups>(RV)) - RV = EWC->getSubExpr(); + if (const FullExpr *fe = dyn_cast_or_null<FullExpr>(RV)) + RV = fe->getSubExpr(); + // FIXME: Clean this up by using an LValue for ReturnTemp, // EmitStoreThroughLValue, and EmitAnyExpr. // Check if the NRVO candidate was not globalized in OpenMP mode. diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 273aa1c962c3..5dbaf2ee7281 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -4138,10 +4138,6 @@ class CodeGenFunction : public CodeGenTypeCache { /// aggregate type into a temporary LValue. LValue EmitAggExprToLValue(const Expr *E); - /// Build all the stores needed to initialize an aggregate at Dest with the - /// value Val. - void EmitAggregateStore(llvm::Value *Val, Address Dest, bool DestIsVolatile); - /// EmitExtendGCLifetime - Given a pointer to an Objective-C object, /// make sure it survives garbage collection until this point. void EmitExtendGCLifetime(llvm::Value *object); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 887df8a97f34..26d34fa293e4 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3336,8 +3336,6 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, bool ForVTable, bool DontDefer, ForDefinition_t IsForDefinition) { - assert(!cast<FunctionDecl>(GD.getDecl())->isConsteval() && - "consteval function should never be emitted"); // If there was no specific requested type, just convert it now. if (!Ty) { const auto *FD = cast<FunctionDecl>(GD.getDecl()); @@ -5332,11 +5330,6 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) { if (D->isTemplated()) return; - // Consteval function shouldn't be emitted. - if (auto *FD = dyn_cast<FunctionDecl>(D)) - if (FD->isConsteval()) - return; - switch (D->getKind()) { case Decl::CXXConversion: case Decl::CXXMethod: diff --git a/clang/lib/CodeGen/ConstantEmitter.h b/clang/lib/CodeGen/ConstantEmitter.h index 188b82e56f53..121acbac4fa9 100644 --- a/clang/lib/CodeGen/ConstantEmitter.h +++ b/clang/lib/CodeGen/ConstantEmitter.h @@ -110,8 +110,6 @@ class ConstantEmitter { llvm::Constant *tryEmitAbstract(const APValue &value, QualType T); llvm::Constant *tryEmitAbstractForMemory(const APValue &value, QualType T); - llvm::Constant *tryEmitConstantExpr(const ConstantExpr *CE); - llvm::Constant *emitNullForMemory(QualType T) { return emitNullForMemory(CGM, T); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 66a2ec1fe9dc..6965acdb6163 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -16139,7 +16139,7 @@ ExprResult Sema::CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl) { ConstantExpr *Res = ConstantExpr::Create( getASTContext(), E.get(), - ConstantExpr::getStorageKind(Decl->getReturnType().getTypePtr(), + ConstantExpr::getStorageKind(E.get()->getType().getTypePtr(), getASTContext()), /*IsImmediateInvocation*/ true); ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0); diff --git a/clang/test/CodeGenCXX/cxx2a-consteval.cpp b/clang/test/CodeGenCXX/cxx2a-consteval.cpp deleted file mode 100644 index 8856cb5fd765..000000000000 --- a/clang/test/CodeGenCXX/cxx2a-consteval.cpp +++ /dev/null @@ -1,210 +0,0 @@ -// NOTE: Assertions have been autogenerated by utils/update_test_checks.py -// RUN: %clang_cc1 -emit-llvm %s -std=c++2a -o %t.ll -// RUN: FileCheck -check-prefix=EVAL -input-file=%t.ll %s -// RUN: FileCheck -check-prefix=EVAL-FN -input-file=%t.ll %s -// RUN: FileCheck -check-prefix=EVAL-STATIC -input-file=%t.ll %s -// RUN: %clang_cc1 -emit-llvm %s -Dconsteval="" -std=c++2a -o %t.ll -// RUN: FileCheck -check-prefix=EXPR -input-file=%t.ll %s - -// there is two version of symbol checks to ensure -// that the symbol we are looking for are correct -// EVAL-NOT: @__cxx_global_var_init() -// EXPR: @__cxx_global_var_init() - -// EVAL-NOT: @_Z4ret7v() -// EXPR: @_Z4ret7v() -consteval int ret7() { - return 7; -} - -int test_ret7() { - // EVAL-FN-LABEL: @_Z9test_ret7v( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[I:%.*]] = alloca i32, align 4 - // EVAL-FN-NEXT: store i32 7, i32* [[I]], align 4 - // EVAL-FN-NEXT: [[TMP0:%.*]] = load i32, i32* [[I]], align 4 - // EVAL-FN-NEXT: ret i32 [[TMP0]] - // - int i = ret7(); - return i; -} - -// EVAL-STATIC: @global_i = global i32 7, align 4 -int global_i = ret7(); - -// EVAL-STATIC: @_ZL7i_const = internal constant i32 5, align 4 -constexpr int i_const = 5; - -// EVAL-NOT: @_Z4retIv() -// EXPR: @_Z4retIv() -consteval const int &retI() { - return i_const; -} - -const int &test_retRefI() { - // EVAL-FN-LABEL: @_Z12test_retRefIv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: ret i32* @_ZL7i_const - // - return retI(); -} - -int test_retI() { - // EVAL-FN-LABEL: @_Z9test_retIv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[TMP0:%.*]] = load i32, i32* @_ZL7i_const, align 4 - // EVAL-FN-NEXT: ret i32 [[TMP0]] - // - return retI(); -} - -// EVAL-NOT: @_Z4retIv() -// EXPR: @_Z4retIv() -consteval const int *retIPtr() { - return &i_const; -} - -int test_retIPtr() { - // EVAL-FN-LABEL: @_Z12test_retIPtrv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[TMP0:%.*]] = load i32, i32* @_ZL7i_const, align 4 - // EVAL-FN-NEXT: ret i32 [[TMP0]] - // - return *retIPtr(); -} - -const int *test_retPIPtr() { - // EVAL-FN-LABEL: @_Z13test_retPIPtrv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: ret i32* @_ZL7i_const - // - return retIPtr(); -} - -// EVAL-NOT: @_Z4retIv() -// EXPR: @_Z4retIv() -consteval const int &&retIRRef() { - return static_cast<const int &&>(i_const); -} - -const int &&test_retIRRef() { - return static_cast<const int &&>(retIRRef()); -} - -int test_retIRRefI() { - // EVAL-FN-LABEL: @_Z14test_retIRRefIv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[TMP0:%.*]] = load i32, i32* @_ZL7i_const, align 4 - // EVAL-FN-NEXT: ret i32 [[TMP0]] - // - return retIRRef(); -} - -struct Agg { - int a; - long b; -}; - -// EVAL-NOT: @_Z6retAggv() -// EXPR: @_Z6retAggv() -consteval Agg retAgg() { - return {13, 17}; -} - -long test_retAgg() { - // EVAL-FN-LABEL: @_Z11test_retAggv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 - // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 - // EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 0 - // EVAL-FN-NEXT: store i32 13, i32* [[TMP0]], align 8 - // EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 1 - // EVAL-FN-NEXT: store i64 17, i64* [[TMP1]], align 8 - // EVAL-FN-NEXT: store i64 17, i64* [[B]], align 8 - // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, i64* [[B]], align 8 - // EVAL-FN-NEXT: ret i64 [[TMP2]] - // - long b = retAgg().b; - return b; -} - -// EVAL-STATIC: @A = global %struct.Agg { i32 13, i64 17 }, align 8 -Agg A = retAgg(); - -// EVAL-NOT: @_Z9retRefAggv() -// EXPR: @_Z9retRefAggv() -consteval const Agg &retRefAgg() { - const Agg &tmp = A; - return A; -} - -long test_retRefAgg() { - // EVAL-FN-LABEL: @_Z14test_retRefAggv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 - // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 - // EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 0 - // EVAL-FN-NEXT: store i32 13, i32* [[TMP0]], align 8 - // EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 1 - // EVAL-FN-NEXT: store i64 17, i64* [[TMP1]], align 8 - // EVAL-FN-NEXT: store i64 17, i64* [[B]], align 8 - // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, i64* [[B]], align 8 - // EVAL-FN-NEXT: ret i64 [[TMP2]] - // - long b = retAgg().b; - return b; -} - -// EVAL-NOT: @_Z8is_constv() -// EXPR: @_Z8is_constv() -consteval Agg is_const() { - return {5, 19 * __builtin_is_constant_evaluated()}; -} - -long test_is_const() { - // EVAL-FN-LABEL: @_Z13test_is_constv( - // EVAL-FN-NEXT: entry: - // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 - // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 - // EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 0 - // EVAL-FN-NEXT: store i32 5, i32* [[TMP0]], align 8 - // EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], %struct.Agg* [[REF_TMP]], i32 0, i32 1 - // EVAL-FN-NEXT: store i64 19, i64* [[TMP1]], align 8 - // EVAL-FN-NEXT: store i64 19, i64* [[B]], align 8 - // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, i64* [[B]], align 8 - // EVAL-FN-NEXT: ret i64 [[TMP2]] - // - long b = is_const().b; - return b; -} - -// EVAL-NOT: @_ZN7AggCtorC -// EXPR: @_ZN7AggCtorC -struct AggCtor { - consteval AggCtor(int a = 3, long b = 5) : a(a * a), b(a * b) {} - int a; - long b; -}; - -long test_AggCtor() { - // CHECK-LABEL: @_Z12test_AggCtorv( - // CHECK-NEXT: entry: - // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 - // CHECK-NEXT: [[C:%.*]] = alloca [[STRUCT_AGGCTOR:%.*]], align 8 - // CHECK-NEXT: store i32 2, i32* [[I]], align 4 - // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], %struct.AggCtor* [[C]], i32 0, i32 0 - // CHECK-NEXT: store i32 4, i32* [[TMP0]], align 8 - // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], %struct.AggCtor* [[C]], i32 0, i32 1 - // CHECK-NEXT: store i64 10, i64* [[TMP1]], align 8 - // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], %struct.AggCtor* [[C]], i32 0, i32 0 - // CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[A]], align 8 - // CHECK-NEXT: [[CONV:%.*]] = sext i32 [[TMP2]] to i64 - // CHECK-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], %struct.AggCtor* [[C]], i32 0, i32 1 - // CHECK-NEXT: [[TMP3:%.*]] = load i64, i64* [[B]], align 8 - // CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[CONV]], [[TMP3]] - // CHECK-NEXT: ret i64 [[ADD]] - // - const int i = 2; - AggCtor C(i); - return C.a + C.b; -} diff --git a/clang/test/SemaCXX/cxx2a-consteval.cpp b/clang/test/SemaCXX/cxx2a-consteval.cpp index 0a6d137e9670..a1716b4fa8c3 100644 --- a/clang/test/SemaCXX/cxx2a-consteval.cpp +++ b/clang/test/SemaCXX/cxx2a-consteval.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++2a -emit-llvm-only -Wno-unused-value %s -verify +// RUN: %clang_cc1 -std=c++2a -fsyntax-only -Wno-unused-value %s -verify typedef __SIZE_TYPE__ size_t; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits