Hi,

a rather straightforward tweak. We could imagine much more heavily reworking the code to avoid saving the original condition (build_expr_type_conversion return NULL_TREE upon error), I'm not sure if it's worth it. Tested x86_64-linux.

Thanks, Paolo.

////////////////////////

/cp
2019-08-23  Paolo Carlini  <paolo.carl...@oracle.com>

        * semantics.c (finish_switch_cond): Improve error message location.

/testsuite
2019-08-23  Paolo Carlini  <paolo.carl...@oracle.com>

        * g++.dg/conversion/simd4.C: Test all the locations.
Index: cp/semantics.c
===================================================================
--- cp/semantics.c      (revision 274845)
+++ cp/semantics.c      (working copy)
@@ -1185,10 +1185,12 @@ finish_switch_cond (tree cond, tree switch_stmt)
   if (!processing_template_decl)
     {
       /* Convert the condition to an integer or enumeration type.  */
+      tree orig_cond = cond;
       cond = build_expr_type_conversion (WANT_INT | WANT_ENUM, cond, true);
       if (cond == NULL_TREE)
        {
-         error ("switch quantity not an integer");
+         error_at (cp_expr_loc_or_input_loc (orig_cond),
+                   "switch quantity not an integer");
          cond = error_mark_node;
        }
       /* We want unlowered type here to handle enum bit-fields.  */
Index: testsuite/g++.dg/conversion/simd4.C
===================================================================
--- testsuite/g++.dg/conversion/simd4.C (revision 274845)
+++ testsuite/g++.dg/conversion/simd4.C (working copy)
@@ -20,15 +20,15 @@ foo ()
   v[b];                // { dg-error "4:invalid types" }
   w[b];                // { dg-error "4:invalid types" }
   new int[t];
-  new int[u];  // { dg-error "new-declarator must have integral" }
-  new int[v];  // { dg-error "new-declarator must have integral" }
-  new int[w];  // { dg-error "new-declarator must have integral" }
+  new int[u];  // { dg-error "11:expression in new-declarator must have 
integral" }
+  new int[v];  // { dg-error "11:expression in new-declarator must have 
integral" }
+  new int[w];  // { dg-error "11:expression in new-declarator must have 
integral" }
   switch (t) { default: break; }
-  switch (u) { default: break; }       // { dg-error "switch quantity not an 
integer" }
-  switch (v) { default: break; }       // { dg-error "switch quantity not an 
integer" }
-  switch (w) { default: break; }       // { dg-error "switch quantity not an 
integer" }
+  switch (u) { default: break; }       // { dg-error "11:switch quantity not 
an integer" }
+  switch (v) { default: break; }       // { dg-error "11:switch quantity not 
an integer" }
+  switch (w) { default: break; }       // { dg-error "11:switch quantity not 
an integer" }
   t = ~t;
-  u = ~u;      // { dg-error "wrong type argument to bit-complement" }
+  u = ~u;      // { dg-error "8:wrong type argument to bit-complement" }
   v = ~v;
-  w = ~w;      // { dg-error "wrong type argument to bit-complement" }
+  w = ~w;      // { dg-error "8:wrong type argument to bit-complement" }
 }

Reply via email to