зеркало из https://github.com/microsoft/clang-1.git
Suppress bogus "use of undefined constexpr function" error if the function body
was erroneous and got discarded. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181758 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
69db555a7a
Коммит
f039e3eb0f
|
@ -3161,6 +3161,11 @@ static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc,
|
|||
Declaration->isConstexpr())
|
||||
return false;
|
||||
|
||||
// Bail out with no diagnostic if the function declaration itself is invalid.
|
||||
// We will have produced a relevant diagnostic while parsing it.
|
||||
if (Declaration->isInvalidDecl())
|
||||
return false;
|
||||
|
||||
// Can we evaluate this function call?
|
||||
if (Definition && Definition->isConstexpr() && !Definition->isInvalidDecl())
|
||||
return true;
|
||||
|
|
|
@ -1503,3 +1503,11 @@ namespace PR15884 {
|
|||
// expected-note@-3 {{pointer to temporary is not a constant expression}}
|
||||
// expected-note@-4 {{temporary created here}}
|
||||
}
|
||||
|
||||
namespace AfterError {
|
||||
// FIXME: Suppress the 'no return statements' diagnostic if the body is invalid.
|
||||
constexpr int error() { // expected-error {{no return statement}}
|
||||
return foobar; // expected-error {{undeclared identifier}}
|
||||
}
|
||||
constexpr int k = error(); // expected-error {{must be initialized by a constant expression}}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ struct Base {
|
|||
template<typename T> struct S : Base {
|
||||
enum E : int;
|
||||
constexpr int f() const;
|
||||
constexpr int g() const; // expected-note {{declared here}}
|
||||
constexpr int g() const;
|
||||
void h();
|
||||
};
|
||||
template<> enum S<char>::E : int {}; // expected-note {{enum 'S<char>::E' was explicitly specialized here}}
|
||||
|
@ -23,7 +23,7 @@ static_assert(S<int>().f() == 1, "");
|
|||
// The unqualified-id here names a member of the current instantiation, which
|
||||
// bizarrely might not exist in some instantiations.
|
||||
template<typename T> constexpr int S<T>::g() const { return b; } // expected-error {{enumerator 'b' does not exist in instantiation of 'S<char>'}}
|
||||
static_assert(S<char>().g() == 1, ""); // expected-note {{here}} expected-error {{not an integral constant expression}} expected-note {{undefined}}
|
||||
static_assert(S<char>().g() == 1, ""); // expected-note {{here}} expected-error {{not an integral constant expression}}
|
||||
static_assert(S<short>().g() == 2, "");
|
||||
static_assert(S<long>().g() == 8, "");
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче