[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
This commit is contained in:
Rajveer Singh Bharadwaj 2024-04-02 21:36:56 +05:30 committed by GitHub
parent 6626eab07e
commit e12a1f8b32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 1 deletions

View File

@ -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)

View File

@ -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

View File

@ -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;