Author: Ayush Kumar Gaur Date: 2026-02-13T20:39:51+08:00 New Revision: c592866bbad0b63155612e8b9d8977e6e9db1070
URL: https://github.com/llvm/llvm-project/commit/c592866bbad0b63155612e8b9d8977e6e9db1070 DIFF: https://github.com/llvm/llvm-project/commit/c592866bbad0b63155612e8b9d8977e6e9db1070.diff LOG: [clang][Sema] Avoid assert when diagnosing address-space qualified new/delete (#178424) ### Whats the error Clang could assert when diagnosing new or delete on types in language-specific address spaces (e.g. OpenCL __local), instead of emitting a normal error. ### Why it happened The diagnostics used getAddressSpaceAttributePrintValue(), which assumes target-specific address spaces and asserts for language-defined ones like OpenCL. ### Whats the Fix Explicitly check for language defined address spaces in new/delete diagnostics and emit the error directly, avoiding the crashing path, Add a regression test. Fixes #178319 Added: clang/test/SemaCXX/address-space-new-delete.cpp Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExprCXX.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 83cd562c6f49b..dcb27c25d7110 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -290,6 +290,7 @@ Miscellaneous Clang Crashes Fixed - Fixed a crash when using loop hint with a value dependent argument inside a generic lambda. (#GH172289) - Fixed a crash in C++ overload resolution with ``_Atomic``-qualified argument types. (#GH170433) +- Fixed an assertion when diagnosing address-space qualified ``new``/``delete`` in language-defined address spaces such as OpenCL ``__local``. (#GH178319) OpenACC Specific Changes ------------------------ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 91967a7a9ff97..366491fb4b2fc 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2676,8 +2676,9 @@ bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc, else if (AllocType.getAddressSpace() != LangAS::Default && !getLangOpts().OpenCLCPlusPlus) return Diag(Loc, diag::err_address_space_qualified_new) - << AllocType.getUnqualifiedType() - << AllocType.getQualifiers().getAddressSpaceAttributePrintValue(); + << AllocType.getUnqualifiedType() + << Qualifiers::getAddrSpaceAsString(AllocType.getAddressSpace()); + else if (getLangOpts().ObjCAutoRefCount) { if (const ArrayType *AT = Context.getAsArrayType(AllocType)) { QualType BaseAllocType = Context.getBaseElementType(AT); @@ -4069,7 +4070,7 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, return Diag(Ex.get()->getBeginLoc(), diag::err_address_space_qualified_delete) << Pointee.getUnqualifiedType() - << Pointee.getQualifiers().getAddressSpaceAttributePrintValue(); + << Qualifiers::getAddrSpaceAsString(Pointee.getAddressSpace()); CXXRecordDecl *PointeeRD = nullptr; if (Pointee->isVoidType() && !isSFINAEContext()) { diff --git a/clang/test/SemaCXX/address-space-new-delete.cpp b/clang/test/SemaCXX/address-space-new-delete.cpp new file mode 100644 index 0000000000000..56ce7c8bf567a --- /dev/null +++ b/clang/test/SemaCXX/address-space-new-delete.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -std=c++17 %s -verify -Wno-unknown-attributes + +typedef int LocalInt __attribute__((opencl_local)); + +void test_new() { + int *p = new LocalInt[1]; // expected-error {{'new' cannot allocate objects of type 'int' in address space '__local'}} +} + +void test_delete(LocalInt *p) { + delete p; // expected-error {{'delete' cannot delete objects of type 'int' in address space '__local'}} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
