-
Notifications
You must be signed in to change notification settings - Fork 10.8k
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
[Clang][Sema] improve sema check of clang::musttail attribute #77727
Conversation
@llvm/pr-subscribers-hlsl @llvm/pr-subscribers-clang Author: Qizhi Hu (jcsxky) ChangesCall function with no-return attribute generate code with unreachable instruction instead of return and if the call statement has Full diff: https://github.com/llvm/llvm-project/pull/77727.diff 3 Files Affected:
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 3884dca59e2f3b..b40befc5c1cfb5 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3113,6 +3113,8 @@ def err_musttail_scope : Error<
"cannot perform a tail call from this return statement">;
def err_musttail_no_variadic : Error<
"%0 attribute may not be used with variadic functions">;
+def err_musttail_no_return : Error<
+ "%0 attribute may not be used with no-return-attribute functions">;
def err_nsobject_attribute : Error<
"'NSObject' attribute is for pointer types only">;
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 21efe25ed84a3d..9e7c8c7e4e8c12 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -786,6 +786,12 @@ bool Sema::checkMustTailAttr(const Stmt *St, const Attr &MTA) {
return false;
}
+ const auto *CalleeDecl = CE->getCalleeDecl();
+ if (CalleeDecl && CalleeDecl->hasAttr<CXX11NoReturnAttr>()) {
+ Diag(St->getBeginLoc(), diag::err_musttail_no_return) << &MTA;
+ return false;
+ }
+
// Caller and callee must match in whether they have a "this" parameter.
if (CallerType.This.isNull() != CalleeType.This.isNull()) {
if (const auto *ND = dyn_cast_or_null<NamedDecl>(CE->getCalleeDecl())) {
diff --git a/clang/test/SemaCXX/PR76631.cpp b/clang/test/SemaCXX/PR76631.cpp
new file mode 100644
index 00000000000000..df89753bd12580
--- /dev/null
+++ b/clang/test/SemaCXX/PR76631.cpp
@@ -0,0 +1,7 @@
+[[noreturn]] void throw_int() {
+ throw int();
+}
+
+void throw_int_wrapper() {
+ [[clang::musttail]] return throw_int(); // expected-error {{'musttail' attribute may not be used with no-return-attribute functions}}
+}
|
cdc04d0
to
75e9a81
Compare
75e9a81
to
0281f6d
Compare
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.
Just needs a release note, else LGTM.
0281f6d
to
537228e
Compare
Release note has been added. |
537228e
to
67396b5
Compare
67396b5
to
17e2f6d
Compare
…7727) Call function with no-return attribute generates code with unreachable instruction instead of return and if the call statement has `clang::musttail` attribute, it would crash in `VerifyPass`. Check this condition in Sema ahead. Fix [issue](llvm#76631) Co-authored-by: huqizhi <836744285@qq.com>
Call function with no-return attribute generates code with unreachable instruction instead of return and if the call statement has
clang::musttail
attribute, it would crash inVerifyPass
. Check this condition in Sema ahead.Fix issue