From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 61014 invoked by alias); 18 Feb 2016 18:22:45 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 109532 invoked by uid 89); 18 Feb 2016 18:14:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.5 required=5.0 tests=AWL,BAYES_50,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=sk:nonexi, sk:test_co, exec-continue, execcontinue X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 18 Feb 2016 18:14:06 +0000 Received: from svr-orw-fem-03.mgc.mentorg.com ([147.34.97.39]) by relay1.mentorg.com with esmtp id 1aWT5X-0001dA-7d from Don_Breazeal@mentor.com for gdb-patches@sourceware.org; Thu, 18 Feb 2016 10:14:03 -0800 Received: from [172.30.1.200] (147.34.91.1) by SVR-ORW-FEM-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server (TLS) id 14.3.224.2; Thu, 18 Feb 2016 10:14:02 -0800 Subject: Re: [PING] Re: [PATCH v4] PR 18303, Tolerate malformed input for lookup_symbol-called functions (was: [PATCH] Fix problem handling colon in linespec, PR breakpoints/18303) To: References: <1454021528-7073-1-git-send-email-donb@codesourcery.com> <56B39A52.9010203@codesourcery.com> From: Don Breazeal Message-ID: <56C609E5.3060506@codesourcery.com> Date: Thu, 18 Feb 2016 18:22:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <56B39A52.9010203@codesourcery.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg00568.txt.bz2 Ping. Current status of this one: - Doug approved (at least in concept) Keith's fix below. - Pedro requested that the new C++ linespec error test be consolidated with the existing C version of the test. That's done in this version. Thanks! --Don On 2/4/2016 10:37 AM, Don Breazeal wrote: > On 1/28/2016 2:52 PM, Don Breazeal wrote: >> Apologies -- the previous version of this patch was missing one file, >> added here. Sorry for the noise. >> --Don >> >> ---V3 Comment--- >> This patch differs from v2 in that the new test gdb.linespec/ls-errs-cp.exp >> is gone, and instead (per Pedro's suggestion) gdb.linespec/ls-errs.exp has >> been modified to test both C & C++, and to incorporate the small amount of >> extra testing from ls-errs-cp.exp. >> >> It also includes, unchanged from the previous version of the patch: >> >> * an updated version of the alternate fix that Keith proposed for my >> patch that addressed PR breakpoints/18303. Doug has approved (in >> concept, at least) the code portion of the patch. >> >> * a couple of other new tests of colons in linespecs. >> >> Thanks, >> --Don >> >> ----------- >> lookup_symbol is often called with user input. Consequently, any >> function called from lookup_symbol{,_in_language} should attempt to >> deal with malformed input gracefully. After all, malformed user >> input is not a programming/API error. >> >> This patch does not attempt to find/correct all instances of this. It >> only fixes locations in the code that trigger test suite failures. >> >> This patch fixes PR breakpoints/18303, "Assertion: -breakpoint-insert >> with windows paths of file in non-current directory". >> >> The patch includes three new tests related to this. One is just >> gdb.linespec/ls-errs.exp copied and converted to use C++ instead of C, and >> to add a case using a file name containing a Windows-style logical drive >> specifier. The others include an MI test to provide a regression test for >> the specific case reported in PR 18303, and a C++ test for proper error >> handling of access to a program variable when using a file scope specifier >> that refers to a non-existent file. >> >> Tested on x86_64 native Linux. >> >> gdb/ChangeLog >> 2016-01-28 Keith Seitz >> >> PR breakpoints/18303 >> * cp-namespace.c (cp_lookup_bare_symbol): Change assertion to >> look for "::" instead of simply ":". >> (cp_search_static_and_baseclasses): Return null_block_symbol for >> malformed input. >> Remove assertions. >> * cp-support.c (cp_find_first_component_aux): Do not return >> a prefix length for ':' unless the next character is also ':'. >> >> gdb/testsuite/ChangeLog >> 2016-01-28 Don Breazeal >> >> * gdb.cp/scope-err.cc: New test program. >> * gdb.cp/scope-err.exp: New test script. >> * gdb.linespec/ls-errs.c (myfunction): Expanded to have multiple >> lines and "set breakpoint here" comment. >> * gdb.linespec/ls-errs.exp: Added C++ testing and new test case. >> * gdb.mi/mi-linespec-err-cp.cc: New test program. >> * gdb.mi/mi-linespec-err-cp.exp: New test script. >> >> --- >> gdb/cp-namespace.c | 9 +- >> gdb/cp-support.c | 7 +- >> gdb/testsuite/gdb.cp/scope-err.cc | 35 +++ >> gdb/testsuite/gdb.cp/scope-err.exp | 47 ++++ >> gdb/testsuite/gdb.linespec/ls-errs.c | 13 +- >> gdb/testsuite/gdb.linespec/ls-errs.exp | 384 +++++++++++++++------------- >> gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc | 35 +++ >> gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp | 57 +++++ >> 8 files changed, 405 insertions(+), 182 deletions(-) >> >> diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c >> index 72002d6..016a42f 100644 >> --- a/gdb/cp-namespace.c >> +++ b/gdb/cp-namespace.c >> @@ -170,7 +170,7 @@ cp_lookup_bare_symbol (const struct language_defn *langdef, >> ':' may be in the args of a template spec. This isn't intended to be >> a complete test, just cheap and documentary. */ >> if (strchr (name, '<') == NULL && strchr (name, '(') == NULL) >> - gdb_assert (strchr (name, ':') == NULL); >> + gdb_assert (strstr (name, "::") == NULL); >> >> sym = lookup_symbol_in_static_block (name, block, domain); >> if (sym.symbol != NULL) >> @@ -246,10 +246,9 @@ cp_search_static_and_baseclasses (const char *name, >> struct block_symbol klass_sym; >> struct type *klass_type; >> >> - /* The test here uses <= instead of < because Fortran also uses this, >> - and the module.exp testcase will pass "modmany::" for NAME here. */ >> - gdb_assert (prefix_len + 2 <= strlen (name)); >> - gdb_assert (name[prefix_len + 1] == ':'); >> + /* Check for malformed input. */ >> + if (prefix_len + 2 > strlen (name) || name[prefix_len + 1] != ':') >> + return null_block_symbol; >> >> /* Find the name of the class and the name of the method, variable, etc. */ >> >> diff --git a/gdb/cp-support.c b/gdb/cp-support.c >> index df127c4..a71c6ad 100644 >> --- a/gdb/cp-support.c >> +++ b/gdb/cp-support.c >> @@ -1037,8 +1037,13 @@ cp_find_first_component_aux (const char *name, int permissive) >> return strlen (name); >> } >> case '\0': >> - case ':': >> return index; >> + case ':': >> + /* ':' marks a component iff the next character is also a ':'. >> + Otherwise it is probably malformed input. */ >> + if (name[index + 1] == ':') >> + return index; >> + break; >> case 'o': >> /* Operator names can screw up the recursion. */ >> if (operator_possible >> diff --git a/gdb/testsuite/gdb.cp/scope-err.cc b/gdb/testsuite/gdb.cp/scope-err.cc >> new file mode 100644 >> index 0000000..19c92d8 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.cp/scope-err.cc >> @@ -0,0 +1,35 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> + Copyright 2016 Free Software Foundation, Inc. >> + >> + This program is free software; you can redistribute it and/or modify >> + it under the terms of the GNU General Public License as published by >> + the Free Software Foundation; either version 3 of the License, or >> + (at your option) any later version. >> + >> + This program is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + GNU General Public License for more details. >> + >> + You should have received a copy of the GNU General Public License >> + along with this program. If not, see . */ >> + >> +int >> +myfunction (int aa) >> +{ >> + int i; >> + >> + i = aa + 42; >> + return i; /* set breakpoint here */ >> +} >> + >> +int >> +main (void) >> +{ >> + int a; >> + >> + a = myfunction (a); >> + >> + return a; >> +} >> diff --git a/gdb/testsuite/gdb.cp/scope-err.exp b/gdb/testsuite/gdb.cp/scope-err.exp >> new file mode 100644 >> index 0000000..9d93578 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.cp/scope-err.exp >> @@ -0,0 +1,47 @@ >> +# Copyright 2012-2016 Free Software Foundation, Inc. >> + >> +# This program is free software; you can redistribute it and/or modify >> +# it under the terms of the GNU General Public License as published by >> +# the Free Software Foundation; either version 3 of the License, or >> +# (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program. If not, see . >> + >> +# Tests for linespec errors with C++. >> +# Derived from gdb.linespec/ls-errs.exp. >> + >> +if { [skip_cplus_tests] } { continue } >> + >> +standard_testfile .cc >> +set exefile $testfile >> + >> +if {[prepare_for_testing $testfile $exefile $srcfile {debug c++}]} { >> + return -1 >> +} >> + >> +if ![runto_main] { >> + fail "Can't run to main" >> + return 0 >> +} >> + >> +# Run to a location in the file. >> +set bp_location [gdb_get_line_number "set breakpoint here"] >> + >> +gdb_test "break $srcfile:$bp_location" \ >> + "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ >> + "breakpoint line number in file" >> + >> +gdb_continue_to_breakpoint "$bp_location" >> + >> +# Try to access a variable using scope that is a non-existent filename >> +# with a Windows-style logical drive in the name. >> +set nonexistent_file C:/does/not/exist.cc >> +gdb_test "print '$nonexistent_file'::var" \ >> + ".*No symbol \"$nonexistent_file\" in current context.*" \ >> + "print var from \"$nonexistent_file\"" >> diff --git a/gdb/testsuite/gdb.linespec/ls-errs.c b/gdb/testsuite/gdb.linespec/ls-errs.c >> index ca41342..a3a43db 100644 >> --- a/gdb/testsuite/gdb.linespec/ls-errs.c >> +++ b/gdb/testsuite/gdb.linespec/ls-errs.c >> @@ -15,14 +15,21 @@ >> You should have received a copy of the GNU General Public License >> along with this program. If not, see . */ >> >> -int myfunction (void) { return 0; } >> +int >> +myfunction (int aa) >> +{ >> + int i; >> + >> + i = aa + 42; >> + return i; /* set breakpoint here */ >> +} >> >> int >> main (void) >> -{ >> +{ >> int a; >> >> - a = myfunction (); >> + a = myfunction (a); >> >> here: >> return a; >> diff --git a/gdb/testsuite/gdb.linespec/ls-errs.exp b/gdb/testsuite/gdb.linespec/ls-errs.exp >> index 16d4574..35f8f78 100644 >> --- a/gdb/testsuite/gdb.linespec/ls-errs.exp >> +++ b/gdb/testsuite/gdb.linespec/ls-errs.exp >> @@ -13,209 +13,247 @@ >> # You should have received a copy of the GNU General Public License >> # along with this program. If not, see . >> >> -# Tests for linespec error conditions >> +# Tests for linespec errors with C and C++. >> >> -standard_testfile >> -set exefile $testfile >> +# The test proper. LANG is either C or C++. >> >> -if {[prepare_for_testing $testfile $exefile $srcfile \ >> - {debug nowarnings}]} { >> - return -1 >> -} >> +proc do_test {lang} { >> + global testfile srcfile error_messages compiler_info >> >> -# Turn off the pending breakpoint queries. >> -gdb_test_no_output "set breakpoint pending off" >> + standard_testfile >> + set exefile $testfile >> + if [info exists compiler_info] { >> + # Unsetting compiler_info allows us to switch compilers >> + # used by prepare_for_testing. >> + unset compiler_info >> + } >> + set options {debug} >> >> -# Turn off completion limiting >> -gdb_test_no_output "set max-completions unlimited" >> + if { $lang == "C++" } { >> + if { [skip_cplus_tests] } { return 0 } >> + # Build ".c" source file with g++. >> + lappend options "c++" >> + } >> >> -# We intentionally do not use gdb_breakpoint for these tests. >> + if {[prepare_for_testing $testfile $exefile $srcfile $options]} { >> + return -1 >> + } >> >> -# Break at 'linespec' and expect the message in ::error_messages indexed by >> -# msg_id with the associated args. >> -proc test_break {linespec msg_id args} { >> - global error_messages >> + # Turn off the pending breakpoint queries. >> + gdb_test_no_output "set breakpoint pending off" >> >> - gdb_test "break $linespec" [string_to_regexp \ >> - [eval format \$error_messages($msg_id) $args]] >> -} >> + # Turn off completion limiting >> + gdb_test_no_output "set max-completions unlimited" >> >> -# Common error message format strings. >> -array set error_messages { >> - invalid_file "No source file named %s." >> - invalid_function "Function \"%s\" not defined." >> - invalid_var_or_func "Undefined convenience variable or function \"%s\" not defined." >> - invalid_function_f "Function \"%s\" not defined in \"%s\"." >> - invalid_var_or_func_f \ >> - "Undefined convenience variable or function \"%s\" not defined in \"%s\"." >> - invalid_label "No label \"%s\" defined in function \"%s\"." >> - invalid_parm "invalid linespec argument, \"%s\"" >> - invalid_offset "No line %d in the current file." >> - invalid_offset_f "No line %d in file \"%s\"." >> - malformed_line_offset "malformed line offset: \"%s\"" >> - source_incomplete \ >> - "Source filename requires function, label, or line offset." >> - unexpected "malformed linespec error: unexpected %s" >> - unexpected_opt "malformed linespec error: unexpected %s, \"%s\"" >> - unmatched_quote "unmatched quote" >> - garbage "Garbage '%s' at end of command" >> -} >> + if ![runto_main] { >> + fail "Can't run to main" >> + return 0 >> + } >> >> -# Some commonly used whitespace tests around ':'. >> -set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" " \t:\t " \ >> - "\t \t:\t \t \t"] >> + # Run to a location in the file. >> + set bp_location [gdb_get_line_number "set breakpoint here"] >> + >> + gdb_test "break $srcfile:$bp_location" \ >> + "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ >> + "breakpoint line number in file" >> + >> + gdb_continue_to_breakpoint "$bp_location" >> + >> + # Common error message format strings. >> + array set error_messages { >> + invalid_file "No source file named %s." >> + invalid_function "Function \"%s\" not defined." >> + invalid_var_or_func >> + "Undefined convenience variable or function \"%s\" not defined." >> + invalid_function_f "Function \"%s\" not defined in \"%s\"." >> + invalid_var_or_func_f \ >> + "Undefined convenience variable or function \"%s\" not defined in \"%s\"." >> + invalid_label "No label \"%s\" defined in function \"%s\"." >> + invalid_parm "invalid linespec argument, \"%s\"" >> + invalid_offset "No line %d in the current file." >> + invalid_offset_f "No line %d in file \"%s\"." >> + malformed_line_offset "malformed line offset: \"%s\"" >> + source_incomplete \ >> + "Source filename requires function, label, or line offset." >> + unexpected "malformed linespec error: unexpected %s" >> + unexpected_opt "malformed linespec error: unexpected %s, \"%s\"" >> + unmatched_quote "unmatched quote" >> + garbage "Garbage '%s' at end of command" >> + } >> >> -# A list of invalid offsets. >> -set invalid_offsets [list -100 +500 1000] >> + # We intentionally do not use gdb_breakpoint for these tests. >> >> -# Try some simple, invalid linespecs involving spaces. >> -foreach x $spaces { >> - test_break $x unexpected "colon" >> -} >> + # Break at 'linespec' and expect the message in ::error_messages >> + # indexed by msg_id with the associated args. >> + proc test_break {linespec msg_id args} { >> + global error_messages >> >> -# Test invalid filespecs starting with offset. This is done >> -# first so that default offsets are tested. >> -foreach x $invalid_offsets { >> - set offset $x >> - >> - # Relative offsets are relative to line 16. Adjust >> - # expected offset from error message accordingly. >> - if {[string index $x 0] == "+" || >> - [string index $x 0] == "-"} { >> - incr offset 16 >> + gdb_test "break $linespec" [string_to_regexp \ >> + [eval format \$error_messages($msg_id) \ >> + $args]] >> } >> - test_break $x invalid_offset $offset >> - test_break "-line $x" invalid_offset $offset >> -} >> >> -# Test offsets with trailing tokens w/ and w/o spaces. >> -foreach x $spaces { >> - test_break "3$x" unexpected "colon" >> - test_break "+10$x" unexpected "colon" >> - test_break "-10$x" unexpected "colon" >> -} >> + # Some commonly used whitespace tests around ':'. >> + set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" \ >> + " \t:\t " "\t \t:\t \t \t"] >> >> -foreach x {1 +1 +100 -10} { >> - test_break "3 $x" unexpected_opt "number" $x >> - test_break "-line 3 $x" garbage $x >> - test_break "+10 $x" unexpected_opt "number" $x >> - test_break "-line +10 $x" garbage $x >> - test_break "-10 $x" unexpected_opt "number" $x >> - test_break "-line -10 $x" garbage $x >> -} >> + # A list of invalid offsets. >> + set invalid_offsets [list -100 +500 1000] >> >> -foreach x {3 +10 -10} { >> - test_break "$x foo" unexpected_opt "string" "foo" >> - test_break "-line $x foo" garbage "foo" >> -} >> + # Try some simple, invalid linespecs involving spaces. >> + foreach x $spaces { >> + test_break $x unexpected "colon" >> + } >> >> -# Test invalid linespecs starting with filename. >> -foreach x [list "this_file_doesn't_exist.c" \ >> - "this file has spaces.c" \ >> - "\"file::colons.c\"" \ >> - "'file::colons.c'" \ >> - "\"this \"file\" has quotes.c\"" \ >> - "'this \"file\" has quotes.c'" \ >> - "'this 'file' has quotes.c'" \ >> - "\"this 'file' has quotes.c\"" \ >> - "\"spaces: and :colons.c\"" \ >> - "'more: :spaces: :and colons::.c'"] { >> - # Remove any quoting from FILENAME for the error message. >> - test_break "$x:3" invalid_file [string trim $x \"'] >> -} >> -foreach x [list "this_file_doesn't_exist.c" \ >> - "file::colons.c" \ >> - "'file::colons.c'"] { >> - test_break "-source $x -line 3" \ >> - invalid_file [string trim $x \"'] >> -} >> + # Test invalid filespecs starting with offset. This is done >> + # first so that default offsets are tested. >> + foreach x $invalid_offsets { >> + set offset $x >> + >> + # Relative offsets are relative to line 16. Adjust >> + # expected offset from error message accordingly. >> + if {[string index $x 0] == "+" || [string index $x 0] == "-"} { >> + incr offset 24 >> + } >> + test_break $x invalid_offset $offset >> + test_break "-line $x" invalid_offset $offset >> + } >> + >> + # Test offsets with trailing tokens w/ and w/o spaces. >> + foreach x $spaces { >> + test_break "3$x" unexpected "colon" >> + test_break "+10$x" unexpected "colon" >> + test_break "-10$x" unexpected "colon" >> + } >> + >> + foreach x {1 +1 +100 -10} { >> + test_break "3 $x" unexpected_opt "number" $x >> + test_break "-line 3 $x" garbage $x >> + test_break "+10 $x" unexpected_opt "number" $x >> + test_break "-line +10 $x" garbage $x >> + test_break "-10 $x" unexpected_opt "number" $x >> + test_break "-line -10 $x" garbage $x >> + } >> >> -# Test that option lexing stops at whitespace boundaries >> -test_break "-source this file has spaces.c -line 3" \ >> - invalid_file "this" >> + foreach x {3 +10 -10} { >> + test_break "$x foo" unexpected_opt "string" "foo" >> + test_break "-line $x foo" garbage "foo" >> + } >> >> -test_break "-function function whitespace" \ >> - invalid_function "function" >> + # Test invalid linespecs starting with filename. >> + # It's OK to use the ".c" extension for the C++ test >> + # since the extension doesn't affect GDB's lookup. >> + set invalid_files [list "this_file_doesn't_exist.c" \ >> + "this file has spaces.c" \ >> + "\"file::colons.c\"" \ >> + "'file::colons.c'" \ >> + "\"this \"file\" has quotes.c\"" \ >> + "'this \"file\" has quotes.c'" \ >> + "'this 'file' has quotes.c'" \ >> + "\"this 'file' has quotes.c\"" \ >> + "\"spaces: and :colons.c\"" \ >> + "'more: :spaces: :and colons::.c'" \ >> + "C:/nonexist-with-windrive.c"] >> + >> + foreach x $invalid_files { >> + # Remove any quoting from FILENAME for the error message. >> + test_break "$x:3" invalid_file [string trim $x \"'] >> + } >> + foreach x [list "this_file_doesn't_exist.c" \ >> + "file::colons.c" \ >> + "'file::colons.c'"] { >> + test_break "-source $x -line 3" invalid_file [string trim $x \"'] >> + } >> >> -test_break "-source $srcfile -function function whitespace" \ >> - invalid_function_f "function" $srcfile >> + # Test that option lexing stops at whitespace boundaries >> + test_break "-source this file has spaces.c -line 3" invalid_file "this" >> + test_break "-function function whitespace" invalid_function "function" >> + test_break "-source $srcfile -function function whitespace" \ >> + invalid_function_f "function" $srcfile >> >> -test_break "-function main -label label whitespace" \ >> - invalid_label "label" "main" >> + test_break "-function main -label label whitespace" \ >> + invalid_label "label" "main" >> >> -# Test unmatched quotes. >> -foreach x {"\"src-file.c'" "'src-file.c"} { >> - test_break "$x:3" unmatched_quote >> -} >> + # Test unmatched quotes. >> + foreach x {"\"src-file.c'" "'src-file.c"} { >> + test_break "$x:3" unmatched_quote >> + } >> >> -test_break $srcfile invalid_function $srcfile >> -foreach x {"foo" " foo" " foo "} { >> - # Trim any leading/trailing whitespace for error messages. >> - test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile >> - test_break "-source $srcfile -function $x" \ >> - invalid_function_f [string trim $x] $srcfile >> - test_break "$srcfile:main:$x" invalid_label [string trim $x] "main" >> - test_break "-source $srcfile -function main -label $x" \ >> - invalid_label [string trim $x] "main" >> -} >> + test_break $srcfile invalid_function $srcfile >> + foreach x {"foo" " foo" " foo "} { >> + # Trim any leading/trailing whitespace for error messages. >> + test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile >> + test_break "-source $srcfile -function $x" \ >> + invalid_function_f [string trim $x] $srcfile >> + test_break "$srcfile:main:$x" invalid_label [string trim $x] "main" >> + test_break "-source $srcfile -function main -label $x" \ >> + invalid_label [string trim $x] "main" >> + } >> >> -foreach x $spaces { >> - test_break "$srcfile$x" unexpected "end of input" >> - test_break "$srcfile:main$x" unexpected "end of input" >> -} >> + foreach x $spaces { >> + test_break "$srcfile$x" unexpected "end of input" >> + test_break "$srcfile:main$x" unexpected "end of input" >> + } >> >> -test_break "${srcfile}::" invalid_function "${srcfile}::" >> -test_break "$srcfile:3 1" unexpected_opt "number" "1" >> -test_break "-source $srcfile -line 3 1" garbage "1" >> -test_break "$srcfile:3 +100" unexpected_opt "number" "+100" >> -test_break "-source $srcfile -line 3 +100" garbage "+100" >> -test_break "$srcfile:3 -100" unexpected_opt "number" "-100" >> -test_break "$srcfile:3 foo" unexpected_opt "string" "foo" >> -test_break "-source $srcfile -line 3 foo" garbage "foo" >> - >> -foreach x $invalid_offsets { >> - test_break "$srcfile:$x" invalid_offset_f $x $srcfile >> - test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile >> - test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile >> - test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile >> -} >> -test_break "-source $srcfile -line -x" malformed_line_offset "-x" >> + test_break "${srcfile}::" invalid_function "${srcfile}::" >> + test_break "$srcfile:3 1" unexpected_opt "number" "1" >> + test_break "-source $srcfile -line 3 1" garbage "1" >> + test_break "$srcfile:3 +100" unexpected_opt "number" "+100" >> + test_break "-source $srcfile -line 3 +100" garbage "+100" >> + test_break "$srcfile:3 -100" unexpected_opt "number" "-100" >> + test_break "$srcfile:3 foo" unexpected_opt "string" "foo" >> + test_break "-source $srcfile -line 3 foo" garbage "foo" >> + >> + foreach x $invalid_offsets { >> + test_break "$srcfile:$x" invalid_offset_f $x $srcfile >> + test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile >> + test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile >> + test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile >> + } >> + test_break "-source $srcfile -line -x" malformed_line_offset "-x" >> >> -# Test invalid filespecs starting with function. >> -foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \ >> + # Test invalid filespecs starting with function. >> + foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \ >> "foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} { >> - test_break $x invalid_function $x >> - test_break "-function \"$x\"" invalid_function $x >> -} >> + test_break $x invalid_function $x >> + test_break "-function \"$x\"" invalid_function $x >> + } >> >> -foreach x $spaces { >> - test_break "main${x}there" invalid_label "there" "main" >> - if {[test_compiler_info {clang-*-*}]} { setup_xfail clang/14500 *-*-* } >> - test_break "main:here${x}" unexpected "end of input" >> -} >> + foreach x $spaces { >> + test_break "main${x}there" invalid_label "there" "main" >> + if {[test_compiler_info {clang-*-*}]} { >> + setup_xfail clang/14500 *-*-* >> + } >> + test_break "main:here${x}" unexpected "end of input" >> + } >> >> -foreach x {"3" "+100" "-100" "foo"} { >> - test_break "main 3" invalid_function "main 3" >> - test_break "-function \"main $x\"" invalid_function "main $x" >> - test_break "main:here $x" invalid_label "here $x" "main" >> - test_break "-function main -label \"here $x\"" \ >> - invalid_label "here $x" "main" >> -} >> + foreach x {"3" "+100" "-100" "foo"} { >> + test_break "main 3" invalid_function "main 3" >> + test_break "-function \"main $x\"" invalid_function "main $x" >> + test_break "main:here $x" invalid_label "here $x" "main" >> + test_break "-function main -label \"here $x\"" \ >> + invalid_label "here $x" "main" >> + } >> >> -foreach x {"if" "task" "thread"} { >> - test_break $x invalid_function $x >> -} >> + foreach x {"if" "task" "thread"} { >> + test_break $x invalid_function $x >> + } >> >> -test_break "'main.c'flubber" unexpected_opt "string" "flubber" >> -test_break "'main.c',21" invalid_function "main.c" >> -test_break "'main.c' " invalid_function "main.c" >> -test_break "'main.c'3" unexpected_opt "number" "3" >> -test_break "'main.c'+3" unexpected_opt "number" "+3" >> + test_break "'main.c'flubber" unexpected_opt "string" "flubber" >> + test_break "'main.c',21" invalid_function "main.c" >> + test_break "'main.c' " invalid_function "main.c" >> + test_break "'main.c'3" unexpected_opt "number" "3" >> + test_break "'main.c'+3" unexpected_opt "number" "+3" >> >> -# Test undefined convenience variables. >> -set x {$zippo} >> -test_break $x invalid_var_or_func $x >> -test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile >> + # Test undefined convenience variables. >> + set x {$zippo} >> + test_break $x invalid_var_or_func $x >> + test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile >> >> -# Explicit linespec-specific tests >> -test_break "-source $srcfile" source_incomplete >> + # Explicit linespec-specific tests >> + test_break "-source $srcfile" source_incomplete >> +} >> + >> +foreach_with_prefix lang {"C" "C++"} { >> + do_test ${lang} >> +} >> diff --git a/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc >> new file mode 100644 >> index 0000000..19c92d8 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.cc >> @@ -0,0 +1,35 @@ >> +/* This testcase is part of GDB, the GNU debugger. >> + >> + Copyright 2016 Free Software Foundation, Inc. >> + >> + This program is free software; you can redistribute it and/or modify >> + it under the terms of the GNU General Public License as published by >> + the Free Software Foundation; either version 3 of the License, or >> + (at your option) any later version. >> + >> + This program is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + GNU General Public License for more details. >> + >> + You should have received a copy of the GNU General Public License >> + along with this program. If not, see . */ >> + >> +int >> +myfunction (int aa) >> +{ >> + int i; >> + >> + i = aa + 42; >> + return i; /* set breakpoint here */ >> +} >> + >> +int >> +main (void) >> +{ >> + int a; >> + >> + a = myfunction (a); >> + >> + return a; >> +} >> diff --git a/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp >> new file mode 100644 >> index 0000000..1a8682e >> --- /dev/null >> +++ b/gdb/testsuite/gdb.mi/mi-linespec-err-cp.exp >> @@ -0,0 +1,57 @@ >> +# Copyright 2016 Free Software Foundation, Inc. >> + >> +# This program is free software; you can redistribute it and/or modify >> +# it under the terms of the GNU General Public License as published by >> +# the Free Software Foundation; either version 3 of the License, or >> +# (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program. If not, see . >> + >> +# Regression test for PR breakpoints/18303. Tests that the correct >> +# errors is generated when setting a breakpoint in a non-existent >> +# file with a Windows-style logical drive names and C++. >> + >> +if { [skip_cplus_tests] } { continue } >> + >> +load_lib mi-support.exp >> +set MIFLAGS "-i=mi" >> + >> +standard_testfile .cc >> +set exefile $testfile >> + >> +if {[prepare_for_testing $testfile $exefile $srcfile {debug c++}]} { >> + return -1 >> +} >> + >> +gdb_exit >> +if [mi_gdb_start] { >> + continue >> +} >> + >> +# Turn off the pending breakpoint queries. >> +mi_gdb_test "-interpreter-exec console \"set breakpoint pending off\"" \ >> + {=cmd-param-changed,param=\"breakpoint pending\",.*\^done} \ >> + "-interpreter-exec console \"set breakpoint pending off\"" >> + >> +mi_run_to_main >> + >> +# Run to a location in the file. >> +set bp_location [gdb_get_line_number "set breakpoint here"] >> + >> +mi_gdb_test "-break-insert ${srcfile}:${bp_location}" \ >> + {\^done,bkpt=.number="2",type="breakpoint".*\}} "set breakpoint" >> + >> +mi_execute_to "exec-continue" "breakpoint-hit" "myfunction" ".*" ".*" "24" \ >> + { "" "disp=\"keep\"" } "breakpoint hit" >> + >> +# Set a breakpoint in a C++ source file whose name contains a >> +# Windows-style logical drive. >> +mi_gdb_test \ >> + "-break-insert -f \"c:/uu.cpp:13\"" \ >> + ".*No source file named c:/uu.cpp.*" >> > Ping? > thanks > --Don >