-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[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
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?
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 understand that CheckFunctionReturnType
is used when checking the type of a function like using T = volatile int();
but this codepath here is used when checking a function declaration instead.
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.
ok, thanks for clarifying
@@ -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.
Lines 207-215 are that, are they not?
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.
Yeah, these are what I meant. Thanks!
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 ..."
@shafik I have changed the commit message, can you please look again? |
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.
That looks good to me unless @shafik has any additional concerns.
I see the commit 238d737 which adds the improved summary but I don't see at the top of this page in the summary. As long as this is what ends up as the commit message that is fine but it is better to just edit the summary at the top of the page so the reviewers can see it up front. Thank you! |
The old codepath in GetFullTypeForDeclarator was under "if (not a class type)" so that it failed to warn for class types. Move the diagnostic outside of the "if" so that it warns in the proper situations. Fixes llvm#133380
@halbi2 Do you need us to merge that for you? |
@cor3ntin yes, please. |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/169/builds/11290 Here is the relevant piece of the build log for the reference
|
The old codepath in GetFullTypeForDeclarator was under "if (not a class type)"
so that it failed to warn for class types. Move the diagnostic outside of the
"if" so that it warns in the proper situations.
Fixes #133380