/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Mar 2014 17:34:32 +0000 (17:34 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Mar 2014 17:34:32 +0000 (17:34 +0000)
2014-03-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60389
* method.c (get_inherited_ctor): New.
* cp-tree.h (get_inherited_ctor): Declare it.
* semantics.c (is_valid_constexpr_fn): Use it.

/testsuite
2014-03-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60389
* g++.dg/cpp0x/inh-ctor19.C: New.

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

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/method.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C [new file with mode: 0644]

index 4aa90ee..4848b54 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60389
+       * method.c (get_inherited_ctor): New.
+       * cp-tree.h (get_inherited_ctor): Declare it.
+       * semantics.c (is_valid_constexpr_fn): Use it.
+
 2014-03-10  Jason Merrill  <jason@redhat.com>
 
        PR c++/60367
index 45e4d82..e9fe86e 100644 (file)
@@ -5476,6 +5476,7 @@ extern tree get_copy_ctor                 (tree, tsubst_flags_t);
 extern tree get_copy_assign                    (tree);
 extern tree get_default_ctor                   (tree);
 extern tree get_dtor                           (tree, tsubst_flags_t);
+extern tree get_inherited_ctor                 (tree);
 extern tree locate_ctor                                (tree);
 extern tree implicitly_declare_fn               (special_function_kind, tree,
                                                 bool, tree, tree);
index c3940f2..d72b564 100644 (file)
@@ -971,6 +971,25 @@ get_copy_assign (tree type)
   return fn;
 }
 
+/* Locate the inherited constructor of constructor CTOR.  */
+
+tree
+get_inherited_ctor (tree ctor)
+{
+  gcc_assert (DECL_INHERITED_CTOR_BASE (ctor));
+
+  push_deferring_access_checks (dk_no_check);
+  tree fn = locate_fn_flags (DECL_INHERITED_CTOR_BASE (ctor),
+                            complete_ctor_identifier,
+                            FUNCTION_FIRST_USER_PARMTYPE (ctor),
+                            LOOKUP_NORMAL|LOOKUP_SPECULATIVE,
+                            tf_none);
+  pop_deferring_access_checks ();
+  if (fn == error_mark_node)
+    return NULL_TREE;
+  return fn;
+}
+
 /* Subroutine of synthesized_method_walk.  Update SPEC_P, TRIVIAL_P and
    DELETED_P or give an error message MSG with argument ARG.  */
 
index fcd8409..1c9e153 100644 (file)
@@ -7438,19 +7438,31 @@ retrieve_constexpr_fundef (tree fun)
 static bool
 is_valid_constexpr_fn (tree fun, bool complain)
 {
-  tree parm = FUNCTION_FIRST_USER_PARM (fun);
   bool ret = true;
-  for (; parm != NULL; parm = TREE_CHAIN (parm))
-    if (!literal_type_p (TREE_TYPE (parm)))
-      {
-       ret = false;
-       if (complain)
+
+  if (DECL_INHERITED_CTOR_BASE (fun)
+      && TREE_CODE (fun) == TEMPLATE_DECL)
+    {
+      ret = false;
+      if (complain)
+       error ("inherited constructor %qD is not constexpr",
+              get_inherited_ctor (fun));
+    }
+  else
+    {
+      for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
+          parm != NULL_TREE; parm = TREE_CHAIN (parm))
+       if (!literal_type_p (TREE_TYPE (parm)))
          {
-           error ("invalid type for parameter %d of constexpr "
-                  "function %q+#D", DECL_PARM_INDEX (parm), fun);
-           explain_non_literal_class (TREE_TYPE (parm));
+           ret = false;
+           if (complain)
+             {
+               error ("invalid type for parameter %d of constexpr "
+                      "function %q+#D", DECL_PARM_INDEX (parm), fun);
+               explain_non_literal_class (TREE_TYPE (parm));
+             }
          }
-      }
+    }
 
   if (!DECL_CONSTRUCTOR_P (fun))
     {
index 241f619..a350342 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60389
+       * g++.dg/cpp0x/inh-ctor19.C: New.
+
 2014-03-11  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/60429
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
new file mode 100644 (file)
index 0000000..7a22f88
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/60389
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+  template<typename...T> A(T...) {}
+};
+
+struct B : A
+{
+  using A::A;   // { dg-error "inherited" }
+};
+
+constexpr B b;  // { dg-error "literal" }