Skip to content

Commit

Permalink
[clang] Fix crash when inheriting from a cv-qualified type (#70594)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Rajveer100 committed Apr 2, 2024
1 parent 6626eab commit e12a1f8
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
3 changes: 3 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions clang/test/Sema/GH70594.cpp
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit e12a1f8

Please sign in to comment.