typeck.c (cp_build_addr_expr_1): Use the cp_expr_loc_or_input_loc location in a few...
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 3 Dec 2019 20:46:32 +0000 (20:46 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 3 Dec 2019 20:46:32 +0000 (20:46 +0000)
/cp
2019-12-03  Paolo Carlini  <paolo.carlini@oracle.com>

* typeck.c (cp_build_addr_expr_1): Use the cp_expr_loc_or_input_loc
location in a few additional diagnostics; tidy.
(check_return_expr): Likewise.

* typeck.c (cp_build_addr_expr_1): Use tree_strip_any_location_wrapper
for the address of main pedwarn.

/testsuite
2019-12-03  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/diagnostic/inconsistent-deduction-1.C: New.
* g++.dg/diagnostic/returning-a-value-1.C: Likewise.
* g++.dg/cpp0x/decltype3.C: Check location(s) too.
* g++.dg/cpp0x/decltype4.C: Likewise.
* g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C: Likewise.
* g++.dg/cpp2a/consteval13.C: Likewise.
* g++.dg/expr/pmf-1.C: Likewise.
* g++.dg/other/ptrmem2.C: Likewise.
* g++.dg/template/ptrmem17.C: Likewise.
* g++.old-deja/g++.bugs/900213_03.C: Likewise.
* g++.old-deja/g++.other/pmf7.C: Likewise.
* g++.old-deja/g++.other/ptrmem7.C: Likewise.

* g++.dg/diagnostic/main2.C: New.

From-SVN: r278947

16 files changed:
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype3.C
gcc/testsuite/g++.dg/cpp0x/decltype4.C
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C
gcc/testsuite/g++.dg/cpp2a/consteval13.C
gcc/testsuite/g++.dg/diagnostic/inconsistent-deduction-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/main2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/returning-a-value-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/expr/pmf-1.C
gcc/testsuite/g++.dg/other/ptrmem2.C
gcc/testsuite/g++.dg/template/ptrmem17.C
gcc/testsuite/g++.old-deja/g++.bugs/900213_03.C
gcc/testsuite/g++.old-deja/g++.other/pmf7.C
gcc/testsuite/g++.old-deja/g++.other/ptrmem7.C

index 02c730eb1d9113224808fb1e61131bb4d15501e6..3c86cecfa6e8b6dae5e90b9c5cb284d51a5a674a 100644 (file)
@@ -1,3 +1,12 @@
+2019-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * typeck.c (cp_build_addr_expr_1): Use the cp_expr_loc_or_input_loc
+       location in a few additional diagnostics; tidy.
+       (check_return_expr): Likewise.
+
+       * typeck.c (cp_build_addr_expr_1): Use tree_strip_any_location_wrapper
+       for the address of main pedwarn.
+
 2019-12-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/91369
index a9b87ea8caf6175f863ebc46983cb907a6ef1b4b..3b947c32bbcda9c64eb80e3875ca344b876f2057 100644 (file)
@@ -6070,6 +6070,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
     return error_mark_node;
 
   argtype = lvalue_type (arg);
+  location_t loc = cp_expr_loc_or_input_loc (arg);
 
   gcc_assert (!(identifier_p (arg) && IDENTIFIER_ANY_OP_P (arg)));
 
@@ -6103,12 +6104,14 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
          else if (current_class_type
                   && TREE_OPERAND (arg, 0) == current_class_ref)
            /* An expression like &memfn.  */
-           permerror (input_location, "ISO C++ forbids taking the address of an unqualified"
+           permerror (loc,
+                      "ISO C++ forbids taking the address of an unqualified"
                       " or parenthesized non-static member function to form"
                       " a pointer to member function.  Say %<&%T::%D%>",
                       base, name);
          else
-           permerror (input_location, "ISO C++ forbids taking the address of a bound member"
+           permerror (loc,
+                      "ISO C++ forbids taking the address of a bound member"
                       " function to form a pointer to member function."
                       "  Say %<&%T::%D%>",
                       base, name);
@@ -6135,7 +6138,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
       if (kind == clk_none)
        {
          if (complain & tf_error)
-           lvalue_error (cp_expr_loc_or_input_loc (arg), lv_addressof);
+           lvalue_error (loc, lv_addressof);
          return error_mark_node;
        }
       if (strict_lvalue && (kind & (clk_rvalueref|clk_class)))
@@ -6143,8 +6146,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
          if (!(complain & tf_error))
            return error_mark_node;
          /* Make this a permerror because we used to accept it.  */
-         permerror (cp_expr_loc_or_input_loc (arg),
-                    "taking address of rvalue");
+         permerror (loc, "taking address of rvalue");
        }
     }
 
@@ -6154,13 +6156,13 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
       arg = build1 (CONVERT_EXPR, type, arg);
       return arg;
     }
-  else if (pedantic && DECL_MAIN_P (arg))
+  else if (pedantic && DECL_MAIN_P (tree_strip_any_location_wrapper (arg)))
     {
       /* ARM $3.4 */
       /* Apparently a lot of autoconf scripts for C++ packages do this,
         so only complain if -Wpedantic.  */
       if (complain & (flag_pedantic_errors ? tf_error : tf_warning))
-       pedwarn (input_location, OPT_Wpedantic,
+       pedwarn (loc, OPT_Wpedantic,
                 "ISO C++ forbids taking address of function %<::main%>");
       else if (flag_pedantic_errors)
        return error_mark_node;
@@ -6218,7 +6220,8 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
        if (TYPE_REF_P (TREE_TYPE (t)))
          {
            if (complain & tf_error)
-             error ("cannot create pointer to reference member %qD", t);
+             error_at (loc,
+                       "cannot create pointer to reference member %qD", t);
            return error_mark_node;
          }
 
@@ -6238,8 +6241,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
   if (bitfield_p (arg))
     {
       if (complain & tf_error)
-       error_at (cp_expr_loc_or_input_loc (arg),
-                 "attempt to take address of bit-field");
+       error_at (loc, "attempt to take address of bit-field");
       return error_mark_node;
     }
 
@@ -6254,8 +6256,8 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
              || !DECL_IMMEDIATE_FUNCTION_P (current_function_decl)))
        {
          if (complain & tf_error)
-           error ("taking address of an immediate function %qD",
-                  stripped_arg);
+           error_at (loc, "taking address of an immediate function %qD",
+                     stripped_arg);
          return error_mark_node;
        }
       if (TREE_CODE (stripped_arg) == FUNCTION_DECL
@@ -9676,6 +9678,7 @@ check_return_expr (tree retval, bool *no_warning)
      the declared type is incomplete.  */
   tree functype;
   int fn_returns_value_p;
+  location_t loc = cp_expr_loc_or_input_loc (retval);
 
   *no_warning = false;
 
@@ -9689,7 +9692,7 @@ check_return_expr (tree retval, bool *no_warning)
   if (DECL_DESTRUCTOR_P (current_function_decl))
     {
       if (retval)
-       error ("returning a value from a destructor");
+       error_at (loc, "returning a value from a destructor");
       return NULL_TREE;
     }
   else if (DECL_CONSTRUCTOR_P (current_function_decl))
@@ -9700,7 +9703,7 @@ check_return_expr (tree retval, bool *no_warning)
        error ("cannot return from a handler of a function-try-block of a constructor");
       else if (retval)
        /* You can't return a value from a constructor.  */
-       error ("returning a value from a constructor");
+       error_at (loc, "returning a value from a constructor");
       return NULL_TREE;
     }
 
@@ -9762,11 +9765,11 @@ check_return_expr (tree retval, bool *no_warning)
       else if (!same_type_p (type, functype))
        {
          if (LAMBDA_FUNCTION_P (current_function_decl))
-           error ("inconsistent types %qT and %qT deduced for "
-                  "lambda return type", functype, type);
+           error_at (loc, "inconsistent types %qT and %qT deduced for "
+                     "lambda return type", functype, type);
          else
-           error ("inconsistent deduction for auto return type: "
-                  "%qT and then %qT", functype, type);
+           error_at (loc, "inconsistent deduction for auto return type: "
+                     "%qT and then %qT", functype, type);
        }
       functype = type;
     }
@@ -9800,8 +9803,7 @@ check_return_expr (tree retval, bool *no_warning)
           its side-effects.  */
        finish_expr_stmt (retval);
       else if (retval != error_mark_node)
-       permerror (input_location,
-                  "return-statement with a value, in function "
+       permerror (loc, "return-statement with a value, in function "
                   "returning %qT", valtype);
       current_function_returns_null = 1;
 
@@ -9857,7 +9859,8 @@ check_return_expr (tree retval, bool *no_warning)
        }
 
       if (warn)
-       warning (OPT_Weffc__, "%<operator=%> should return a reference to %<*this%>");
+       warning_at (loc, OPT_Weffc__,
+                   "%<operator=%> should return a reference to %<*this%>");
     }
 
   if (dependent_type_p (functype)
index ec32c210d59c195308a3c26f5efc3143790535bf..330b75b4ff0d80911110cf79ca8540de5c8a9411 100644 (file)
@@ -1,3 +1,20 @@
+2019-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/diagnostic/inconsistent-deduction-1.C: New.
+       * g++.dg/diagnostic/returning-a-value-1.C: Likewise.
+       * g++.dg/cpp0x/decltype3.C: Check location(s) too.
+       * g++.dg/cpp0x/decltype4.C: Likewise.
+       * g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C: Likewise.
+       * g++.dg/cpp2a/consteval13.C: Likewise.
+       * g++.dg/expr/pmf-1.C: Likewise.
+       * g++.dg/other/ptrmem2.C: Likewise.
+       * g++.dg/template/ptrmem17.C: Likewise.
+       * g++.old-deja/g++.bugs/900213_03.C: Likewise.
+       * g++.old-deja/g++.other/pmf7.C: Likewise.
+       * g++.old-deja/g++.other/ptrmem7.C: Likewise.
+
+       * g++.dg/diagnostic/main2.C: New.
+
 2019-12-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/91369
index b921dd6d899cda0bbd323162fdccdbd79d4bb8fd..427923eb07a19007095a0df8bf8a9d9694288a12 100644 (file)
@@ -54,7 +54,7 @@ public:
 }; 
 
 CHECK_DECLTYPE(decltype(aa.*&A::a), int&);
-decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" "cannot" }
+decltype(aa.*&A::b) zz; // { dg-error "18:cannot create pointer to reference member" "cannot" }
 
 CHECK_DECLTYPE(decltype(caa.*&A::a), const int&);
 
index c14e156465d1d57fd5384a60f105334550a6499b..b46cbed691df18eec388bb0e54f1d5c344de783f 100644 (file)
@@ -23,7 +23,7 @@ struct A {
 }; 
 
 CHECK_DECLTYPE(decltype(&A::x), int A::*);
-decltype(&A::y) Ay; // { dg-error "cannot create pointer to reference member|invalid type" }
+decltype(&A::y) Ay; // { dg-error "14:cannot create pointer to reference member|invalid type" }
 CHECK_DECLTYPE(decltype(&A::foo), int (A::*) (char));
 CHECK_DECLTYPE(decltype(&A::bar), int& (A::*) () const);
 
index 88970a93309031927a6964b2b8099c7df2b9bd19..5f868822db9c9225f05741de63521da2516c9d73 100644 (file)
@@ -11,7 +11,7 @@ template <class T> int f (T t) {
     if (b)
       return t.fn1();
     else
-      return t.fn2();          // { dg-error "inconsistent types" }
+      return t.fn2();          // { dg-error "19:inconsistent types" }
   }(t);
 }
 
index 8db7e6611c01cc6a01eb31240606fe5cb27d4245..a2e1750b3caff02ba70d69c50d029a3121613f94 100644 (file)
@@ -10,8 +10,8 @@ void
 foo ()
 {
    auto qux = [] (fnptr a = quux ()) consteval { return a (); };
-   constexpr auto c = qux (baz);       // { dg-error "taking address of an immediate function" }
-   constexpr auto d = qux (bar);       // { dg-error "taking address of an immediate function" }
+   constexpr auto c = qux (baz);       // { dg-error "28:taking address of an immediate function" }
+   constexpr auto d = qux (bar);       // { dg-error "28:taking address of an immediate function" }
    static_assert (c == 1);
    static_assert (d == 42);
 }
diff --git a/gcc/testsuite/g++.dg/diagnostic/inconsistent-deduction-1.C b/gcc/testsuite/g++.dg/diagnostic/inconsistent-deduction-1.C
new file mode 100644 (file)
index 0000000..2b4e77a
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++14 } }
+
+void foo();
+
+auto bar(bool b)
+{
+  if (b)
+    return 0;
+  return foo(); // { dg-error "13:inconsistent deduction for auto return type: .int. and then .void." }
+}
diff --git a/gcc/testsuite/g++.dg/diagnostic/main2.C b/gcc/testsuite/g++.dg/diagnostic/main2.C
new file mode 100644 (file)
index 0000000..02495cf
--- /dev/null
@@ -0,0 +1,12 @@
+int main ();
+
+typedef int (*fptr) ();
+
+void foo (fptr);
+
+fptr bar ()
+{
+  foo (main);  // { dg-error "8:ISO C\\+\\+ forbids taking address of function" }
+
+  return main;  // { dg-error "10:ISO C\\+\\+ forbids taking address of function" }
+}
diff --git a/gcc/testsuite/g++.dg/diagnostic/returning-a-value-1.C b/gcc/testsuite/g++.dg/diagnostic/returning-a-value-1.C
new file mode 100644 (file)
index 0000000..ee53900
--- /dev/null
@@ -0,0 +1,8 @@
+int foo();
+
+struct A
+{
+  A() { return foo(); }  // { dg-error "19:returning a value" }
+  ~A() { return foo(); }  // { dg-error "20:returning a value" }
+  void bar() { return foo(); }  // { dg-error "26:return-statement with a value" }
+};
index 35ebe5290f4966c819fcd46d58aee7cf69b7dac6..bf300e11dc4016141e55bd81acc7579f90def981 100644 (file)
@@ -13,7 +13,7 @@ struct A
   void h()
   {
     void (A::*p)() = &A::f;
-    void (A::*q)() = &(A::f);       // { dg-error "parenthesized" }
+    void (A::*q)() = &(A::f);       // { dg-error "27:ISO C\\+\\+ forbids taking the address of an unqualified or parenthesized" }
     foo(&g<int>);                   // { dg-error "cannot convert" }
   }
 };
index cb54ab3cbffd2e6643f5736b70a485fd0e98cdef..6cae5474fbb252f6dd8cbf73a353ba5703aa902d 100644 (file)
@@ -19,7 +19,7 @@ template<class T> int f2(T x);
 
 int D::Foo ()
 {
-  f1( &D::m);   // { dg-error "cannot create pointer to ref" }
+  f1( &D::m);   // { dg-error "11:cannot create pointer to ref" }
   f1( &(D::m));        // ok
   f2( &D::s);   // ok
   f2( &(D::s)); // ok
@@ -28,7 +28,7 @@ int D::Foo ()
 
 int Foo ()
 {
-  f1( &D::m);    // { dg-error "cannot create pointer to ref" }
+  f1( &D::m);    // { dg-error "11:cannot create pointer to ref" }
   f1( &(D::m));  // { dg-error "non-static" }
   f2( &D::s);    // ok
   f2( &(D::s));  // ok
index 5c5ee3fc30e13772a4c351e4adb1eb7d3394501c..2b73a484735560b76bdf2809e6610def3256f455 100644 (file)
@@ -4,7 +4,7 @@ template<int> struct A
 {
   int& i;
   A();
-  ~A() { &A::i; } // { dg-error "reference" }
+  ~A() { &A::i; } // { dg-error "14:cannot create pointer to reference" }
 };
 
 A<0> a;
index 3c150b8b53242311c94c8cfca5cfd34a082c6db7..20e43e9729a437d97231e163e0a0bf128a0da11b 100644 (file)
@@ -21,7 +21,7 @@ struct0 *ptr;
 
 void global_function_0 ()
 {
-  fmp = &ptr->function_member; // { dg-error "" } 
+  fmp = &ptr->function_member; // { dg-error "15:ISO C\\+\\+ forbids taking the address of a bound member function" } 
   //dmp = &ptr->data_member;   //  caught by g++, missed by cfront
 }
 
index 1968a7997f4a54709b8cdadff618f02a7e903ac0..0006171fe9e6ad9c120835bee3173730d72310bb 100644 (file)
@@ -12,5 +12,5 @@ int main ()
 {
   A a;
   &a.f;                                // { dg-error "" } overloaded
-  &a.g;                                // { dg-error "" } can't write a pmf like this
+  &a.g;                                // { dg-error "6:ISO C\\+\\+ forbids taking the address of a bound member function" } can't write a pmf like this
 }
index cda4f426b243a1c19765b5a9fe1f436edbe1cfab..3468f33649736bf4293d5ca8e05e2d36414d1e2a 100644 (file)
@@ -36,7 +36,7 @@ void A::foo ()
   int (A::*ptr14) (int) = single;         // { dg-error "cannot convert" }
 
   int (A::*ptr20) (int) = &(A::ns);       // { dg-error "pointer to member" }
-  int (A::*ptr21) (int) = &(A::single);   // { dg-error "pointer to member" }
+  int (A::*ptr21) (int) = &(A::single);   // { dg-error "32:ISO C\\+\\+ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member" }
 
   int (*ptr31) (short) = &A::sole;
   int (*ptr32) (short) = A::sole;