diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4cad303dc44..845f0b4ea6c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2012-08-25 Paolo Carlini + + PR c++/51421 + * decl2.c (mark_used): Consistently return false after errors + about uses before deduction of auto. + * semantics.c (finish_id_expression): Check mark_used return + value and return error_mark_node in case of failure. + 2012-08-24 Jason Merrill PR c++/51213 (again) diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 281f6ff36f9..f76b59605ae 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -4238,7 +4238,10 @@ mark_used (tree decl) || DECL_THUNK_P (decl)) { if (!processing_template_decl && type_uses_auto (TREE_TYPE (decl))) - error ("use of %qD before deduction of %", decl); + { + error ("use of %qD before deduction of %", decl); + return false; + } return true; } @@ -4284,7 +4287,10 @@ mark_used (tree decl) } if (type_uses_auto (TREE_TYPE (decl))) - error ("use of %qD before deduction of %", decl); + { + error ("use of %qD before deduction of %", decl); + return false; + } /* If we don't need a value, then we don't need to synthesize DECL. */ if (cp_unevaluated_operand != 0) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 4faca914716..d66accfa934 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3221,11 +3221,12 @@ finish_id_expression (tree id_expression, /* Mark variable-like entities as used. Functions are similarly marked either below or after overload resolution. */ - if (TREE_CODE (decl) == VAR_DECL - || TREE_CODE (decl) == PARM_DECL - || TREE_CODE (decl) == CONST_DECL - || TREE_CODE (decl) == RESULT_DECL) - mark_used (decl); + if ((TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == PARM_DECL + || TREE_CODE (decl) == CONST_DECL + || TREE_CODE (decl) == RESULT_DECL) + && !mark_used (decl)) + return error_mark_node; /* Only certain kinds of names are allowed in constant expression. Template parameters have already diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eeb62dc03a9..94b23a444f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-08-25 Paolo Carlini + + PR c++/51421 + * g++.dg/cpp0x/auto34.C: New. + 2012-08-24 Jakub Jelinek PR c/54363 diff --git a/gcc/testsuite/g++.dg/cpp0x/auto34.C b/gcc/testsuite/g++.dg/cpp0x/auto34.C new file mode 100644 index 00000000000..3682d60bf4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto34.C @@ -0,0 +1,18 @@ +// PR c++/51421 +// { dg-do compile { target c++11 } } + +int foo1(int); + +void bar1() +{ + auto i = foo1(i); // { dg-error "before deduction" } +} + +struct A {}; + +A foo2(A); + +void bar2() +{ + auto a = foo2(a); // { dg-error "before deduction" } +}