diff mbox

C++ PATCH for c++/69257 (ICE with incomplete deref and asm)

Message ID 5699169B.6080700@redhat.com
State New
Headers show

Commit Message

Jason Merrill Jan. 15, 2016, 3:56 p.m. UTC
In this testcase, the compiler fails to diagnose trying to use the value 
of an INDIRECT_REF of incomplete type.  Since decay_conversion is 
modeling the lvalue->rvalue conversion here, that seems a logical place 
to complain.

When making that change, I noticed that we were incorrectly calling 
mark_rvalue_use for the array->pointer and function->pointer 
conversions, which are more properly considered lvalue uses, so I've 
fixed that as well.

The convert_like_real change was necessary to retain the "initializing 
argument" message for several tests in the testsuite, since we're now 
diagnosing the use of incomplete in a different place.

I've also improved the incomplete type diagnostic to use the location of 
the expression, if one is provided.

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit 0c5ad1f445e3008dcd25b6b6ac6f4cee7efce513
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Jan 14 13:00:25 2016 -0500

    	* typeck2.c (cxx_incomplete_type_diagnostic): Use the location of
    	value.

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index c67d7f6..ac2f3c3 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -475,13 +475,15 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
  retry:
   /* We must print an error message.  Be clever about what it says.  */
 
+  location_t loc = EXPR_LOC_OR_LOC (value, input_location);
+
   switch (TREE_CODE (type))
     {
     case RECORD_TYPE:
     case UNION_TYPE:
     case ENUMERAL_TYPE:
       if (!is_decl)
-	complained = emit_diagnostic (diag_kind, input_location, 0,
+	complained = emit_diagnostic (diag_kind, loc, 0,
 				      "invalid use of incomplete type %q#T",
 				      type);
       if (complained)
@@ -489,7 +491,7 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
       break;
 
     case VOID_TYPE:
-      emit_diagnostic (diag_kind, input_location, 0,
+      emit_diagnostic (diag_kind, loc, 0,
 		       "invalid use of %qT", type);
       break;
 
@@ -499,7 +501,7 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
 	  type = TREE_TYPE (type);
 	  goto retry;
 	}
-      emit_diagnostic (diag_kind, input_location, 0,
+      emit_diagnostic (diag_kind, loc, 0,
 		       "invalid use of array with unspecified bounds");
       break;
 
@@ -511,11 +513,11 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
 	  member = get_first_fn (member);
 	if (DECL_FUNCTION_MEMBER_P (member)
 	    && ! flag_ms_extensions)
-	  emit_diagnostic (diag_kind, input_location, 0,
+	  emit_diagnostic (diag_kind, loc, 0,
 			   "invalid use of member function %qD "
 			   "(did you forget the %<()%> ?)", member);
 	else
-	  emit_diagnostic (diag_kind, input_location, 0,
+	  emit_diagnostic (diag_kind, loc, 0,
 			   "invalid use of member %qD "
 			   "(did you forget the %<&%> ?)", member);
       }
@@ -523,28 +525,28 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
 
     case TEMPLATE_TYPE_PARM:
       if (is_auto (type))
-	emit_diagnostic (diag_kind, input_location, 0,
+	emit_diagnostic (diag_kind, loc, 0,
 			 "invalid use of %<auto%>");
       else
-	emit_diagnostic (diag_kind, input_location, 0,
+	emit_diagnostic (diag_kind, loc, 0,
 			 "invalid use of template type parameter %qT", type);
       break;
 
     case BOUND_TEMPLATE_TEMPLATE_PARM:
-      emit_diagnostic (diag_kind, input_location, 0,
+      emit_diagnostic (diag_kind, loc, 0,
 		       "invalid use of template template parameter %qT",
 		       TYPE_NAME (type));
       break;
 
     case TYPENAME_TYPE:
-      emit_diagnostic (diag_kind, input_location, 0,
+      emit_diagnostic (diag_kind, loc, 0,
 		       "invalid use of dependent type %qT", type);
       break;
 
     case LANG_TYPE:
       if (type == init_list_type_node)
 	{
-	  emit_diagnostic (diag_kind, input_location, 0,
+	  emit_diagnostic (diag_kind, loc, 0,
 			   "invalid use of brace-enclosed initializer list");
 	  break;
 	}
@@ -552,14 +554,14 @@  cxx_incomplete_type_diagnostic (const_tree value, const_tree type,
       if (value && TREE_CODE (value) == COMPONENT_REF)
 	goto bad_member;
       else if (value && TREE_CODE (value) == ADDR_EXPR)
-	emit_diagnostic (diag_kind, input_location, 0,
+	emit_diagnostic (diag_kind, loc, 0,
 			 "address of overloaded function with no contextual "
 			 "type information");
       else if (value && TREE_CODE (value) == OVERLOAD)
-	emit_diagnostic (diag_kind, input_location, 0,
+	emit_diagnostic (diag_kind, loc, 0,
 			 "overloaded function with no contextual type information");
       else
-	emit_diagnostic (diag_kind, input_location, 0,
+	emit_diagnostic (diag_kind, loc, 0,
 			 "insufficient contextual information to determine type");
       break;