First version of a testcase, plus fixes.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113624 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 35456b3..435f754 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1369,6 +1369,9 @@
   if (DC->isTypeDependent())
     return Expr::CT_Dependent;
 
+  if (!DC->getTypeAsWritten()->isReferenceType())
+    return Expr::CT_Cannot;
+
   return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot;
 }
 
@@ -1429,7 +1432,8 @@
     return MergeCanThrow(CT, CanSubExprsThrow(C, this));
   }
 
-  case CXXConstructExprClass: {
+  case CXXConstructExprClass:
+  case CXXTemporaryObjectExprClass: {
     CanThrowResult CT = CanCalleeThrow(
         cast<CXXConstructExpr>(this)->getConstructor());
     if (CT == CT_Can)
@@ -1479,7 +1483,6 @@
   case CXXDefaultArgExprClass:
   case CXXBindTemporaryExprClass:
   case CXXExprWithTemporariesClass:
-  case CXXTemporaryObjectExprClass:
   case ObjCIvarRefExprClass:
   case ObjCIsaExprClass:
   case ShuffleVectorExprClass:
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 165dd4d..c2b981c 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -958,6 +958,8 @@
   bool VisitUnaryReal(const UnaryOperator *E);
   bool VisitUnaryImag(const UnaryOperator *E);
 
+  bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E);
+
 private:
   CharUnits GetAlignOfExpr(const Expr *E);
   CharUnits GetAlignOfType(QualType T);
@@ -1740,6 +1742,10 @@
   return Success(0, E);
 }
 
+bool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) {
+  return Success(E->getValue(), E);
+}
+
 //===----------------------------------------------------------------------===//
 // Float Evaluation
 //===----------------------------------------------------------------------===//