From: George Karpenkov Date: Wed, 7 Mar 2018 22:20:35 +0000 (+0000) Subject: [analyzer] Don't crash with assertion failure on structured bindings X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b16500ae7034e41507687298af6205c48854e0ac;p=clang [analyzer] Don't crash with assertion failure on structured bindings Proper modeling still remains to be done. Note that BindingDecl#getHoldingVar() is almost always null, and this should probably be handled by dealing with DecompositionDecl beforehand. rdar://36852163 Differential Revision: https://reviews.llvm.org/D44183 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326951 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 1569e86b57..0a63fed201 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/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(), true); Bldr.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, V), nullptr, - ProgramPoint::PostLValueKind); + ProgramPoint::PostLValueKind); + return; + } + if (const auto* BD = dyn_cast(D)) { + // FIXME: proper support for bound declarations. + // For now, let's just prevent crashing. return; } diff --git a/test/Analysis/structured_bindings.cc b/test/Analysis/structured_bindings.cc new file mode 100644 index 0000000000..1e23246f9a --- /dev/null +++ b/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) { + } +} +