1532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbarfrom clang.cindex import *
21f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_tu
3532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar
4532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar# FIXME: We need support for invalid translation units to test better.
5532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar
6532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbardef test_diagnostic_warning():
71f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('int f0() {}\n')
8532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert len(tu.diagnostics) == 1
9532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].severity == Diagnostic.Warning
10532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].location.line == 1
11532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].location.column == 11
12532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert (tu.diagnostics[0].spelling ==
13532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar            'control reaches end of non-void function')
14532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar
15532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbardef test_diagnostic_note():
16532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    # FIXME: We aren't getting notes here for some reason.
171f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('#define A x\nvoid *A = 1;\n')
18532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert len(tu.diagnostics) == 1
19532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].severity == Diagnostic.Warning
20532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].location.line == 2
21532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].location.column == 7
22532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert 'incompatible' in tu.diagnostics[0].spelling
23532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar#    assert tu.diagnostics[1].severity == Diagnostic.Note
24532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar#    assert tu.diagnostics[1].location.line == 1
25532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar#    assert tu.diagnostics[1].location.column == 11
26532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar#    assert tu.diagnostics[1].spelling == 'instantiated from'
27532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar
28532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbardef test_diagnostic_fixit():
291f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('struct { int f0; } x = { f0 : 1 };')
30532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert len(tu.diagnostics) == 1
31532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].severity == Diagnostic.Warning
32532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].location.line == 1
33888982e42ba1b3098abbc1fd5e605d35ba51b34bDouglas Gregor    assert tu.diagnostics[0].location.column == 26
34532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].spelling.startswith('use of GNU old-style')
35532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert len(tu.diagnostics[0].fixits) == 1
36532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].fixits[0].range.start.line == 1
37532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].fixits[0].range.start.column == 26
38532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].fixits[0].range.end.line == 1
39d52864bd33c66aacc84133460d8c9c0dfcdd5c18Daniel Dunbar    assert tu.diagnostics[0].fixits[0].range.end.column == 30
40532fc63b51cd0eb795df36d3fe306645b8b980e4Daniel Dunbar    assert tu.diagnostics[0].fixits[0].value == '.f0 = '
41f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser
42f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosserdef test_diagnostic_range():
431f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('void f() { int i = "a" + 1; }')
44f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert len(tu.diagnostics) == 1
45f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].severity == Diagnostic.Warning
46f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].location.line == 1
47f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].location.column == 16
48f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].spelling.startswith('incompatible pointer to')
49f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert len(tu.diagnostics[0].fixits) == 0
50f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert len(tu.diagnostics[0].ranges) == 1
51f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].ranges[0].start.line == 1
52f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].ranges[0].start.column == 20
53f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].ranges[0].end.line == 1
54f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    assert tu.diagnostics[0].ranges[0].end.column == 27
55f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    try:
56f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser      tu.diagnostics[0].ranges[1].start.line
57f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    except IndexError:
58f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser      assert True
59f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser    else:
60f498e00a30ca7fdaf4f49e778862f4cf84ffab2aTobias Grosser      assert False
61ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser
62ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosserdef test_diagnostic_category():
631f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """Ensure that category properties work."""
641f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('int f(int i) { return 7; }', all_warnings=True)
65ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert len(tu.diagnostics) == 1
66ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    d = tu.diagnostics[0]
67ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser
68ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.severity == Diagnostic.Warning
69ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.location.line == 1
70ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.location.column == 11
71ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser
72ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.category_number == 2
73ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.category_name == 'Semantic Issue'
74ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser
75ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosserdef test_diagnostic_option():
761f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    """Ensure that category option properties work."""
771f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('int f(int i) { return 7; }', all_warnings=True)
78ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert len(tu.diagnostics) == 1
79ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    d = tu.diagnostics[0]
80ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser
81ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.option == '-Wunused-parameter'
82ea403825faa5b8780a9b44277e6a2c68d7849146Tobias Grosser    assert d.disable_option == '-Wno-unused-parameter'
83