diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b7929640c014..d499bfdadd04 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2006-06-29 Lee Millward + Andrew Pinski + + PR c++/27820 + * decl.c (define_label): Return error_mark_node on error. + * semantics.c (finish_label_stmt): Don't call + add_stmt for invalid labels. + 2006-07-06 Jason Merrill PR c++/28279 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 49d192024729..1d5be58e09f4 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2543,7 +2543,10 @@ define_label (location_t location, tree name) pedwarn ("label named wchar_t"); if (DECL_INITIAL (decl) != NULL_TREE) - error ("duplicate label %qD", decl); + { + error ("duplicate label %qD", decl); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + } else { struct named_label_use_entry *use; diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c5b3fbb0f627..9ecace6806a0 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1293,6 +1293,10 @@ tree finish_label_stmt (tree name) { tree decl = define_label (input_location, name); + + if (decl == error_mark_node) + return error_mark_node; + return add_stmt (build_stmt (LABEL_EXPR, decl)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ce58b244728..9203c1566daa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-07-07 Lee Millward + + PR c++/27820 + * g++.dg/other/label1.C: New test. + 2006-07-07 Richard Guenther PR middle-end/28268 diff --git a/gcc/testsuite/g++.dg/other/label1.C b/gcc/testsuite/g++.dg/other/label1.C new file mode 100644 index 000000000000..74572dc7d2c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/label1.C @@ -0,0 +1,7 @@ +//PR c++/27820 + +void foo() +{ + L: L: ; // { dg-error "duplicate label" } +} +