aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajveer Singh Bharadwaj <rajveer.developer@icloud.com>2024-04-02 21:36:56 +0530
committerGitHub <noreply@github.com>2024-04-02 12:06:56 -0400
commite12a1f8b325a72191c261b4f11726a9c58f84817 (patch)
tree42f2446c574a4e3ec75191ae3a3033e3109e0868
parent6626eab07e2e9a1993a1ccdbf82bd88c3dc5b851 (diff)
downloadllvm-e12a1f8b325a72191c261b4f11726a9c58f84817.zip
llvm-e12a1f8b325a72191c261b4f11726a9c58f84817.tar.gz
llvm-e12a1f8b325a72191c261b4f11726a9c58f84817.tar.bz2
[clang] Fix crash when inheriting from a cv-qualified type (#70594)
This change makes the `assertion` less strict in `debug` builds by stripping qualifiers from the base class and ignoring them. I hope `weakened` assertions don't affect other cases where such `errors` are intended to be `caught` by the compiler. Fixes #35603 Fixes #85256
-rw-r--r--clang/docs/ReleaseNotes.rst3
-rw-r--r--clang/lib/AST/ExprConstant.cpp2
-rw-r--r--clang/test/Sema/GH70594.cpp28
3 files changed, 32 insertions, 1 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3a84ff1..d5ce54e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -486,6 +486,9 @@ Bug Fixes to C++ Support
- Fixed a bug that prevented member function templates of class templates declared with a deduced return type
from being explicitly specialized for a given implicit instantiation of the class template.
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+ (`#35603 <https://github.com/llvm/llvm-project/issues/35603>`_)
+
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. (#GH82628)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 0058e86..88c8eaf 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6456,7 +6456,7 @@ static bool HandleConstructorCall(const Expr *E, const LValue &This,
// Non-virtual base classes are initialized in the order in the class
// definition. We have already checked for virtual base classes.
assert(!BaseIt->isVirtual() && "virtual base for literal type");
- assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+ assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
"base class initializers not in expected order");
++BaseIt;
#endif
diff --git a/clang/test/Sema/GH70594.cpp b/clang/test/Sema/GH70594.cpp
new file mode 100644
index 0000000..ce98e9b
--- /dev/null
+++ b/clang/test/Sema/GH70594.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+ constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+ constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+ constexpr S3() : A() {}
+};
+
+struct Int {};
+
+template <class _Hp>
+struct __tuple_leaf : _Hp {
+ constexpr __tuple_leaf() : _Hp() {}
+};
+
+constexpr __tuple_leaf<const Int> t;