PR c++/69688
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 2016 15:40:33 +0000 (15:40 +0000)
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 2016 15:40:33 +0000 (15:40 +0000)
* constexpr.c (clear_cv_and_fold_caches): Renamed from clear_cv_cache.
Call clear_fold_cache.
* cp-tree.h: Adjust declaration.
* decl.c (finish_enum_value_list): Call clear_cv_and_fold_caches
rather than clear_cv_cache and clear_fold_cache.
* typeck2.c (store_init_value): Call clear_cv_and_fold_caches.

* g++.dg/init/const12.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233220 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/const12.C [new file with mode: 0644]

index 470d825..32fbe6f 100644 (file)
@@ -1,3 +1,13 @@
+2016-02-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/69688
+       * constexpr.c (clear_cv_and_fold_caches): Renamed from clear_cv_cache.
+       Call clear_fold_cache.
+       * cp-tree.h: Adjust declaration.
+       * decl.c (finish_enum_value_list): Call clear_cv_and_fold_caches
+       rather than clear_cv_cache and clear_fold_cache.
+       * typeck2.c (store_init_value): Call clear_cv_and_fold_caches.
+
 2016-02-08  Jason Merrill  <jason@redhat.com>
 
        * cp-tree.h (CONV_FOLD, CONV_BACKEND_CONVERT): New.
index 05f6843..85fc64e 100644 (file)
@@ -4098,12 +4098,13 @@ maybe_constant_value (tree t, tree decl)
   return ret;
 }
 
-/* Dispose of the whole CV_CACHE.  */
+/* Dispose of the whole CV_CACHE and FOLD_CACHE.  */
 
 void
-clear_cv_cache (void)
+clear_cv_and_fold_caches (void)
 {
   gt_cleare_cache (cv_cache);
+  clear_fold_cache ();
 }
 
 /* Like maybe_constant_value but first fully instantiate the argument.
index 786927b..ead017e 100644 (file)
@@ -6922,7 +6922,7 @@ extern bool var_in_constexpr_fn                 (tree);
 extern void explain_invalid_constexpr_fn        (tree);
 extern vec<tree> cx_error_context               (void);
 extern tree fold_sizeof_expr                   (tree);
-extern void clear_cv_cache                     (void);
+extern void clear_cv_and_fold_caches           (void);
 
 /* In c-family/cilk.c */
 extern bool cilk_valid_spawn                    (tree);
index 2c337bc..11f7ce6 100644 (file)
@@ -13414,8 +13414,7 @@ finish_enum_value_list (tree enumtype)
 
   /* Each enumerator now has the type of its enumeration.  Clear the cache
      so that this change in types doesn't confuse us later on.  */
-  clear_cv_cache ();
-  clear_fold_cache ();
+  clear_cv_and_fold_caches ();
 }
 
 /* Finishes the enum type. This is called only the first time an
index 419faa2..2a76c96 100644 (file)
@@ -837,6 +837,9 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
     /* Handle aggregate NSDMI in non-constant initializers, too.  */
     value = replace_placeholders (value, decl);
 
+  /* DECL may change value; purge caches.  */
+  clear_cv_and_fold_caches ();
+
   /* If the initializer is not a constant, fill in DECL_INITIAL with
      the bits that are constant, and then return an expression that
      will perform the dynamic initialization.  */
index be3f5ec..b30f01d 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/69688
+       * g++.dg/init/const12.C: New test.
+
 2016-02-08  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR target/60410
diff --git a/gcc/testsuite/g++.dg/init/const12.C b/gcc/testsuite/g++.dg/init/const12.C
new file mode 100644 (file)
index 0000000..2f6f9b2
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/69688
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+
+struct S
+{
+  static const int s;
+  static const char c[];
+  static wchar_t w[];
+
+  S ()
+    {
+      for (int i = 0; i < s; i++)
+       w[i] = 0;
+    }
+};
+
+const char S::c[] = "x";
+const int S::s = sizeof (S::c) - 1;
+wchar_t S::w[S::s];