diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4413a97e8a..2a8d7a56335 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2001-02-16 Mark Mitchell + + * semantics.c (finish_asm_stmt): Robustify. + 2001-02-15 Mark Mitchell * pt.c (push_template_decl_real): Don't remangle the name of a diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c5bbe1be604..9bd7ff71d67 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -912,7 +912,22 @@ finish_asm_stmt (cv_qualifier, string, output_operands, if (!processing_template_decl) for (t = input_operands; t; t = TREE_CHAIN (t)) - TREE_VALUE (t) = decay_conversion (TREE_VALUE (t)); + { + tree converted_operand + = decay_conversion (TREE_VALUE (t)); + + /* If the type of the operand hasn't been determined (e.g., + because it involves an overloaded function), then issue an + error message. There's no context available to resolve the + overloading. */ + if (TREE_TYPE (converted_operand) == unknown_type_node) + { + cp_error ("type of asm operand `%E' could not be determined", + TREE_VALUE (t)); + converted_operand = error_mark_node; + } + TREE_VALUE (t) = converted_operand; + } r = build_stmt (ASM_STMT, cv_qualifier, string, output_operands, input_operands, diff --git a/gcc/testsuite/g++.old-deja/g++.other/asm2.C b/gcc/testsuite/g++.old-deja/g++.other/asm2.C new file mode 100644 index 00000000000..6a9650470c1 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/asm2.C @@ -0,0 +1,12 @@ +// Build don't link: +// Origin: Mark Mitchell + +struct C +{ + void f (); +}; + +void C::f () +{ + asm ("" : : "m" (f)); // ERROR - type could not be determined +}