PR c++/83720 - different fix
authorJason Merrill <jason@redhat.com>
Mon, 22 Jan 2018 22:41:48 +0000 (17:41 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 22 Jan 2018 22:41:48 +0000 (17:41 -0500)
* decl2.c (determine_visibility): Fix template_decl handling
instead of blocking it.

From-SVN: r256965

gcc/cp/ChangeLog
gcc/cp/decl2.c

index 8ec76a4..004d234 100644 (file)
@@ -1,5 +1,9 @@
 2018-01-22  Jason Merrill  <jason@redhat.com>
 
+       PR c++/83720
+       * decl2.c (determine_visibility): Fix template_decl handling
+       instead of blocking it.
+
        PR c++/83720 - ICE with lambda and LTO.
        * decl2.c (determine_visibility): Clear template_decl for
        function-scope decls.  Propagate anonymous linkage from containing
index 6324c55..ef7e6de 100644 (file)
@@ -2388,9 +2388,7 @@ determine_visibility (tree decl)
             containing function by default, except that
             -fvisibility-inlines-hidden doesn't affect them.  */
          tree fn = DECL_CONTEXT (decl);
-         if (! TREE_PUBLIC (fn))
-           constrain_visibility (decl, VISIBILITY_ANON, false);
-         else if (DECL_VISIBILITY_SPECIFIED (fn))
+         if (DECL_VISIBILITY_SPECIFIED (fn))
            {
              DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
              DECL_VISIBILITY_SPECIFIED (decl) = 
@@ -2416,9 +2414,10 @@ determine_visibility (tree decl)
 
          /* Local classes in templates have CLASSTYPE_USE_TEMPLATE set,
             but have no TEMPLATE_INFO.  Their containing template
-            function determines their visibility, so we neither
-            need nor want the template_decl handling.  */
-         template_decl = NULL_TREE;
+            function does, and the local class could be constrained
+            by that.  */
+         if (DECL_LANG_SPECIFIC (fn) && DECL_USE_TEMPLATE (fn))
+           template_decl = fn;
        }
       else if (VAR_P (decl) && DECL_TINFO_P (decl)
               && flag_visibility_ms_compat)