-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang]improve diagnosing redefined defaulted constructor with different exception specs #69688
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
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@llvm/pr-subscribers-clang Author: Congcong Cai (HerrCai0907) ChangesIt is misleading when diagnosing 'ExplicitlySpecialMethod' is missing exception specification 'noexcept' for struct ExplicitlySpecialMethod {
ExplicitlySpecialMethod() = default;
};
ExplicitlySpecialMethod::ExplicitlySpecialMethod() {} Fixes: #69094 Full diff: https://github.com/llvm/llvm-project/pull/69688.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index fc8caf9221b9d29..bf53dfe6c415245 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -325,6 +325,9 @@ Improvements to Clang's diagnostics
| ~~~~~~~~~^~~~~~~~
- Clang now always diagnoses when using non-standard layout types in ``offsetof`` .
(`#64619: <https://github.com/llvm/llvm-project/issues/64619>`_)
+- Clang nows diagnose redefined defaulted default constructor when redefined
+ defaulted default constructor with different exception specs.
+ (`#69094: <https://github.com/llvm/llvm-project/issues/69094>`_)
Bug Fixes in This Version
-------------------------
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index b363b0db79f164d..c4979b51e68f5e2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -3922,18 +3922,6 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S,
}
if (getLangOpts().CPlusPlus) {
- // C++1z [over.load]p2
- // Certain function declarations cannot be overloaded:
- // -- Function declarations that differ only in the return type,
- // the exception specification, or both cannot be overloaded.
-
- // Check the exception specifications match. This may recompute the type of
- // both Old and New if it resolved exception specifications, so grab the
- // types again after this. Because this updates the type, we do this before
- // any of the other checks below, which may update the "de facto" NewQType
- // but do not necessarily update the type of New.
- if (CheckEquivalentExceptionSpec(Old, New))
- return true;
OldQType = Context.getCanonicalType(Old->getType());
NewQType = Context.getCanonicalType(New->getType());
@@ -4055,6 +4043,19 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S,
}
}
+ // C++1z [over.load]p2
+ // Certain function declarations cannot be overloaded:
+ // -- Function declarations that differ only in the return type,
+ // the exception specification, or both cannot be overloaded.
+
+ // Check the exception specifications match. This may recompute the type of
+ // both Old and New if it resolved exception specifications, so grab the
+ // types again after this. Because this updates the type, we do this before
+ // any of the other checks below, which may update the "de facto" NewQType
+ // but do not necessarily update the type of New.
+ if (CheckEquivalentExceptionSpec(Old, New))
+ return true;
+
// C++11 [dcl.attr.noreturn]p1:
// The first declaration of a function shall specify the noreturn
// attribute if any declaration of that function specifies the noreturn
diff --git a/clang/test/SemaCXX/diagnoise-prioritiy-exception-redefining.cpp b/clang/test/SemaCXX/diagnoise-prioritiy-exception-redefining.cpp
new file mode 100644
index 000000000000000..ad025bf041ce519
--- /dev/null
+++ b/clang/test/SemaCXX/diagnoise-prioritiy-exception-redefining.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -fcxx-exceptions -std=c++11 %s
+
+struct ExplicitlySpecialMethod {
+ ExplicitlySpecialMethod() = default;
+};
+ExplicitlySpecialMethod::ExplicitlySpecialMethod() {} // expected-error{{definition of explicitly defaulted default constructor}}
+
+struct ImplicitlySpecialMethod {};
+ImplicitlySpecialMethod::ImplicitlySpecialMethod() {} // expected-error{{definition of implicitly declared default constructor}}
|
…ent exception specs It is misleading when diagnosing 'ExplicitlySpecialMethod' is missing exception specification 'noexcept' for ```c++ struct ExplicitlySpecialMethod { ExplicitlySpecialMethod() = default; }; ExplicitlySpecialMethod::ExplicitlySpecialMethod() {} ``` Fixes: #69094
tbaederr
reviewed
Oct 20, 2023
clang/test/SemaCXX/diagnoise-prioritiy-exception-redefining.cpp
Outdated
Show resolved
Hide resolved
erichkeane
approved these changes
Oct 25, 2023
qtprojectorg
pushed a commit
to qt/qttools
that referenced
this pull request
Jun 12, 2024
Due to an upstream change [0], QDoc no longer generates the `noexcept` specifier for compiler generated member functions when QDoc is linked against LLVM 18. This change modifies the test projects for the output validation test such that documentation isn't generated for such functions in tests, thus ensuring that QDoc generates identical output for the test projects when linked against both LLVM 17 and 18. [0] llvm/llvm-project#69688 Task-number: QTBUG-123130 Change-Id: I0d1fd48be08ec4beb11e1d74ae574ddb2c914a4a Reviewed-by: Topi Reiniö <[email protected]>
qtprojectorg
pushed a commit
to qt/qttools
that referenced
this pull request
Jul 29, 2024
Due to an upstream change [0], QDoc no longer generates the `noexcept` specifier for compiler generated member functions when QDoc is linked against LLVM 18. This change modifies the test projects for the output validation test such that documentation isn't generated for such functions in tests, thus ensuring that QDoc generates identical output for the test projects when linked against both LLVM 17 and 18. [0] llvm/llvm-project#69688 Task-number: QTBUG-123130 Change-Id: I0d1fd48be08ec4beb11e1d74ae574ddb2c914a4a Reviewed-by: Topi Reiniö <[email protected]> (cherry picked from commit 9f2cbfc)
qtprojectorg
pushed a commit
to qt/qttools
that referenced
this pull request
Jul 29, 2024
Due to an upstream change [0], QDoc no longer generates the `noexcept` specifier for compiler generated member functions when QDoc is linked against LLVM 18. The issue has been addressed previously for the `tst_validateQdocOutputFiles` test [1], by modifying the impacted test data such that documentation isn't generated for such functions in tests, thus ensuring that QDoc generates identical output for the test projects when linked against both LLVM 17 and 18. Due to an oversight, the duplicate test data in `tst_generatedOutput` was not modified accordingly. This change addresses that mistake. [0] llvm/llvm-project#69688 [1] 9f2cbfc (qttools.git) Task-number: QTBUG-123130 Change-Id: I72da94b49144649d787158894ae1bf09589fc7f3 Reviewed-by: Luca Di Sera <[email protected]>
qtprojectorg
pushed a commit
to qt/qttools
that referenced
this pull request
Aug 1, 2024
Due to an upstream change [0], QDoc no longer generates the `noexcept` specifier for compiler generated member functions when QDoc is linked against LLVM 18. The issue has been addressed previously for the `tst_validateQdocOutputFiles` test [1], by modifying the impacted test data such that documentation isn't generated for such functions in tests, thus ensuring that QDoc generates identical output for the test projects when linked against both LLVM 17 and 18. Due to an oversight, the duplicate test data in `tst_generatedOutput` was not modified accordingly. This change addresses that mistake. [0] llvm/llvm-project#69688 [1] 9f2cbfc (qttools.git) Task-number: QTBUG-123130 Change-Id: I72da94b49144649d787158894ae1bf09589fc7f3 Reviewed-by: Luca Di Sera <[email protected]> (cherry picked from commit 274a589) Reviewed-by: Topi Reiniö <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
clang:frontend
Language frontend issues, e.g. anything involving "Sema"
clang
Clang issues not falling into any other category
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
It is misleading when diagnosing 'ExplicitlySpecialMethod' is missing exception specification 'noexcept' for
Fixes: #69094