diff options
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 7 | ||||
-rw-r--r-- | clang/test/Analysis/structured_bindings.cc | 10 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 1569e86b57c..0a63fed2012 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -2463,7 +2463,12 @@ void ExprEngine::VisitCommonDeclRefExpr(const Expr *Ex, const NamedDecl *D, currBldrCtx->blockCount()); state = state->assume(V.castAs<DefinedOrUnknownSVal>(), true); Bldr.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, V), nullptr, - ProgramPoint::PostLValueKind); + ProgramPoint::PostLValueKind); + return; + } + if (const auto* BD = dyn_cast<BindingDecl>(D)) { + // FIXME: proper support for bound declarations. + // For now, let's just prevent crashing. return; } diff --git a/clang/test/Analysis/structured_bindings.cc b/clang/test/Analysis/structured_bindings.cc new file mode 100644 index 00000000000..1e23246f9a1 --- /dev/null +++ b/clang/test/Analysis/structured_bindings.cc @@ -0,0 +1,10 @@ +// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core -verify %s + +// expected-no-diagnostics +struct s { int a; }; +int foo() { + auto[a] = s{1}; // FIXME: proper modelling + if (a) { + } +} + |