summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Lykke Andersen <jakobandersen@users.noreply.github.com>2020-10-03 16:27:12 +0200
committerGitHub <noreply@github.com>2020-10-03 16:27:12 +0200
commit488f4a6ac44f8fc81cb55ad3c7fb1fd1271b03ff (patch)
tree37a1361fdc25b5a0b5ffc67c1fb95a5548605732
parent94ce18205dd5a3d068cda4fd7902ff5a8f230e98 (diff)
parent777bcb43fa26aeaf34329c56cb1e316da0a1d9e6 (diff)
downloadsphinx-git-488f4a6ac44f8fc81cb55ad3c7fb1fd1271b03ff.tar.gz
Merge pull request #8275 from jakobandersen/cpp_fix_crash
C++, properly reject functions as duplicates
-rw-r--r--CHANGES2
-rw-r--r--sphinx/domains/cpp.py25
-rw-r--r--tests/test_domain_cpp.py15
3 files changed, 35 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index 564eb799a..93cc5fb8c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -19,6 +19,8 @@ Bugs fixed
* #8188: C, add missing items to internal object types dictionary,
e.g., preventing intersphinx from resolving them.
* C, fix anon objects in intersphinx.
+* #8270, C++, properly reject functions as duplicate declarations if a
+ non-function declaration of the same name already exists.
Testing
diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py
index 7b10f8166..c43c55d5b 100644
--- a/sphinx/domains/cpp.py
+++ b/sphinx/domains/cpp.py
@@ -4107,7 +4107,7 @@ class Symbol:
Symbol.debug_print("self:")
print(self.to_string(Symbol.debug_indent + 1), end="")
Symbol.debug_print("nestedName: ", nestedName)
- Symbol.debug_print("templateDecls: ", templateDecls)
+ Symbol.debug_print("templateDecls: ", ",".join(str(t) for t in templateDecls))
Symbol.debug_print("strictTemplateParamArgLists:", strictTemplateParamArgLists)
Symbol.debug_print("ancestorLookupType:", ancestorLookupType)
Symbol.debug_print("templateShorthand: ", templateShorthand)
@@ -4231,7 +4231,7 @@ class Symbol:
Symbol.debug_indent += 1
Symbol.debug_print("_add_symbols:")
Symbol.debug_indent += 1
- Symbol.debug_print("tdecls:", templateDecls)
+ Symbol.debug_print("tdecls:", ",".join(str(t) for t in templateDecls))
Symbol.debug_print("nn: ", nestedName)
Symbol.debug_print("decl: ", declaration)
Symbol.debug_print("doc: ", docname)
@@ -4360,6 +4360,11 @@ class Symbol:
if Symbol.debug_lookup:
Symbol.debug_print("candId:", candId)
for symbol in withDecl:
+ # but all existing must be functions as well,
+ # otherwise we declare it to be a duplicate
+ if symbol.declaration.objectType != 'function':
+ handleDuplicateDeclaration(symbol, candSymbol)
+ # (not reachable)
oldId = symbol.declaration.get_newest_id()
if Symbol.debug_lookup:
Symbol.debug_print("oldId: ", oldId)
@@ -4370,7 +4375,11 @@ class Symbol:
# if there is an empty symbol, fill that one
if len(noDecl) == 0:
if Symbol.debug_lookup:
- Symbol.debug_print("no match, no empty, candSybmol is not None?:", candSymbol is not None) # NOQA
+ Symbol.debug_print("no match, no empty")
+ if candSymbol is not None:
+ Symbol.debug_print("result is already created candSymbol")
+ else:
+ Symbol.debug_print("result is makeCandSymbol()")
Symbol.debug_indent -= 2
if candSymbol is not None:
return candSymbol
@@ -6814,10 +6823,12 @@ class CPPObject(ObjectDescription):
parentSymbol = env.temp_data['cpp:parent_symbol']
parentDecl = parentSymbol.declaration
if parentDecl is not None and parentDecl.objectType == 'function':
- logger.warning("C++ declarations inside functions are not supported." +
- " Parent function is " +
- str(parentSymbol.get_full_nested_name()),
- location=self.get_source_info())
+ msg = "C++ declarations inside functions are not supported." \
+ " Parent function: {}\nDirective name: {}\nDirective arg: {}"
+ logger.warning(msg.format(
+ str(parentSymbol.get_full_nested_name()),
+ self.name, self.arguments[0]
+ ), location=self.get_source_info())
name = _make_phony_error_name()
symbol = parentSymbol.add_name(name)
env.temp_data['cpp:last_symbol'] = symbol
diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py
index 558d69911..ec7a2b262 100644
--- a/tests/test_domain_cpp.py
+++ b/tests/test_domain_cpp.py
@@ -1236,3 +1236,18 @@ def test_noindexentry(app):
assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
assert_node(doctree[0], addnodes.index, entries=[('single', 'f (C++ function)', '_CPPv41fv', '', None)])
assert_node(doctree[2], addnodes.index, entries=[])
+
+
+def test_mix_decl_duplicate(app, warning):
+ # Issue 8270
+ text = (".. cpp:struct:: A\n"
+ ".. cpp:function:: void A()\n"
+ ".. cpp:struct:: A\n")
+ restructuredtext.parse(app, text)
+ ws = warning.getvalue().split("\n")
+ assert len(ws) == 5
+ assert "index.rst:2: WARNING: Duplicate C++ declaration, also defined in 'index'." in ws[0]
+ assert "Declaration is 'void A()'." in ws[1]
+ assert "index.rst:3: WARNING: Duplicate C++ declaration, also defined in 'index'." in ws[2]
+ assert "Declaration is 'A'." in ws[3]
+ assert ws[4] == "" \ No newline at end of file