]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/68926 (decltype and sfinae to check for template instance availability...
authorJason Merrill <jason@redhat.com>
Wed, 10 Feb 2016 19:35:35 +0000 (14:35 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 10 Feb 2016 19:35:35 +0000 (14:35 -0500)
PR c++/68926

* pt.c (resolve_nondeduced_context): Add complain parm.
(do_auto_deduction): Pass it.
* cvt.c (convert_to_void): Likewise.
* decl.c (cp_finish_decl): Likewise.
* init.c (build_new): Likewise.
* rtti.c (get_tinfo_decl_dynamic): Likewise.
* semantics.c (finish_decltype_type): Likewise.
* typeck.c (decay_conversion): Likewise.
* cp-tree.h: Adjust declaration.

From-SVN: r233305

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/decl.c
gcc/cp/init.c
gcc/cp/pt.c
gcc/cp/rtti.c
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/sfinae56.C [new file with mode: 0644]

index 1b01f4bf1aca4393511c4019b59f51313a867c8a..2afcffa807eb1b73e978ba5192a3fccd0c109c1e 100644 (file)
@@ -1,3 +1,16 @@
+2016-02-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/68926
+       * pt.c (resolve_nondeduced_context): Add complain parm.
+       (do_auto_deduction): Pass it.
+       * cvt.c (convert_to_void): Likewise.
+       * decl.c (cp_finish_decl): Likewise.
+       * init.c (build_new): Likewise.
+       * rtti.c (get_tinfo_decl_dynamic): Likewise.
+       * semantics.c (finish_decltype_type): Likewise.
+       * typeck.c (decay_conversion): Likewise.
+       * cp-tree.h: Adjust declaration.
+
 2016-01-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/68983
index 163ee87a1ed01cee521120cf0e5d9d4282a765a7..4478d476080f2eee2cd7e218cdc161732a0af086 100644 (file)
@@ -5632,7 +5632,7 @@ extern tree get_template_parms_at_level (tree, int);
 extern tree get_template_innermost_arguments   (const_tree);
 extern tree get_template_argument_pack_elems   (const_tree);
 extern tree get_function_template_decl         (const_tree);
-extern tree resolve_nondeduced_context         (tree);
+extern tree resolve_nondeduced_context         (tree, tsubst_flags_t);
 extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val);
 
 /* in repo.c */
index adfe7c6575f5ff3f99c200cf7eedca679505586b..4e6b3f73f432b35bf1f6accdba5aaac78b7f0ce0 100644 (file)
@@ -1253,7 +1253,7 @@ convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain)
 
     default:;
     }
-  expr = resolve_nondeduced_context (expr);
+  expr = resolve_nondeduced_context (expr, complain);
   {
     tree probe = expr;
 
index 65c78b7d2a02ecf0e9a17414c0d62bf978cf09f8..74539efce05ec6c7334da7db1a8293b3986d7792 100644 (file)
@@ -6215,7 +6215,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       if (TREE_CODE (d_init) == TREE_LIST)
        d_init = build_x_compound_expr_from_list (d_init, ELK_INIT,
                                                  tf_warning_or_error);
-      d_init = resolve_nondeduced_context (d_init);
+      d_init = resolve_nondeduced_context (d_init, tf_warning_or_error);
       type = TREE_TYPE (decl) = do_auto_deduction (type, d_init,
                                                   auto_node);
       if (type == error_mark_node)
index 09a897f0ef8d8f865c112ee9abb6dbaa726aaddc..745b651f9bcdce73eaad1ba5426f8b6897eb083f 100644 (file)
@@ -3027,7 +3027,7 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
       if (auto_node)
        {
          tree d_init = (**init)[0];
-         d_init = resolve_nondeduced_context (d_init);
+         d_init = resolve_nondeduced_context (d_init, complain);
          type = do_auto_deduction (type, d_init, auto_node);
        }
     }
index 60e96710eb638327258baade207f58a849633de7..5bcdb156bb35784f42d2a5cea808b6909014a084 100644 (file)
@@ -16773,7 +16773,7 @@ resolve_overloaded_unification (tree tparms,
    lvalue for the function template specialization.  */
 
 tree
-resolve_nondeduced_context (tree orig_expr)
+resolve_nondeduced_context (tree orig_expr, tsubst_flags_t complain)
 {
   tree expr, offset, baselink;
   bool addr;
@@ -16856,16 +16856,16 @@ resolve_nondeduced_context (tree orig_expr)
            {
              tree base
                = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (offset, 0)));
-             expr = build_offset_ref (base, expr, addr, tf_warning_or_error);
+             expr = build_offset_ref (base, expr, addr, complain);
            }
          if (addr)
-           expr = cp_build_addr_expr (expr, tf_warning_or_error);
+           expr = cp_build_addr_expr (expr, complain);
          return expr;
        }
-      else if (good == 0 && badargs)
+      else if (good == 0 && badargs && (complain & tf_error))
        /* There were no good options and at least one bad one, so let the
           user know what the problem is.  */
-       instantiate_template (badfn, badargs, tf_warning_or_error);
+       instantiate_template (badfn, badargs, complain);
     }
   return orig_expr;
 }
@@ -21738,7 +21738,7 @@ do_auto_deduction (tree type, tree init, tree auto_node)
   if (BRACE_ENCLOSED_INITIALIZER_P (init))
     type = listify_autos (type, auto_node);
 
-  init = resolve_nondeduced_context (init);
+  init = resolve_nondeduced_context (init, tf_warning_or_error);
 
   targs = make_tree_vec (1);
   if (AUTO_IS_DECLTYPE (auto_node))
index ac5a6fb82b356ff58bab8a4f353efd32e9740938..051c4570ff6ca49db4618e0e93f8ca5511df44d5 100644 (file)
@@ -245,7 +245,7 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
   if (error_operand_p (exp))
     return error_mark_node;
 
-  exp = resolve_nondeduced_context (exp);
+  exp = resolve_nondeduced_context (exp, complain);
 
   /* peel back references, so they match.  */
   type = non_reference (TREE_TYPE (exp));
index bbed56fb06ef4ee3fb0bb49716740e111aa424ba..bc8fec1103bad022937648e3cb7adc40f485f6e1 100644 (file)
@@ -6936,7 +6936,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
 
   /* The type denoted by decltype(e) is defined as follows:  */
 
-  expr = resolve_nondeduced_context (expr);
+  expr = resolve_nondeduced_context (expr, complain);
 
   if (invalid_nonstatic_memfn_p (expr, complain))
     return error_mark_node;
index cd8318d92c644adf81b0ed5149490c157f5475d5..b3d3dfc77eda6f50551fcaf118f61b4e86761253 100644 (file)
@@ -1896,7 +1896,7 @@ decay_conversion (tree exp, tsubst_flags_t complain)
 
   exp = mark_rvalue_use (exp);
 
-  exp = resolve_nondeduced_context (exp);
+  exp = resolve_nondeduced_context (exp, complain);
   if (type_unknown_p (exp))
     {
       if (complain & tf_error)
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae56.C b/gcc/testsuite/g++.dg/cpp0x/sfinae56.C
new file mode 100644 (file)
index 0000000..0f95432
--- /dev/null
@@ -0,0 +1,26 @@
+// PR c++/68926
+// { dg-do compile { target c++11 } }
+
+struct true_type { static constexpr bool value = true; };
+struct false_type { static constexpr bool value = false; };
+
+template<bool Cond> struct enable_if { using type = void; };
+template<> struct enable_if<false> { };
+
+template<typename T, typename U> struct is_same : false_type { };
+template<typename T> struct is_same<T, T> : true_type { };
+
+template<typename T>
+typename enable_if<is_same<int, T>::value>::type
+func();
+
+template<typename T, typename = decltype(func<T>)>
+true_type test(T);
+
+false_type test(...);
+
+int main()
+{
+   decltype(test(0))::value;   // ok
+   decltype(test(0.f))::value; // error
+}