Merge commit 9ca395b5ade1 from llvm-project (by Haojian Wu):
[clang][AST] Propagate the contains-errors bit to DeclRefExpr from VarDecl's initializer. Similar to the https://reviews.llvm.org/D86048 (it only sets the bit for C++ code), we propagate the contains-errors bit for C-code path. Fixes https://github.com/llvm/llvm-project/issues/50236 Fixes https://github.com/llvm/llvm-project/issues/50243 Fixes https://github.com/llvm/llvm-project/issues/48636 Fixes https://github.com/llvm/llvm-project/issues/50320 Differential Revision: https://reviews.llvm.org/D154861 This fixes an assertion ('Assertion failed: ((LHSExpr->containsErrors() || RHSExpr->containsErrors()) && "Should only occur in error-recovery path."), function BuildBinOp') when building parts of dtrace in certain scenarios. Reported by: dstolfa PR: 271047 MFC after: 1 month
This commit is contained in:
parent
66fd12cf48
commit
8d0cab8800
@ -489,7 +489,7 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
|
|||||||
// more bullets here that we handle by treating the declaration as having a
|
// more bullets here that we handle by treating the declaration as having a
|
||||||
// dependent type if they involve a placeholder type that can't be deduced.]
|
// dependent type if they involve a placeholder type that can't be deduced.]
|
||||||
if (Type->isDependentType())
|
if (Type->isDependentType())
|
||||||
return Deps | ExprDependence::TypeValueInstantiation;
|
Deps |= ExprDependence::TypeValueInstantiation;
|
||||||
else if (Type->isInstantiationDependentType())
|
else if (Type->isInstantiationDependentType())
|
||||||
Deps |= ExprDependence::Instantiation;
|
Deps |= ExprDependence::Instantiation;
|
||||||
|
|
||||||
@ -525,13 +525,13 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
|
|||||||
// - it names a potentially-constant variable that is initialized with an
|
// - it names a potentially-constant variable that is initialized with an
|
||||||
// expression that is value-dependent
|
// expression that is value-dependent
|
||||||
if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
|
if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
|
||||||
if (Var->mightBeUsableInConstantExpressions(Ctx)) {
|
if (const Expr *Init = Var->getAnyInitializer()) {
|
||||||
if (const Expr *Init = Var->getAnyInitializer()) {
|
if (Init->containsErrors())
|
||||||
if (Init->isValueDependent())
|
Deps |= ExprDependence::Error;
|
||||||
Deps |= ExprDependence::ValueInstantiation;
|
|
||||||
if (Init->containsErrors())
|
if (Var->mightBeUsableInConstantExpressions(Ctx) &&
|
||||||
Deps |= ExprDependence::Error;
|
Init->isValueDependent())
|
||||||
}
|
Deps |= ExprDependence::ValueInstantiation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - it names a static data member that is a dependent member of the
|
// - it names a static data member that is a dependent member of the
|
||||||
|
Loading…
Reference in New Issue
Block a user