After instantiating a 'noexcept' expression, be	sure to	convert	it to
a boolean value and check that it is a constant expression. Fixes
PR11084.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141511 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 4fea400..c8628db 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -2286,7 +2286,21 @@
       EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
       ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs);
       if (E.isUsable())
+        E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart());
+    
+      if (E.isUsable()) {
+        SourceLocation ErrLoc;
+        llvm::APSInt NoexceptVal;
         NoexceptExpr = E.take();
+        if (!NoexceptExpr->isTypeDependent() &&
+            !NoexceptExpr->isValueDependent() &&
+            !NoexceptExpr->isIntegerConstantExpr(NoexceptVal, SemaRef.Context,
+                                                 &ErrLoc, /*evaluated=*/false)){
+          SemaRef.Diag(ErrLoc, diag::err_noexcept_needs_constant_expression)
+            << NoexceptExpr->getSourceRange();
+          NoexceptExpr = 0;
+        }
+      }
     }
 
     // Rebuild the function type