summaryrefslogtreecommitdiffstats
path: root/development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch
diff options
context:
space:
mode:
Diffstat (limited to 'development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch')
-rw-r--r--development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch117
1 files changed, 0 insertions, 117 deletions
diff --git a/development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch b/development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch
deleted file mode 100644
index e759e4a9f5..0000000000
--- a/development/qt-creator-llvm/patches/100_D40841_Fix-a-crash-on-C++17-AST-for-non-trivial-construction-into-a-trivial-brace-initialize.patch
+++ /dev/null
@@ -1,117 +0,0 @@
---- a/tools/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
-+++ b/tools/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
-@@ -22,6 +22,7 @@
- //===----------------------------------------------------------------------===//
-
- #include "ClangSACheckers.h"
-+#include "clang/AST/ParentMap.h"
- #include "clang/AST/RecursiveASTVisitor.h"
- #include "clang/Basic/Builtins.h"
- #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
-@@ -262,8 +263,19 @@
- if (const MemRegion *Target = Ctor->getCXXThisVal().getAsRegion()) {
- // We just finished a base constructor. Now we can use the subclass's
- // type when resolving virtual calls.
-- const Decl *D = C.getLocationContext()->getDecl();
-- recordFixedType(Target, cast<CXXConstructorDecl>(D), C);
-+ const LocationContext *LCtx = C.getLocationContext();
-+
-+ // FIXME: In C++17 classes with non-virtual bases may be treated as
-+ // aggregates, and in such case no top-frame constructor will be called.
-+ // Figure out if we need to do anything in this case.
-+ // FIXME: Instead of relying on the ParentMap, we should have the
-+ // trigger-statement (InitListExpr in this case) available in this
-+ // callback, ideally as part of CallEvent.
-+ if (dyn_cast_or_null<InitListExpr>(
-+ LCtx->getParentMap().getParent(Ctor->getOriginExpr())))
-+ return;
-+
-+ recordFixedType(Target, cast<CXXConstructorDecl>(LCtx->getDecl()), C);
- }
- return;
- }
---- a/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
-+++ b/tools/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
-@@ -14,6 +14,7 @@
- #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
- #include "clang/AST/DeclCXX.h"
- #include "clang/AST/StmtCXX.h"
-+#include "clang/AST/ParentMap.h"
- #include "clang/Basic/PrettyStackTrace.h"
- #include "clang/StaticAnalyzer/Core/CheckerManager.h"
- #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
-@@ -267,6 +268,23 @@
- }
- // FALLTHROUGH
- case CXXConstructExpr::CK_NonVirtualBase:
-+ // In C++17, classes with non-virtual bases may be aggregates, so they would
-+ // be initialized as aggregates without a constructor call, so we may have
-+ // a base class constructed directly into an initializer list without
-+ // having the derived-class constructor call on the previous stack frame.
-+ // Initializer lists may be nested into more initializer lists that
-+ // correspond to surrounding aggregate initializations.
-+ // FIXME: For now this code essentially bails out. We need to find the
-+ // correct target region and set it.
-+ // FIXME: Instead of relying on the ParentMap, we should have the
-+ // trigger-statement (InitListExpr in this case) passed down from CFG or
-+ // otherwise always available during construction.
-+ if (dyn_cast_or_null<InitListExpr>(LCtx->getParentMap().getParent(CE))) {
-+ MemRegionManager &MRMgr = getSValBuilder().getRegionManager();
-+ Target = MRMgr.getCXXTempObjectRegion(CE, LCtx);
-+ break;
-+ }
-+ // FALLTHROUGH
- case CXXConstructExpr::CK_Delegating: {
- const CXXMethodDecl *CurCtor = cast<CXXMethodDecl>(LCtx->getDecl());
- Loc ThisPtr = getSValBuilder().getCXXThis(CurCtor,
---- a/tools/clang/test/Analysis/initializer.cpp
-+++ a/tools/clang/test/Analysis/initializer.cpp
-@@ -1,4 +1,5 @@
- // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++11 -verify %s
-+// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++17 -DCPLUSPLUS17 -verify %s
-
- void clang_analyzer_eval(bool);
-
-@@ -224,3 +225,42 @@
- const char(&f)[2];
- };
- }
-+
-+namespace CXX17_aggregate_construction {
-+struct A {
-+ A();
-+};
-+
-+struct B: public A {
-+};
-+
-+struct C: public B {
-+};
-+
-+struct D: public virtual A {
-+};
-+
-+// In C++17, classes B and C are aggregates, so they will be constructed
-+// without actually calling their trivial constructor. Used to crash.
-+void foo() {
-+ B b = {}; // no-crash
-+ const B &bl = {}; // no-crash
-+ B &&br = {}; // no-crash
-+
-+ C c = {}; // no-crash
-+ const C &cl = {}; // no-crash
-+ C &&cr = {}; // no-crash
-+
-+ D d = {}; // no-crash
-+
-+#ifdef CPLUSPLUS17
-+ C cd = {{}}; // no-crash
-+ const C &cdl = {{}}; // no-crash
-+ C &&cdr = {{}}; // no-crash
-+
-+ const B &bll = {{}}; // no-crash
-+ const B &bcl = C({{}}); // no-crash
-+ B &&bcr = C({{}}); // no-crash
-+#endif
-+}
-+}