https://github.com/halbi2 created 
https://github.com/llvm/llvm-project/pull/137899

Fixes #133380

>From 8b6c722cda78edf307432cc52274db2271170033 Mon Sep 17 00:00:00 2001
From: halbi2 <hehira...@gmail.com>
Date: Mon, 28 Apr 2025 20:07:43 -0400
Subject: [PATCH] [clang] Warn about deprecated volatile-qualified return types

Fixes #133380
---
 clang/lib/Sema/SemaType.cpp              | 10 +++++-----
 clang/test/CXX/expr/expr.const/p2-0x.cpp |  2 +-
 clang/test/SemaCXX/deprecated.cpp        |  7 +++++++
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 6e7ee8b5506ff..31bdc97d014d6 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -5056,13 +5056,13 @@ static TypeSourceInfo 
*GetFullTypeForDeclarator(TypeProcessingState &state,
           S.Diag(DeclType.Loc, diag::err_func_returning_qualified_void) << T;
         } else
           diagnoseRedundantReturnTypeQualifiers(S, T, D, chunkIndex);
-
-        // C++2a [dcl.fct]p12:
-        //   A volatile-qualified return type is deprecated
-        if (T.isVolatileQualified() && S.getLangOpts().CPlusPlus20)
-          S.Diag(DeclType.Loc, diag::warn_deprecated_volatile_return) << T;
       }
 
+      // C++2a [dcl.fct]p12:
+      //   A volatile-qualified return type is deprecated
+      if (T.isVolatileQualified() && S.getLangOpts().CPlusPlus20)
+        S.Diag(DeclType.Loc, diag::warn_deprecated_volatile_return) << T;
+
       // Objective-C ARC ownership qualifiers are ignored on the function
       // return type (by type canonicalization). Complain if this attribute
       // was written here.
diff --git a/clang/test/CXX/expr/expr.const/p2-0x.cpp 
b/clang/test/CXX/expr/expr.const/p2-0x.cpp
index df5ce108aca82..c6c3381be5523 100644
--- a/clang/test/CXX/expr/expr.const/p2-0x.cpp
+++ b/clang/test/CXX/expr/expr.const/p2-0x.cpp
@@ -356,7 +356,7 @@ namespace LValueToRValue {
   // - a non-volatile glvalue of literal type that refers to a non-volatile
   //   temporary object whose lifetime has not ended, initialized with a
   //   constant expression;
-  constexpr volatile S f() { return S(); }
+  constexpr volatile S f() { return S(); } // cxx20-warning 
{{volatile-qualified return type 'volatile S' is deprecated}}
   static_assert(f().i, ""); // expected-error {{constant expression}} 
expected-note {{read of volatile-qualified type}}
   static_assert(((volatile const S&&)(S)0).i, ""); // expected-error 
{{constant expression}} expected-note {{read of volatile-qualified type}}
 }
diff --git a/clang/test/SemaCXX/deprecated.cpp 
b/clang/test/SemaCXX/deprecated.cpp
index a24b40d8e622a..061fa8b54dff1 100644
--- a/clang/test/SemaCXX/deprecated.cpp
+++ b/clang/test/SemaCXX/deprecated.cpp
@@ -231,6 +231,13 @@ namespace DeprecatedVolatile {
     a = c = a;
     b += a;
   }
+
+  volatile struct amber jurassic();
+    // cxx20-warning@-1 {{volatile-qualified return type 'volatile struct 
amber' is deprecated}}
+  void trex(volatile short left_arm, volatile struct amber right_arm);
+    // cxx20-warning@-1 {{volatile-qualified parameter type 'volatile short' 
is deprecated}}
+    // cxx20-warning@-1 {{volatile-qualified parameter type 'volatile struct 
amber' is deprecated}}
+  void fly(volatile struct pterosaur* pteranodon);
 }
 
 namespace ArithConv {

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to