Skip to content

Commit

Permalink
[Clang][Sema] Fix crash with const qualified member operator new
Browse files Browse the repository at this point in the history
We should diagnose a const qualified member operator new but we fail to do so
and this leads to crash during debug info generation.

The fix is to diagnose this as ill-formed in the front-end.

Fixes: llvm#79748
  • Loading branch information
shafik committed Feb 2, 2024
1 parent 46068f5 commit 154465e
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Expand Up @@ -188,6 +188,8 @@ Bug Fixes to C++ Support
and (`#79745 <https://github.com/llvm/llvm-project/issues/79745>`_)
- Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated.
Fixes (`#67976 <https://github.com/llvm/llvm-project/issues/67976>`_)
- Fix crash and diagnostic with const qualified member operator new.
Fixes (`#79748 <https://github.com/llvm/llvm-project/issues/79748>`_)

Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
13 changes: 11 additions & 2 deletions clang/lib/Sema/SemaType.cpp
Expand Up @@ -5907,15 +5907,24 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
// - the type-id in the default argument of a type-parameter, or
// - the type-id of a template-argument for a type-parameter
//
// C++23 [dcl.fct]p6 (P0847R7)
// ... A member-declarator with an explicit-object-parameter-declaration
// shall not include a ref-qualifier or a cv-qualifier-seq and shall not be
// declared static or virtual ...
//
// FIXME: Checking this here is insufficient. We accept-invalid on:
//
// template<typename T> struct S { void f(T); };
// S<int() const> s;
//
// ... for instance.
if (IsQualifiedFunction &&
!(Kind == Member && !D.isExplicitObjectMemberFunction() &&
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static) &&
// Check for non-static member function and not and
// explicit-object-parameter-declaration
(Kind != Member || D.isExplicitObjectMemberFunction() ||
D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
(D.getContext() == clang::DeclaratorContext::Member &&
D.isStaticMember())) &&
!IsTypedefName && D.getContext() != DeclaratorContext::TemplateArg &&
D.getContext() != DeclaratorContext::TemplateTypeArg) {
SourceLocation Loc = D.getBeginLoc();
Expand Down
18 changes: 18 additions & 0 deletions clang/test/SemaCXX/function-type-qual.cpp
Expand Up @@ -37,3 +37,21 @@ void instantiateArrayDecay() {
int a[1];
arrayDecay(a);
}

namespace GH79748 {
typedef decltype(sizeof(0)) size_t;
struct A {
void* operator new(size_t bytes) const; //expected-error {{static member function cannot have 'const' qualifier}}
void* operator new[](size_t bytes) const; //expected-error {{static member function cannot have 'const' qualifier}}

void operator delete(void*) const; //expected-error {{static member function cannot have 'const' qualifier}}
void operator delete[](void*) const; //expected-error {{static member function cannot have 'const' qualifier}}
};
struct B {
void* operator new(size_t bytes) volatile; //expected-error {{static member function cannot have 'volatile' qualifier}}
void* operator new[](size_t bytes) volatile; //expected-error {{static member function cannot have 'volatile' qualifier}}

void operator delete(void*) volatile; //expected-error {{static member function cannot have 'volatile' qualifier}}
void operator delete[](void*) volatile; //expected-error {{static member function cannot have 'volatile' qualifier}}
};
}

0 comments on commit 154465e

Please sign in to comment.