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:
Dimitry Andric 2023-07-19 11:18:50 +02:00
parent 66fd12cf48
commit 8d0cab8800

View File

@ -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
// dependent type if they involve a placeholder type that can't be deduced.]
if (Type->isDependentType())
return Deps | ExprDependence::TypeValueInstantiation;
Deps |= ExprDependence::TypeValueInstantiation;
else if (Type->isInstantiationDependentType())
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
// expression that is value-dependent
if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
if (Var->mightBeUsableInConstantExpressions(Ctx)) {
if (const Expr *Init = Var->getAnyInitializer()) {
if (Init->isValueDependent())
Deps |= ExprDependence::ValueInstantiation;
if (Init->containsErrors())
Deps |= ExprDependence::Error;
}
if (const Expr *Init = Var->getAnyInitializer()) {
if (Init->containsErrors())
Deps |= ExprDependence::Error;
if (Var->mightBeUsableInConstantExpressions(Ctx) &&
Init->isValueDependent())
Deps |= ExprDependence::ValueInstantiation;
}
// - it names a static data member that is a dependent member of the