]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/37348 (internal compiler error: tree check: expected var_decl, have field_d...
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Sep 2008 20:34:35 +0000 (22:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Sep 2008 20:34:35 +0000 (22:34 +0200)
PR c++/37348
* decl.c (cp_finish_decl): Only set
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P if decl is VAR_DECL.

* g++.dg/parse/crash45.C: New test.

From-SVN: r139956

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/crash45.C [new file with mode: 0644]

index 442dd8e60e97290351ef1ddd0be51c341e756a96..4166bd148dacf1c6c8684b3586ba5017da2dfae5 100644 (file)
@@ -1,5 +1,9 @@
 2008-09-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/37348
+       * decl.c (cp_finish_decl): Only set
+       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P if decl is VAR_DECL.
+
        PR c++/37189
        * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): New
        extern decls.
index fbd16e5b19c5345f79a096c540709065acee2b63..c045353fe7f541627e369f2835b894525af13d2b 100644 (file)
@@ -5517,7 +5517,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
          DECL_INITIAL (decl) = NULL_TREE;
        }
 
-      if (init && init_const_expr_p)
+      if (init && init_const_expr_p && TREE_CODE (decl) == VAR_DECL)
        {
          DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1;
          if (DECL_INTEGRAL_CONSTANT_VAR_P (decl))
index bfadce1f807d3c049bf645980eb79a698bc66db6..b1d932467680f92454a597b9e48ca11d8653d9f0 100644 (file)
@@ -1,5 +1,8 @@
 2008-09-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/37348
+       * g++.dg/parse/crash45.C: New test.
+
        PR c++/37189
        * g++.dg/gomp/pr37189.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/parse/crash45.C b/gcc/testsuite/g++.dg/parse/crash45.C
new file mode 100644 (file)
index 0000000..8696ab4
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/37348
+// { dg-do compile }
+
+struct A
+{
+  template <class> int f (B);  // { dg-error "was not declared in this scope|cannot be a member template" }
+};