Change EmitConstantExpr to allow failure.

IRgen no longer relies on isConstantInitializer, instead we just try
to emit the constant. If that fails then in C we emit an error
unsupported (this occurs when Sema accepted something that it doesn't
know how to fold, and IRgen doesn't know how to emit) and in C++ we
emit a guarded initializer.

This ends up handling a few more cases, because IRgen was actually
able to emit some of the constants Sema accepts but can't Evaluate().
For example, PR3398.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64780 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index bb2705f..f2fec65 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -88,12 +88,17 @@
   if ((D.getInit() == 0) || NoInit) {
     Init = llvm::Constant::getNullValue(LTy);
   } else {
-    if (D.getInit()->isConstantInitializer(getContext()))
-      Init = CGM.EmitConstantExpr(D.getInit(), this);
-    else {
-      assert(getContext().getLangOptions().CPlusPlus && 
-             "only C++ supports non-constant static initializers!");
-      return GenerateStaticCXXBlockVarDecl(D);
+    Init = CGM.EmitConstantExpr(D.getInit(), this);
+
+    // If constant emission failed, then this should be a C++ static
+    // initializer.
+    if (!Init) {
+      if (!getContext().getLangOptions().CPlusPlus) {
+        CGM.ErrorUnsupported(D.getInit(), "constant l-value expression");
+        Init = llvm::Constant::getNullValue(LTy);
+      } else {
+        return GenerateStaticCXXBlockVarDecl(D);
+      }
     }
   }