mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-07 01:47:09 +00:00
[clang]improve diagnosing redefined defaulted constructor with different exception specs (#69688)
This commit is contained in:
parent
2dea7bd8a0
commit
53705ddcb7
@ -348,6 +348,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 now diagnoses redefined defaulted constructor when redefined
|
||||
defaulted constructor with different exception specs.
|
||||
(`#69094: <https://github.com/llvm/llvm-project/issues/69094>`_)
|
||||
- Clang now diagnoses use of variable-length arrays in C++ by default (and
|
||||
under ``-Wall`` in GNU++ mode). This is an extension supported by Clang and
|
||||
GCC, but is very easy to accidentally use without realizing it's a
|
||||
|
@ -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
|
||||
|
@ -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}}
|
Loading…
x
Reference in New Issue
Block a user