diff options
author | Erich Keane <erich.keane@intel.com> | 2017-10-12 23:01:53 +0000 |
---|---|---|
committer | Erich Keane <erich.keane@intel.com> | 2017-10-12 23:01:53 +0000 |
commit | 883f22ef7e5ba3848558306ab039f76be46b4005 (patch) | |
tree | e94de201335c0a7830d97f81d571e263a0847590 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | bb8507e63c42212c3753c0df069ec16a52652247 (diff) | |
download | bcm5719-llvm-883f22ef7e5ba3848558306ab039f76be46b4005.tar.gz bcm5719-llvm-883f22ef7e5ba3848558306ab039f76be46b4005.zip |
[Sema][Crash] Correctly handle an non-dependent noexcept expr in function template
It seems that all of the other templated cases are handled correctly,
however the function template case was not correctly handled. This
patch recovers from this condition by setting the function to noexcept
after diagnosing. Previously it simply set NoexceptExpr to null,
which caused an Assert when this was evaluated during substitution.
Differential Revision:https://reviews.llvm.org/D38700
llvm-svn: 315638
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c385e0481ba..a01f9d5bab9 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -14865,10 +14865,16 @@ void Sema::checkExceptionSpecification( return; } - if (!NoexceptExpr->isValueDependent()) - NoexceptExpr = VerifyIntegerConstantExpression(NoexceptExpr, nullptr, - diag::err_noexcept_needs_constant_expression, - /*AllowFold*/ false).get(); + if (!NoexceptExpr->isValueDependent()) { + ExprResult Result = VerifyIntegerConstantExpression( + NoexceptExpr, nullptr, diag::err_noexcept_needs_constant_expression, + /*AllowFold*/ false); + if (Result.isInvalid()) { + ESI.Type = EST_BasicNoexcept; + return; + } + NoexceptExpr = Result.get(); + } ESI.NoexceptExpr = NoexceptExpr; } return; |