Revert behavior to r251316.
authorMartin Liska <mliska@suse.cz>
Wed, 7 Feb 2018 13:16:04 +0000 (14:16 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 7 Feb 2018 13:16:04 +0000 (13:16 +0000)
2018-02-07  Martin Liska  <mliska@suse.cz>

PR c++/84059.
* class.c (add_method): Append argument value.
* cp-tree.h (maybe_version_functions): Add new argument.
* decl.c (decls_match): Call it if a declaration does not
have DECL_FUNCTION_VERSIONED.
(maybe_version_functions): record argument is added.
2018-02-07  Martin Liska  <mliska@suse.cz>

PR c++/84059.
* g++.dg/ext/mv26.C: New test.

From-SVN: r257451

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/mv26.C [new file with mode: 0644]

index 2dc96a3b6907d160f261cbd36395f642423874fa..d27b885382a5843d2add707a6e8769604238e420 100644 (file)
@@ -1,3 +1,12 @@
+2018-02-07  Martin Liska  <mliska@suse.cz>
+
+       PR c++/84059.
+       * class.c (add_method): Append argument value.
+       * cp-tree.h (maybe_version_functions): Add new argument.
+       * decl.c (decls_match): Call it if a declaration does not
+       have DECL_FUNCTION_VERSIONED.
+       (maybe_version_functions): record argument is added.
+
 2018-02-05  Marek Polacek  <polacek@redhat.com>
 
        * class.c: Remove unused global variables.
index 6012b8deff91025466e0a2c5ce29fbd95236239d..44170202abe692a57f4a748df720aed136ec2e3d 100644 (file)
@@ -1083,7 +1083,7 @@ add_method (tree type, tree method, bool via_using)
          /* If these are versions of the same function, process and
             move on.  */
          if (TREE_CODE (fn) == FUNCTION_DECL
-             && maybe_version_functions (method, fn))
+             && maybe_version_functions (method, fn, true))
            continue;
 
          if (DECL_INHERITED_CTOR (method))
index 861efb3053b5986071c72c4f8a4d22cd63bba97f..a6c75aed33d692d2bc1c001c2c42aef02816555c 100644 (file)
@@ -6135,7 +6135,7 @@ extern bool note_iteration_stmt_body_start        (void);
 extern void note_iteration_stmt_body_end       (bool);
 extern tree make_lambda_name                   (void);
 extern int decls_match                         (tree, tree, bool = true);
-extern bool maybe_version_functions            (tree, tree);
+extern bool maybe_version_functions            (tree, tree, bool);
 extern tree duplicate_decls                    (tree, tree, bool);
 extern tree declare_local_label                        (tree);
 extern tree define_label                       (location_t, tree);
index 01ce9fb6d6992dd2872fbb6a9c729046dbf30592..3ccea9e6a4506d530eaf4ba48494f68edf40a128 100644 (file)
@@ -1087,7 +1087,9 @@ decls_match (tree newdecl, tree olddecl, bool record_versions /* = true */)
          && !DECL_EXTERN_C_P (newdecl)
          && !DECL_EXTERN_C_P (olddecl)
          && record_versions
-         && maybe_version_functions (newdecl, olddecl))
+         && maybe_version_functions (newdecl, olddecl,
+                                     (!DECL_FUNCTION_VERSIONED (newdecl)
+                                      || !DECL_FUNCTION_VERSIONED (olddecl))))
        return 0;
     }
   else if (TREE_CODE (newdecl) == TEMPLATE_DECL)
@@ -1145,19 +1147,17 @@ decls_match (tree newdecl, tree olddecl, bool record_versions /* = true */)
 }
 
 /* NEWDECL and OLDDECL have identical signatures.  If they are
-   different versions adjust them and return true.  */
+   different versions adjust them and return true.
+   If RECORD is set to true, record function versions.  */
 
 bool
-maybe_version_functions (tree newdecl, tree olddecl)
+maybe_version_functions (tree newdecl, tree olddecl, bool record)
 {
   if (!targetm.target_option.function_versions (newdecl, olddecl))
     return false;
 
-  bool record = false;
-
   if (!DECL_FUNCTION_VERSIONED (olddecl))
     {
-      record = true;
       DECL_FUNCTION_VERSIONED (olddecl) = 1;
       if (DECL_ASSEMBLER_NAME_SET_P (olddecl))
        mangle_decl (olddecl);
@@ -1165,13 +1165,11 @@ maybe_version_functions (tree newdecl, tree olddecl)
 
   if (!DECL_FUNCTION_VERSIONED (newdecl))
     {
-      record = true;
       DECL_FUNCTION_VERSIONED (newdecl) = 1;
       if (DECL_ASSEMBLER_NAME_SET_P (newdecl))
        mangle_decl (newdecl);
     }
 
-  /* Only record if at least one was not already versions.  */
   if (record)
     cgraph_node::record_function_versions (olddecl, newdecl);
 
index c90dc88453f5e3190a5e352c31505dfd9bbfde5f..42f163ab25d0fa029f9f1b72af3f413ebda20fa9 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-07  Martin Liska  <mliska@suse.cz>
+
+       PR c++/84059.
+       * g++.dg/ext/mv26.C: New test.
+
 2018-02-07  Tom de Vries  <tom@codesourcery.com>
 
        * gcc.dg/pr83844.c: Require effective target alloca.
diff --git a/gcc/testsuite/g++.dg/ext/mv26.C b/gcc/testsuite/g++.dg/ext/mv26.C
new file mode 100644 (file)
index 0000000..1b45513
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/84059
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-ifunc "" }
+
+template <typename> struct a
+{
+  int __attribute__ ((target ("arch=ivybridge"))) c (int) {return 1;}
+  int __attribute__ ((target ("default"))) c (int) { return 2; }
+};
+void
+d ()
+{
+  a<double> b;
+  b.c (2);
+}