]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/50870 ([C++0x] [4.6/4.7 Regression] ICE with decltype, operator->, and...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 26 Oct 2011 17:59:36 +0000 (17:59 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 26 Oct 2011 17:59:36 +0000 (17:59 +0000)
2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

* typeck.c (cp_build_addr_expr_1): Use BASELINK_P.
* class.c (instantiate_type): Likewise.
* pt.c (convert_nontype_argument_function, uses_template_parms,
tsubst_copy, resolve_nondeduced_context, type_dependent_expression_p):
Likewise.
* semantics.c (finish_decltype_type): Likewise.
* decl2.c (mark_used): Likewise.
* name-lookup.c (arg_assoc): Likewise.

/cp
2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/50870
* typeck.c (non_reference): Pass NULL_TREE through.

/testsuite
2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/50870
* g++.dg/cpp0x/decltype34.C: New.

From-SVN: r180531

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/decl2.c
gcc/cp/name-lookup.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype34.C [new file with mode: 0644]

index 2ca141d00eb7805996c092901a3ae714f25d97a2..e6a9a90affeef4d4dd3e36dd5a64fce0c133bdca 100644 (file)
@@ -1,3 +1,19 @@
+2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * typeck.c (cp_build_addr_expr_1): Use BASELINK_P.
+       * class.c (instantiate_type): Likewise.
+       * pt.c (convert_nontype_argument_function, uses_template_parms,
+       tsubst_copy, resolve_nondeduced_context, type_dependent_expression_p):
+       Likewise.
+       * semantics.c (finish_decltype_type): Likewise.
+       * decl2.c (mark_used): Likewise.
+       * name-lookup.c (arg_assoc): Likewise.
+
+2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/50870
+       * typeck.c (non_reference): Pass NULL_TREE through.
+
 2011-10-25  Jason Merrill  <jason@redhat.com>
 
        PR c++/50866
index ee6ca049d3f2d3a76273a5c69290e39d540a12be..03521e50345d39c5ac90fd9b2dc3e4315478b211 100644 (file)
@@ -6873,7 +6873,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
        }
     }
 
-  if (TREE_CODE (rhs) == BASELINK)
+  if (BASELINK_P (rhs))
     {
       access_path = BASELINK_ACCESS_BINFO (rhs);
       rhs = BASELINK_FUNCTIONS (rhs);
index 6e5f7cc7d7519f03bb032d6f8487ed0580e6a73b..9851ece588006e5f5b105d3605e7409f58a4b685 100644 (file)
@@ -4174,7 +4174,7 @@ mark_used (tree decl)
      like the DECL for the function.  Otherwise, if the BASELINK is
      for an overloaded function, we don't know which function was
      actually used until after overload resolution.  */
-  if (TREE_CODE (decl) == BASELINK)
+  if (BASELINK_P (decl))
     {
       decl = BASELINK_FUNCTIONS (decl);
       if (really_overloaded_fn (decl))
index 7141c84fcf4bad64280c152e125555af4632ef11..7b61d68208a59e4a404cd35e4cd342cdc0d31ce6 100644 (file)
@@ -5329,7 +5329,7 @@ arg_assoc (struct arg_lookup *k, tree n)
     n = TREE_OPERAND (n, 1);
   while (TREE_CODE (n) == TREE_LIST)
     n = TREE_VALUE (n);
-  if (TREE_CODE (n) == BASELINK)
+  if (BASELINK_P (n))
     n = BASELINK_FUNCTIONS (n);
 
   if (TREE_CODE (n) == FUNCTION_DECL)
index 79da3730502c0bf5791e65844c2d87c35506675c..7aea72d4e59e2ea2dc7b453c06ad9630456e79a8 100644 (file)
@@ -5277,7 +5277,7 @@ convert_nontype_argument_function (tree type, tree expr)
   fn_no_ptr = fn;
   if (TREE_CODE (fn_no_ptr) == ADDR_EXPR)
     fn_no_ptr = TREE_OPERAND (fn_no_ptr, 0);
-  if (TREE_CODE (fn_no_ptr) == BASELINK)
+  if (BASELINK_P (fn_no_ptr))
     fn_no_ptr = BASELINK_FUNCTIONS (fn_no_ptr);
  
   /* [temp.arg.nontype]/1
@@ -7801,7 +7801,7 @@ uses_template_parms (tree t)
           || EXPR_P (t)
           || TREE_CODE (t) == TEMPLATE_PARM_INDEX
           || TREE_CODE (t) == OVERLOAD
-          || TREE_CODE (t) == BASELINK
+          || BASELINK_P (t)
           || TREE_CODE (t) == IDENTIFIER_NODE
           || TREE_CODE (t) == TRAIT_EXPR
           || TREE_CODE (t) == CONSTRUCTOR
@@ -11993,7 +11993,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
                                         base, name,
                                         /*template_p=*/false);
          }
-       else if (TREE_CODE (name) == BASELINK)
+       else if (BASELINK_P (name))
          name = tsubst_baselink (name,
                                  non_reference (TREE_TYPE (object)),
                                  args, complain,
@@ -15197,7 +15197,7 @@ resolve_nondeduced_context (tree orig_expr)
       offset = expr;
       expr = TREE_OPERAND (expr, 1);
     }
-  if (TREE_CODE (expr) == BASELINK)
+  if (BASELINK_P (expr))
     {
       baselink = expr;
       expr = BASELINK_FUNCTIONS (expr);
@@ -19314,7 +19314,7 @@ type_dependent_expression_p (tree expression)
       if (TREE_CODE (expression) == SCOPE_REF)
        return false;
 
-      if (TREE_CODE (expression) == BASELINK)
+      if (BASELINK_P (expression))
        expression = BASELINK_FUNCTIONS (expression);
 
       if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
index 84f112cd3cb7d1bd0c14844855a778a2f57b7623..ec38a473715f2d8aabe3849c479f51be571461dd 100644 (file)
@@ -5115,7 +5115,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
            step.  */
         expr = TREE_OPERAND (expr, 1);
 
-      if (TREE_CODE (expr) == BASELINK)
+      if (BASELINK_P (expr))
         /* See through BASELINK nodes to the underlying function.  */
         expr = BASELINK_FUNCTIONS (expr);
 
index e583faaca7da1d9824bb98882f0ce3143fea88de..068819ebe870341c37904583f8b1da45fdf9a8ac 100644 (file)
@@ -4946,7 +4946,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
       if (TREE_CODE (arg) == OFFSET_REF)
        PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
     }
-  else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
+  else if (BASELINK_P (TREE_OPERAND (arg, 1)))
     {
       tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
 
@@ -8322,7 +8322,7 @@ casts_away_constness (tree t1, tree t2)
 tree
 non_reference (tree t)
 {
-  if (TREE_CODE (t) == REFERENCE_TYPE)
+  if (t && TREE_CODE (t) == REFERENCE_TYPE)
     t = TREE_TYPE (t);
   return t;
 }
index c7745ad1a6a13026a9f4a7acee1cfd6fb11ed597..868e4b0d204a4086d45389c16542e36b9d14fcf1 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/50870
+       * g++.dg/cpp0x/decltype34.C: New.
+
 2011-10-26  Tom de Vries <tom@codesourcery.com>
 
        * gcc.c-torture/unsorted/HIcmp.c: Fix unaligned pointer.
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype34.C b/gcc/testsuite/g++.dg/cpp0x/decltype34.C
new file mode 100644 (file)
index 0000000..fbd15c2
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/50870
+// { dg-options "-std=gnu++0x" }
+
+struct impl
+{
+  template <class T> static T create();
+};
+
+template<class T, class U,
+        class = decltype(impl::create<T>()->impl::create<U>())>
+struct tester{};
+
+tester<impl*, int> ti;
+
+template<class T, class U,
+        class = decltype(impl::create<T>()->impl::create<U>())>
+int test() { return 0; }
+
+int i = test<impl*, int>();