This revision was automatically updated to reflect the committed changes.
Closed by commit rG7c0021923503: [clang] trigger -Wcast-qual on functional 
casts (authored by sousajo, committed by aaron.ballman).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Changed prior to commit:
  https://reviews.llvm.org/D148276?vs=513583&id=515680#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148276/new/

https://reviews.llvm.org/D148276

Files:
  clang/docs/ReleaseNotes.rst
  clang/lib/Sema/SemaCast.cpp
  clang/test/SemaCXX/warn-cast-qual.cpp

Index: clang/test/SemaCXX/warn-cast-qual.cpp
===================================================================
--- clang/test/SemaCXX/warn-cast-qual.cpp
+++ clang/test/SemaCXX/warn-cast-qual.cpp
@@ -34,6 +34,17 @@
   const int &a6 = (int &)((int &)a);       // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
   const int &a7 = (int &)((const int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
   const int &a8 = (const int &)((int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+
+  using T = int&;
+  using T2 = const int&;
+  const int &a11 =T2(a);      // no warning
+  int a22 = T(a);             // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  const int &a33 = T(a);      // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  int &a44 = T(T2(a));        // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  int &a55 = T(T(a));         // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  const int &a66 = T(T(a));   // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  int &a77 = T(T2(a));        // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+  const int &a88 = T2(T(a));  // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
 }
 
 void foo_1() {
@@ -49,6 +60,17 @@
   volatile int &a6 = (int &)((int &)a);          // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
   volatile int &a7 = (int &)((volatile int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
   volatile int &a8 = (volatile int &)((int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+
+  using T = int&;
+  using T2 = volatile int&;
+  volatile int &a11 =T2(a);     // no warning
+  int a22 = T(a);               // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  volatile int &a33 = T(a);     // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  int &a44 = T(T2(a));          // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  int &a55 = T(T(a));           // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  volatile int &a66 = T(T(a));  // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  int &a77 = T(T2(a));          // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
+  volatile int &a88 = T2(T(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
 }
 
 void foo_2() {
@@ -64,6 +86,17 @@
   const volatile int &a6 = (int &)((int &)a);                // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
   const volatile int &a7 = (int &)((const volatile int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
   const volatile int &a8 = (const volatile int &)((int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+
+  using T = int&;
+  using T2 = const volatile int&;
+  const volatile int &a11 =T2(a);           // no warning
+  int a22 = T(a);                     // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  const volatile int &a33 = T(a);     // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  int &a44 = T(T2(a));                // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  int &a55 = T(T(a));                 // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  const volatile int &a66 = T(T(a));  // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  const volatile int &a77 = T(T2(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
+  const volatile int &a88 = T2(T(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
 }
 
 void bar_0() {
@@ -78,6 +111,16 @@
 
   const int **a4 = (const int **)((int **)a);        // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int **' to 'const int **' must have all intermediate pointers const qualified to be safe}}
   const int **a5 = (const int **)((const int **)a); // no warning
+
+  using T = int**;
+  using T2 = const int**;
+
+  int **a00 = T(T2(a)) ;          // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+  int **a11 = T(T(a));            // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+
+  const int **a44 = T2(T(a));     // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'T' (aka 'int **') to 'T2' (aka 'const int **') must have all intermediate pointers const qualified to be safe}}
+  const int **a55 = T2(T2(a));    // no warning
+
 }
 
 void bar_1() {
@@ -92,6 +135,15 @@
 
   const int *&a4 = (const int *&)((int *&)a);        // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int *' to 'const int *&' must have all intermediate pointers const qualified to be safe}}
   const int *&a5 = (const int *&)((const int *&)a); // no warning
+
+  using T = int*&;
+  using T2 = const int*&;
+
+  int *&a00 = T(T2(a));           // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+  int *&a11 = T(T(a));            // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+
+  const int *&a44 = T2(T(a));     // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int *' to 'T2' (aka 'const int *&') must have all intermediate pointers const qualified to be safe}}
+  const int *&a55 = T2(T2(a));    // no warning
 }
 
 void baz_0() {
@@ -108,6 +160,14 @@
 
   ((C *)&S)->B(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
   ((C *)&S)->A(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
+
+  using T = C&;
+  using T2 = C*;
+  T(S).B(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}}
+  T(S).A(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}}
+
+  T2(&S)->B(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
+  T2(&S)->A(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
 }
 
 void baz_1() {
@@ -127,6 +187,14 @@
 
     *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
     *(int *)(&S.b) = 0; // no warning
+
+    using T = int&;
+    using T2 = int*;
+    T(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+    T(S.b) = 0; // no warning
+
+    *T2(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+    *T2(&S.b) = 0; // no warning
   }
   {
     const C S;
@@ -136,5 +204,39 @@
 
     *(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
     *(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+
+    using T = int&;
+    using T2 = int*;
+    T(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+    T(S.b) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
+
+    *T2(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+    *T2(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
   }
 }
+
+void qux_0() {
+  const auto i = 42;
+  using T = int*;
+  auto p = T(&i); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
+
+  const auto i2 = 42;
+  using T2 = const int*;
+  auto p2 = T2(&i2);
+
+  volatile auto i3 = 42;
+  using T3= int*;
+  auto p3 = T3(&i3); // expected-warning {{cast from 'volatile int *' to 'int *' drops volatile qualifier}}
+
+  volatile auto i4 = 42;
+  using T4 = volatile int*;
+  auto p4 = T4(&i4);
+
+  const volatile auto i5 = 42;
+  using T5= int*;
+  auto p5 = T5(&i5);  // expected-warning {{cast from 'const volatile int *' to 'int *' drops const and volatile qualifiers}}
+
+  const volatile auto i6 = 42;
+  using T6= const volatile int*;
+  auto p6 = T6(&i6);
+}
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -3332,6 +3332,9 @@
   if (auto *ConstructExpr = dyn_cast<CXXConstructExpr>(SubExpr))
     ConstructExpr->setParenOrBraceRange(SourceRange(LPLoc, RPLoc));
 
+  // -Wcast-qual
+  DiagnoseCastQual(Op.Self, Op.SrcExpr, Op.DestType);
+
   return Op.complete(CXXFunctionalCastExpr::Create(
       Context, Op.ResultType, Op.ValueKind, CastTypeInfo, Op.Kind,
       Op.SrcExpr.get(), &Op.BasePath, CurFPFeatureOverrides(), LPLoc, RPLoc));
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -231,6 +231,8 @@
 - ``-Wformat`` now recognizes ``%lb`` for the ``printf``/``scanf`` family of
   functions.
   (`#62247: <https://github.com/llvm/llvm-project/issues/62247>`_).
+- ``-Wcast-qual`` now triggers on function-style casts.
+  (`#62083 <https://github.com/llvm/llvm-project/issues/62083>`_)
 
 Bug Fixes in This Version
 -------------------------
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to