text: """
  Tests that TSan correctly reports the filename and line number of a racy global C++ variable.
  """
  
  import lldb
  from lldbsuite.test.lldbtest import *
  from lldbsuite.test.decorators import *
  import lldbsuite.test.lldbutil as lldbutil
  import json
  
  
  class TsanCPPGlobalLocationTestCase(TestBase):
  
      mydir = TestBase.compute_mydir(__file__)
  
      @expectedFailureAll(
          oslist=["linux"],
          bugnumber="non-core functionality, need to reenable and fix later (DES 2014.11.07)")
      @expectedFailureNetBSD
      @skipIfFreeBSD  # llvm.org/pr21136 runtimes not yet available by default
      @skipIfRemote
      @skipUnlessThreadSanitizer
      def test(self):
          self.build()
          self.tsan_tests()
  
      def tsan_tests(self):
          exe = self.getBuildArtifact("a.out")
          self.expect(
              "file " + exe,
              patterns=["Current executable set to .*a.out"])
  
          self.runCmd("run")
  
          stop_reason = self.dbg.GetSelectedTarget().process.GetSelectedThread().GetStopReason()
          if stop_reason == lldb.eStopReasonExec:
              # On OS X 10.10 and older, we need to re-exec to enable
              # interceptors.
              self.runCmd("continue")
  
          # the stop reason of the thread should be breakpoint.
          self.expect("thread list", "A data race should be detected",
                      substrs=['stopped', 'stop reason = Data race detected'])
  
          self.expect(
              "thread info -s",
              "The extended stop info should contain the TSan provided fields",
              substrs=[
                  "instrumentation_class",
                  "description",
                  "mops"])
  
          output_lines = self.res.GetOutput().split('\n')
          json_line = '\n'.join(output_lines[2:])
          data = json.loads(json_line)
          self.assertEqual(data["instrumentation_class"], "ThreadSanitizer")
          self.assertEqual(data["issue_type"], "data-race")
  
          self.assertTrue(data["location_filename"].endswith("/main.cpp"))
          self.assertEqual(
              data["location_line"],
              line_number(
                  'main.cpp',
                  '// global variable'))
  