Index: lldb/test/API/commands/expression/diagnostics/TestExprDiagnostics.py =================================================================== --- lldb/test/API/commands/expression/diagnostics/TestExprDiagnostics.py +++ lldb/test/API/commands/expression/diagnostics/TestExprDiagnostics.py @@ -29,20 +29,38 @@ self.assertFalse(value.GetError().Success()) # We should get a nice diagnostic with a caret pointing at the start of # the identifier. - self.assertIn("\nunknown_identifier\n^\n", value.GetError().GetCString()) + self.assertIn( + """ + 1 | unknown_identifier + | ^ +""", + value.GetError().GetCString(), + ) self.assertIn(":1:1", value.GetError().GetCString()) # Same as above but with the identifier in the middle. - value = frame.EvaluateExpression("1 + unknown_identifier ") + value = frame.EvaluateExpression("1 + unknown_identifier") self.assertFalse(value.GetError().Success()) - self.assertIn("\n1 + unknown_identifier", value.GetError().GetCString()) - self.assertIn("\n ^\n", value.GetError().GetCString()) + self.assertIn( + """ + 1 | 1 + unknown_identifier + | ^ +""", + value.GetError().GetCString(), + ) # Multiline expressions. value = frame.EvaluateExpression("int a = 0;\nfoobar +=1;\na") self.assertFalse(value.GetError().Success()) # We should still get the right line information and caret position. - self.assertIn("\nfoobar +=1;\n^\n", value.GetError().GetCString()) + self.assertIn( + """ + 2 | foobar +=1; + | ^ +""", + value.GetError().GetCString(), + ) + # It's the second line of the user expression. self.assertIn(":2:1", value.GetError().GetCString()) @@ -52,7 +70,14 @@ value = frame.EvaluateExpression("void foo(unknown_type x) {}", top_level_opts) self.assertFalse(value.GetError().Success()) - self.assertIn("\nvoid foo(unknown_type x) {}\n ^\n", value.GetError().GetCString()) + self.assertIn( + """ + 1 | void foo(unknown_type x) {} + | ^ +""", + value.GetError().GetCString(), + ) + # Top-level expressions might use a different wrapper code, but the file name should still # be the same. self.assertIn(":1:10", value.GetError().GetCString()) @@ -60,31 +85,79 @@ # Multiline top-level expressions. value = frame.EvaluateExpression("void x() {}\nvoid foo;", top_level_opts) self.assertFalse(value.GetError().Success()) - self.assertIn("\nvoid foo;\n ^", value.GetError().GetCString()) + self.assertIn( + """ + 2 | void foo; + | ^ +""", + value.GetError().GetCString(), + ) + self.assertIn(":2:6", value.GetError().GetCString()) # Test that we render Clang's 'notes' correctly. value = frame.EvaluateExpression("struct SFoo{}; struct SFoo { int x; };", top_level_opts) self.assertFalse(value.GetError().Success()) - self.assertIn(":1:8: previous definition is here\nstruct SFoo{}; struct SFoo { int x; };\n ^\n", value.GetError().GetCString()) + self.assertIn( + ":1:8: previous definition is here\n", + value.GetError().GetCString(), + ) + self.assertIn( + """ + 1 | struct SFoo{}; struct SFoo { int x; }; + | ^ +""", + value.GetError().GetCString(), + ) # Declarations from the debug information currently have no debug information. It's not clear what # we should do in this case, but we should at least not print anything that's wrong. # In the future our declarations should have valid source locations. value = frame.EvaluateExpression("struct FooBar { double x };", top_level_opts) self.assertFalse(value.GetError().Success()) - self.assertIn("error: :1:8: redefinition of 'FooBar'\nstruct FooBar { double x };\n ^\n", value.GetError().GetCString()) + self.assertIn( + "error: :1:8: redefinition of 'FooBar'\n", + value.GetError().GetCString(), + ) + self.assertIn( + """ + 1 | struct FooBar { double x }; + | ^ +""", + value.GetError().GetCString(), + ) value = frame.EvaluateExpression("foo(1, 2)") self.assertFalse(value.GetError().Success()) - self.assertIn("error: :1:1: no matching function for call to 'foo'\nfoo(1, 2)\n^~~\nnote: candidate function not viable: requires single argument 'x', but 2 arguments were provided\n\n", value.GetError().GetCString()) + self.assertIn( + "error: :1:1: no matching function for call to 'foo'\n", + value.GetError().GetCString(), + ) + self.assertIn( + """ + 1 | foo(1, 2) + | ^~~ +note: candidate function not viable: requires single argument 'x', but 2 arguments were provided +""", + value.GetError().GetCString(), + ) # Redefine something that we defined in a user-expression. We should use the previous expression file name # for the original decl. value = frame.EvaluateExpression("struct Redef { double x; };", top_level_opts) value = frame.EvaluateExpression("struct Redef { float y; };", top_level_opts) self.assertFalse(value.GetError().Success()) - self.assertIn("error: :1:8: redefinition of 'Redef'\nstruct Redef { float y; };\n ^\n:1:8: previous definition is here\nstruct Redef { double x; };\n ^", value.GetError().GetCString()) + self.assertIn( + """ +error: :1:8: redefinition of 'Redef' + 1 | struct Redef { float y; }; + | ^ +:1:8: previous definition is here + 1 | struct Redef { double x; }; + | ^ +""", + value.GetError().GetCString(), + ) @add_test_categories(["objc"]) def test_source_locations_from_objc_modules(self):