[Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align
authorserge-sans-paille <sguelton@mozilla.com>
Tue, 30 May 2023 21:15:11 +0000 (23:15 +0200)
committerserge-sans-paille <sguelton@mozilla.com>
Tue, 27 Jun 2023 08:29:09 +0000 (10:29 +0200)
Fix #63007

Differential Revision: https://reviews.llvm.org/D151753

clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaChecking.cpp
clang/test/SemaCXX/warn-cast-align.cpp

index c022e9f..bc6366b 100644 (file)
@@ -370,6 +370,7 @@ Improvements to Clang's diagnostics
 - Clang now diagnoses unexpected tokens after a
   ``#pragma clang|GCC diagnostic push|pop`` directive.
   (`#13920: <https://github.com/llvm/llvm-project/issues/13920>`_)
+- Clang now does not try to analyze cast validity on variables with dependent alignment (`#63007: <https://github.com/llvm/llvm-project/issues/63007>`_).
 
 Bug Fixes in This Version
 -------------------------
index 6969cf1..ffda87a 100644 (file)
@@ -16351,8 +16351,12 @@ std::optional<std::pair<
     if (auto *VD = dyn_cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl())) {
       // FIXME: If VD is captured by copy or is an escaping __block variable,
       // use the alignment of VD's type.
-      if (!VD->getType()->isReferenceType())
+      if (!VD->getType()->isReferenceType()) {
+        // Dependent alignment cannot be resolved -> bail out.
+        if (VD->hasDependentAlignment())
+          break;
         return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+      }
       if (VD->hasInit())
         return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
     }
index 1e84ba9..855fac4 100644 (file)
@@ -44,6 +44,11 @@ void test1(void *P) {
   c = IntPtr(P);
 }
 
+template <class A> void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };