mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 14:48:27 +08:00
PR38141: check whether noexcept-specifications are equivalent in redeclarations
llvm-svn: 336946
This commit is contained in:
@@ -530,10 +530,16 @@ static bool CheckEquivalentExceptionSpecImpl(
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: We treat dependent noexcept specifications as compatible even if
|
||||
// their expressions are not equivalent.
|
||||
if (OldEST == EST_DependentNoexcept && NewEST == EST_DependentNoexcept)
|
||||
return false;
|
||||
// C++14 [except.spec]p3:
|
||||
// Two exception-specifications are compatible if [...] both have the form
|
||||
// noexcept(constant-expression) and the constant-expressions are equivalent
|
||||
if (OldEST == EST_DependentNoexcept && NewEST == EST_DependentNoexcept) {
|
||||
llvm::FoldingSetNodeID OldFSN, NewFSN;
|
||||
Old->getNoexceptExpr()->Profile(OldFSN, S.Context, true);
|
||||
New->getNoexceptExpr()->Profile(NewFSN, S.Context, true);
|
||||
if (OldFSN == NewFSN)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Dynamic exception specifications with the same set of adjusted types
|
||||
// are compatible.
|
||||
|
||||
@@ -104,3 +104,13 @@ void* operator new(mysize_t);
|
||||
void* operator new[](mysize_t);
|
||||
void* operator new[](mysize_t) throw(std::bad_alloc);
|
||||
|
||||
template<bool X> void equivalent() noexcept (X);
|
||||
template<bool X> void equivalent() noexcept (X);
|
||||
|
||||
template<bool X, bool Y> void not_equivalent() noexcept (X); // expected-note {{previous}}
|
||||
template<bool X, bool Y> void not_equivalent() noexcept (Y); // expected-error {{does not match}}
|
||||
|
||||
template<bool X> void missing() noexcept (X); // expected-note {{previous}}
|
||||
// FIXME: The missing exception specification that we report here doesn't make
|
||||
// sense in the context of this declaration.
|
||||
template<bool P> void missing(); // expected-error {{missing exception specification 'noexcept(X)'}}
|
||||
|
||||
@@ -10,7 +10,7 @@ template<typename T> void redecl1() noexcept(noexcept(T())); // ok, same type
|
||||
template<typename T> void redecl1() noexcept(noexcept(T())) {} // expected-error {{redefinition}}
|
||||
|
||||
template<bool A, bool B> void redecl2() noexcept(A); // expected-note {{previous}}
|
||||
template<bool A, bool B> void redecl2() noexcept(B); // expected-error {{conflicting types}}
|
||||
template<bool A, bool B> void redecl2() noexcept(B); // expected-error {{does not match previous}}
|
||||
|
||||
// These have the same canonical type, but are still different.
|
||||
template<typename A, typename B> void redecl3() throw(A); // expected-note {{previous}}
|
||||
|
||||
Reference in New Issue
Block a user