[clang] [Sema] Decay functions/array to pointers in `IncompatiblePointerDiscardsQualifiers` and `IncompatibleOBTKinds` cases (PR #187038)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 17 08:14:25 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (NeKon69)
<details>
<summary>Changes</summary>
This PR adds checks that ensure the compiler has the correct type so it does not crash when trying to get qualifiers from an incorrect type in the `IncompatiblePointerDiscardsQualifiers` and `IncompatibleOBTKinds` cases. It achieves this by performing a decay before accessing pointee qualifiers.
It also adds a test to ensure that such a bug won't arise again.
Fixes #<!-- -->182534
(same as #<!-- -->183616, unfortunately i forgot to create a new branch and wiped all changes)
---
Full diff: https://github.com/llvm/llvm-project/pull/187038.diff
3 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+1)
- (modified) clang/lib/Sema/SemaExpr.cpp (+10-2)
- (added) clang/test/Sema/incompatible-function-to-ptr-decay.c (+18)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 6c26d514865ea..ef437b76f6a9f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -355,6 +355,7 @@ Miscellaneous Clang Crashes Fixed
- Fixed an assertion when diagnosing address-space qualified ``new``/``delete`` in language-defined address spaces such as OpenCL ``__local``. (#GH178319)
- Fixed an assertion failure in ObjC++ ARC when binding a rvalue reference to reference with different lifetimes (#GH178524)
- Fixed a crash when subscripting a vector type with large unsigned integer values. (#GH180563)
+- Fixed a crash when attempting to diagnose incompatible conversions involving function types (#GH182534)
OpenACC Specific Changes
------------------------
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 53d215f5c5e3e..48293c8d7e92f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -64,6 +64,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/ConvertUTF.h"
+#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/TypeSize.h"
@@ -17535,8 +17536,9 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
}
break;
case AssignConvertType::IncompatiblePointerDiscardsQualifiers: {
- // Perform array-to-pointer decay if necessary.
- if (SrcType->isArrayType()) SrcType = Context.getArrayDecayedType(SrcType);
+ // Perform decay if necessary.
+ if (SrcType->isArrayType() || SrcType->isFunctionType())
+ SrcType = Context.getDecayedType(SrcType);
isInvalid = true;
@@ -17649,6 +17651,12 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
case AssignConvertType::CompatibleOBTDiscards:
return false;
case AssignConvertType::IncompatibleOBTKinds: {
+ if (SrcType->isArrayType())
+ SrcType = Context.getDecayedType(SrcType);
+
+ assert(!SrcType->isFunctionType() &&
+ "Unexpected function type found in IncompatibleOBTKinds assignment");
+
auto getOBTKindName = [](QualType Ty) -> StringRef {
if (Ty->isPointerType())
Ty = Ty->getPointeeType();
diff --git a/clang/test/Sema/incompatible-function-to-ptr-decay.c b/clang/test/Sema/incompatible-function-to-ptr-decay.c
new file mode 100644
index 0000000000000..240b5b8763a23
--- /dev/null
+++ b/clang/test/Sema/incompatible-function-to-ptr-decay.c
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -fsyntax-only -fexperimental-overflow-behavior-types -verify %s
+
+// Issue 182534
+int foo();
+
+void bar(__attribute__((opencl_global)) int*); // #cldecl
+void baz(__ob_wrap int*); // #ofdecl
+
+void a() {
+ bar(foo);
+ // expected-error at -1 {{passing 'int (*)()' to parameter of type '__global int *' changes address space of pointer}}
+ // expected-note@#cldecl {{passing argument to parameter here}}
+ __ob_trap int val[10];
+ baz(val);
+ // expected-error at -1 {{assigning to '__ob_wrap int *' from '__ob_trap int *' with incompatible overflow behavior types ('__ob_wrap' and '__ob_trap')}}
+ // expected-note@#ofdecl {{passing argument to parameter here}}
+}
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/187038
More information about the cfe-commits
mailing list