]> granicus.if.org Git - clang/commitdiff
Merging r292561:
authorHans Wennborg <hans@hanshq.net>
Fri, 27 Jan 2017 16:26:10 +0000 (16:26 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 27 Jan 2017 16:26:10 +0000 (16:26 +0000)
------------------------------------------------------------------------
r292561 | rsmith | 2017-01-19 17:19:46 -0800 (Thu, 19 Jan 2017) | 3 lines

PR31701: Fix crash on invalid caused by parsing a dependent initializer when we
don't know we're in a dependent context.

------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_40@293297 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/SemaCXX/constant-expression.cpp

index d03c22af5b29b27e981877f13920bc43684b42fb..b531a66dbab3d8f3b5d1c3fdcc5d94f754951362 100644 (file)
@@ -9025,7 +9025,8 @@ bool ASTContext::DeclMustBeEmitted(const Decl *D) {
 
   // Variables that have initialization with side-effects are required.
   if (VD->getInit() && VD->getInit()->HasSideEffects(*this) &&
-      !VD->evaluateValue())
+      // We can get a value-dependent initializer during error recovery.
+      (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
     return true;
 
   // Likewise, variables with tuple-like bindings are required if their
index f82a6920937962883bb71c24ab5175713fc16b31..69e846bf0ec22bd0d9caa6d5bab1ad61bf0f9b8f 100644 (file)
@@ -143,3 +143,14 @@ namespace rdar16064952 {
 }
 
 char PR17381_ice = 1000000 * 1000000; // expected-warning {{overflow}} expected-warning {{changes value}}
+
+namespace PR31701 {
+  struct C {
+    template<int i> static int n; // expected-warning {{extension}}
+  };
+  template <int M> class D;
+  template <int M>
+  template<int i> void D<M>::set() { // expected-error {{from class 'D<M>' without definition}}
+    const C c = C::n<i>;
+  }
+}