[AST] Fix a crash on invalid constexpr Ctorinitializer when building RecoveryExpr.
Summary:
crash stack:
```
lang: workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:13704: bool EvaluateInPlace(clang::APValue &, (anonymous namespace)::EvalInfo &, const (anonymous namespace)::LValue &, const clang::Expr *, bool): Assertion `!E->isValueDependent()' failed.
#8 EvaluateInPlace(clang::APValue&, (anonymous namespace)::EvalInfo&, (anonymous namespace)::LValue const&, clang::Expr const*, bool) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:0:0
#9 HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, clang::APValue*, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:5779:57
#10 HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, llvm::ArrayRef<clang::Expr const*>, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:5819:10
#11 clang::Expr::isPotentialConstantExpr(clang::FunctionDecl const*, llvm::SmallVectorImpl<std::pair<clang::SourceLocation, clang::PartialDiagnostic> >&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:14746:5
#12 CheckConstexprFunctionBody(clang::Sema&, clang::FunctionDecl const*, clang::Stmt*, clang::Sema::CheckConstexprKind) workspace/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:2306:7
#13 clang::Sema::CheckConstexprFunctionDefinition(clang::FunctionDecl const*, clang::Sema::CheckConstexprKind) workspace/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:1766:0
#14 clang::Sema::ActOnFinishFunctionBody(clang::Decl*, clang::Stmt*, bool) workspace/llvm-project/clang/lib/Sema/SemaDecl.cpp:14357:9
#15 clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) workspace/llvm-project/clang/lib/Parse/ParseStmt.cpp:2213:18
```
Reviewers: sammccall
Reviewed By: sammccall
Subscribers: rsmith, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D77041
2020-04-07 19:48:18 +08:00
|
|
|
// RUN: %clang_cc1 -frecovery-ast -verify %s
|
|
|
|
|
|
|
|
struct X {
|
|
|
|
int Y;
|
|
|
|
constexpr X() // expected-error {{constexpr constructor never produces}}
|
|
|
|
: Y(foo()) {} // expected-error {{use of undeclared identifier 'foo'}}
|
|
|
|
};
|
|
|
|
// no crash on evaluating the constexpr ctor.
|
|
|
|
constexpr int Z = X().Y; // expected-error {{constexpr variable 'Z' must be initialized by a constant expression}}
|
|
|
|
|
|
|
|
struct X2 {
|
|
|
|
int Y = foo(); // expected-error {{use of undeclared identifier 'foo'}} \
|
|
|
|
// expected-note {{subexpression not valid in a constant expression}}
|
|
|
|
constexpr X2() {} // expected-error {{constexpr constructor never produces a constant expression}}
|
|
|
|
};
|
|
|
|
|
2020-06-04 19:22:19 +08:00
|
|
|
struct X3 {
|
|
|
|
int Y;
|
|
|
|
constexpr X3() // expected-error {{constexpr constructor never produces}}
|
|
|
|
: Y(({foo();})) {} // expected-error {{use of undeclared identifier 'foo'}}
|
|
|
|
};
|
|
|
|
|
[AST] Fix a crash on invalid constexpr Ctorinitializer when building RecoveryExpr.
Summary:
crash stack:
```
lang: workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:13704: bool EvaluateInPlace(clang::APValue &, (anonymous namespace)::EvalInfo &, const (anonymous namespace)::LValue &, const clang::Expr *, bool): Assertion `!E->isValueDependent()' failed.
#8 EvaluateInPlace(clang::APValue&, (anonymous namespace)::EvalInfo&, (anonymous namespace)::LValue const&, clang::Expr const*, bool) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:0:0
#9 HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, clang::APValue*, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:5779:57
#10 HandleConstructorCall(clang::Expr const*, (anonymous namespace)::LValue const&, llvm::ArrayRef<clang::Expr const*>, clang::CXXConstructorDecl const*, (anonymous namespace)::EvalInfo&, clang::APValue&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:5819:10
#11 clang::Expr::isPotentialConstantExpr(clang::FunctionDecl const*, llvm::SmallVectorImpl<std::pair<clang::SourceLocation, clang::PartialDiagnostic> >&) workspace/llvm-project/clang/lib/AST/ExprConstant.cpp:14746:5
#12 CheckConstexprFunctionBody(clang::Sema&, clang::FunctionDecl const*, clang::Stmt*, clang::Sema::CheckConstexprKind) workspace/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:2306:7
#13 clang::Sema::CheckConstexprFunctionDefinition(clang::FunctionDecl const*, clang::Sema::CheckConstexprKind) workspace/llvm-project/clang/lib/Sema/SemaDeclCXX.cpp:1766:0
#14 clang::Sema::ActOnFinishFunctionBody(clang::Decl*, clang::Stmt*, bool) workspace/llvm-project/clang/lib/Sema/SemaDecl.cpp:14357:9
#15 clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) workspace/llvm-project/clang/lib/Parse/ParseStmt.cpp:2213:18
```
Reviewers: sammccall
Reviewed By: sammccall
Subscribers: rsmith, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D77041
2020-04-07 19:48:18 +08:00
|
|
|
struct CycleDelegate {
|
|
|
|
int Y;
|
|
|
|
CycleDelegate(int)
|
|
|
|
: Y(foo()) {} // expected-error {{use of undeclared identifier 'foo'}}
|
|
|
|
// no bogus "delegation cycle" diagnostic
|
|
|
|
CycleDelegate(float) : CycleDelegate(1) {}
|
|
|
|
};
|