-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[Clang] [NFC] Fix more -Wreturn-type
warnings in tests everywhere
#123470
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-tools-extra @llvm/pr-subscribers-clang Author: None (Sirraide) ChangesThis makes Most of the tedious work of migrating the tests was done in #123464 (except for one test that for some reason didn’t want to cooperate earlier, which is why that one is handled in this pr). Full diff: https://github.com/llvm/llvm-project/pull/123470.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index aa1c02d04f7caa..a086c443984408 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -81,6 +81,10 @@ code bases.
``-fno-strict-overflow`` to opt-in to a language dialect where signed integer
and pointer overflow are well-defined.
+- ``-Wreturn-type`` now defaults to an error in all language modes; like other
+ warnings, it can be reverted to just being a warning by specifying
+ ``-Wno-error=return-type``.
+
C/C++ Language Potentially Breaking Changes
-------------------------------------------
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index db54312ad965e8..b70d152781a2a8 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -709,10 +709,10 @@ def err_thread_unsupported : Error<
// FIXME: Combine fallout warnings to just one warning.
def warn_maybe_falloff_nonvoid_function : Warning<
"non-void function does not return a value in all control paths">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def warn_falloff_nonvoid_function : Warning<
"non-void function does not return a value">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def warn_const_attr_with_pure_attr : Warning<
"'const' attribute imposes more restrictions; 'pure' attribute ignored">,
InGroup<IgnoredAttributes>;
@@ -726,10 +726,10 @@ def err_falloff_nonvoid_block : Error<
"non-void block does not return a value">;
def warn_maybe_falloff_nonvoid_coroutine : Warning<
"non-void coroutine does not return a value in all control paths">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def warn_falloff_nonvoid_coroutine : Warning<
"non-void coroutine does not return a value">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def warn_suggest_noreturn_function : Warning<
"%select{function|method}0 %1 could be declared with attribute 'noreturn'">,
InGroup<MissingNoreturn>, DefaultIgnore;
@@ -8365,10 +8365,10 @@ let CategoryName = "Lambda Issue" in {
"lambda declared 'noreturn' should not return">;
def warn_maybe_falloff_nonvoid_lambda : Warning<
"non-void lambda does not return a value in all control paths">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def warn_falloff_nonvoid_lambda : Warning<
"non-void lambda does not return a value">,
- InGroup<ReturnType>;
+ InGroup<ReturnType>, DefaultError;
def err_access_lambda_capture : Error<
// The ERRORs represent other special members that aren't constructors, in
// hopes that someone will bother noticing and reporting if they appear
diff --git a/clang/test/Index/warning-flags.c b/clang/test/Index/warning-flags.c
index 1694c6abab5624..3229f000c4ae0c 100644
--- a/clang/test/Index/warning-flags.c
+++ b/clang/test/Index/warning-flags.c
@@ -9,7 +9,7 @@ int *bar(float *f) { return f; }
// RUN: c-index-test -test-load-source-reparse 5 all -w %s 2>&1 | FileCheck -check-prefix=NOWARNINGS %s
// RUN: c-index-test -test-load-source all -w -O4 %s 2>&1 | FileCheck -check-prefix=NOWARNINGS %s
-// CHECK-BOTH-WARNINGS: warning: non-void function does not return a value
+// CHECK-BOTH-WARNINGS: error: non-void function does not return a value
// CHECK-BOTH-WARNINGS: warning: incompatible pointer types returning 'float *' from a function with result type 'int *'
// CHECK-SECOND-WARNING-NOT:non-void function does not return a value
|
Looks like I might have to fix some compiler-rt tests first; that might well end up being another separate pr. |
Ok, it ended up being only 3 compiler-rt tests that needed fixing. |
Thanks for working on that |
There are implications with #123166, which might also be clang 21 material |
Not yet; that’s probably a good idea. |
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 a lot of diagnostics were updated to DefaultError
but I don't see matching tests that demonstrate the now error. We should be testing each diagnostic.
#123464 also added |
Yeah, probably |
First off, I really appreciate this patch because (to me) it's not really defensible in 2025 that falling off the end of a function with a non-void return type is anything but an error. So thank you! I do think this is Clang 21 material though because I suspect the fallout from this might be a challenge. Specifically, I wonder about |
Yeah, agreed.
I hadn’t thought about that, that’s a good point.
I’m not really familiar w/ autoconf, so no, I haven’t. |
I missed that but it was a large change. In the future it would be helpful to mention that in the summary since we do expect all diagnostics we modify/add to have full coverage. Otherwise we leave ourselves open to future regressions. |
I'm worried about the fallout and I have vague recollections of some early work I did when I assumed we were making this change for the C99 enforcement work, but I don't have specifics. I can look into this but I'd need time -- I can't do that ready for Clang 20. |
@AaronBallman On another note, we've had people request this many times in GCC for C++ at least, but it has FPs which I thought were unavoidable. I was under the impression Clang generally didn't do "middle-end"-style (or optimisation-dependent) warnings. Is it implemented differently in Clang, am I misremembering or misunderstanding something, or is Clang just accepting the FPs here? (cc @pinskia) |
The way |
Another option would be to make this default to an error depending on the language mode (e.g. only in C23 or later, and either unconditionally in C++ or in e.g. C++17 or later etc.); I don’t have any actual data on this, but I would imagine that most programs that actually have code that triggers this warning are probably C99 or earlier. |
Is |
There definitely are cases where we currently can’t figure out that a function always returns if the control flow is very convoluted, e.g. #111509 has this horrible example int foo(int x) {
bool matched = false;
do {
if (matched) {
label: return 0;
}
if (matched || x == 1) {
matched = true;
return 123;
}
if (matched || x == 2) {
matched = true;
return 456;
}
if (matched) {
break;
}
goto label;
} while(false);
} |
Thanks. I expect there'll be some fallout but you also get missed optimisation bugs out of that in some cases, so.
This unfortunately won't work when we change the default to C23 and so on, but it could help a little bit for those who explicitly build with |
At least that’s what I hope we’ll be able to do. A compromise would be to only enable it in e.g. C23/C++26/whatever, but that doesn’t quite seem satisfactory to me... |
Yeah, the goal is to improve safety and security, and so I think it makes sense to aim for enabling this in all language modes. Even if we enable it only in C23 or later as a fallback, it still means projects will struggle to upgrade to the latest C standard, so it's better for us to try to address as many pain points as we can so that migration path is easier for users. |
✅ With the latest revision this PR passed the C/C++ code formatter. |
-Wreturn-type
default to an error in all language modes-Wreturn-type
warnings in tests everywhere
Ok, this is now another NFC pr that just fixes a bunch of tests. |
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.
LGTM; I'm sure plenty of these could have changed the return type to void
, but I think adding a return
statement is fine as well (it means we don't have to question whether the return type mattered elsewhere in the tests).
Yeah, that’s the main reason I opted for adding a |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/144/builds/18525 Here is the relevant piece of the build log for the reference
|
That seems related; I’ll investigate this in a bit. |
#123470 broke one of the clang-tidy tests; this fixes that.
Should be fixed by #128051. |
This makes-Wreturn-type
default to an error in all language modes as there is basically never a reason as to why one would want to fall off the end of a non-void function.Most of the tedious work of migrating the tests was done in #123464 (except for one test that for some reason didn’t want to cooperate earlier, which is why that one is handled in this pr).It turns out that most of the tedious work is not done yet, so this fixes even more tests, mainly clang-tidy and clangd tests.