-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[clang] Warn about deprecated volatile-qualified return types #137899
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-clang Author: None (halbi2) ChangesFixes #133380 Full diff: https://github.com/llvm/llvm-project/pull/137899.diff 3 Files Affected:
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 {
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the fix, could you please also add a release note?
// 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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see there is another place that issues warn_deprecated_volatile_return
in Sema::CheckFunctionReturnType
. I wonder why doesn't it suffice?
@@ -231,6 +231,13 @@ namespace DeprecatedVolatile { | |||
a = c = a; | |||
b += a; | |||
} | |||
|
|||
volatile struct amber jurassic(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As I can see, if the return type is not a struct/class, the warning is issued. Could you please add a test case with volatile qualifier applied to a basic type (for example int) and make sure there is no double diagnostic issued now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add more details in the summary. Specifically your approach to fixing the issue.
Something along the lines of "In GetFullTypeForDeclarator ... moved check ... b/c ..."
Fixes #133380