diff mbox series

[C++] Fix -fno-weak ICE with inline vars (PR c++/89405)

Message ID 20190220222539.GO2135@tucnak
State New
Headers show
Series [C++] Fix -fno-weak ICE with inline vars (PR c++/89405) | expand

Commit Message

Jakub Jelinek Feb. 20, 2019, 10:25 p.m. UTC
Hi!

The following testcase ICEs with -fno-weak, because maybe_commonize_var
clears TREE_PUBLIC/DECL_COMMON, but later we assume that if
!DECL_INTERFACE_KNOWN that TREE_PUBLIC is true.
Other spots that clear TREE_PUBLIC also set DECL_INTERFACE_KNOWN,
e.g. twice in optimize.c:
cp/optimize.c-      TREE_PUBLIC (fn) = false;
cp/optimize.c-      DECL_EXTERNAL (fn) = false;
cp/optimize.c:      DECL_INTERFACE_KNOWN (fn) = true;

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-02-20  Jakub Jelinek  <jakub@redhat.com>

	PR c++/89405
	* decl.c (maybe_commonize_var): When clearing TREE_PUBLIC and
	DECL_COMMON, set DECL_INTERFACE_KNOWN.

	* g++.dg/cpp1z/inline-var5.C: New test.


	Jakub

Comments

Jason Merrill Feb. 20, 2019, 11:59 p.m. UTC | #1
On 2/20/19 12:25 PM, Jakub Jelinek wrote:
> Hi!
> 
> The following testcase ICEs with -fno-weak, because maybe_commonize_var
> clears TREE_PUBLIC/DECL_COMMON, but later we assume that if
> !DECL_INTERFACE_KNOWN that TREE_PUBLIC is true.
> Other spots that clear TREE_PUBLIC also set DECL_INTERFACE_KNOWN,
> e.g. twice in optimize.c:
> cp/optimize.c-      TREE_PUBLIC (fn) = false;
> cp/optimize.c-      DECL_EXTERNAL (fn) = false;
> cp/optimize.c:      DECL_INTERFACE_KNOWN (fn) = true;
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2019-02-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c++/89405
> 	* decl.c (maybe_commonize_var): When clearing TREE_PUBLIC and
> 	DECL_COMMON, set DECL_INTERFACE_KNOWN.

OK.

Jason
diff mbox series

Patch

--- gcc/cp/decl.c.jj	2019-02-14 08:06:37.905546103 +0100
+++ gcc/cp/decl.c	2019-02-20 13:31:07.721873449 +0100
@@ -5634,6 +5634,7 @@  maybe_commonize_var (tree decl)
 		 be merged.  */
 	      TREE_PUBLIC (decl) = 0;
 	      DECL_COMMON (decl) = 0;
+	      DECL_INTERFACE_KNOWN (decl) = 1;
 	      const char *msg;
 	      if (DECL_INLINE_VAR_P (decl))
 		msg = G_("sorry: semantics of inline variable "
--- gcc/testsuite/g++.dg/cpp1z/inline-var5.C.jj	2019-02-20 14:25:41.799665033 +0100
+++ gcc/testsuite/g++.dg/cpp1z/inline-var5.C	2019-02-20 14:25:09.813194982 +0100
@@ -0,0 +1,11 @@ 
+// PR c++/89405
+// { dg-do compile { target c++17 } }
+// { dg-options "-fno-weak" }
+
+template <int N>
+struct S
+{
+  static constexpr int a = N;	// { dg-warning "semantics of inline variable" }
+};				// { dg-message "you can work around this" "" { target *-*-* } .-1 }
+
+const int *x = &S<0>::a;