diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt
index f5cb12f..1ad4fb9 100644
--- a/runtime/doc/popup.txt
+++ b/runtime/doc/popup.txt
@@ -1,4 +1,4 @@
-*popup.txt*  For Vim version 9.1.  Last change: 2022 Oct 07
+*popup.txt*  For Vim version 9.1.  Last change: 2024 Jun 08
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -219,6 +219,8 @@
 
 		Can also be used as a |method|: >
 			GetText()->popup_atcursor({})
+<
+		Return type: |Number|
 
 
 popup_beval({what}, {options})			*popup_beval()*
@@ -237,6 +239,8 @@
 		Can also be used as a |method|: >
 			GetText()->popup_beval({})
 <
+		Return type: |Number|
+
 							*popup_clear()*
 popup_clear([{force}])
 		Emergency solution to a misbehaving plugin: close all popup
@@ -248,6 +252,8 @@
 		when it is the current window.  If a terminal is running in a
 		popup it is killed.
 
+		Return type: |Number|
+
 
 popup_close({id} [, {result}])				*popup_close()*
 		Close popup {id}.  The window and the associated buffer will
@@ -260,6 +266,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_close()
+<
+		Return type: |Number|
 
 
 popup_create({what}, {options})				*popup_create()*
@@ -290,6 +298,8 @@
 
 		Can also be used as a |method|: >
 			GetText()->popup_create({})
+<
+		Return type: |Number|
 
 
 popup_dialog({what}, {options})				*popup_dialog()*
@@ -314,6 +324,8 @@
 
 		Can also be used as a |method|: >
 			GetText()->popup_dialog({})
+<
+		Return type: |Number|
 
 
 popup_filter_menu({id}, {key})				*popup_filter_menu()*
@@ -336,6 +348,8 @@
 		To add shortcut keys, see the example here:
 		|popup_menu-shortcut-example|
 
+		Return type: |Number|
+
 
 popup_filter_yesno({id}, {key})				*popup_filter_yesno()*
 		Filter that can be used for a popup. It handles only the keys
@@ -346,12 +360,16 @@
 		keys are ignored.
 		See the example here: |popup_dialog-example|
 
+		Return type: |Number|
+
 
 popup_findecho()					*popup_findecho()*
 		Get the |window-ID| for the popup that shows messages for the
 		`:echowindow` command.  Return zero if there is none.
 		Mainly useful to hide the popup.
 
+		Return type: |Number|
+
 
 popup_findinfo()					*popup_findinfo()*
 		Get the |window-ID| for the popup info window, as it used by
@@ -361,11 +379,16 @@
 		the item in the popup menu.
 		Returns zero if there is none.
 
+		Return type: |Number|
+
 
 popup_findpreview()					*popup_findpreview()*
 		Get the |window-ID| for the popup preview window.
 		Return zero if there is none.
 
+		Return type: |Number|
+
+
 popup_getoptions({id})					*popup_getoptions()*
 		Return the {options} for popup {id} in a Dict.
 		A zero value means the option was not set.  For "zindex" the
@@ -399,6 +422,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_getoptions()
+<
+		Return type: dict<any>
 
 
 popup_getpos({id})					*popup_getpos()*
@@ -428,6 +453,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_getpos()
+<
+		Return type: dict<number> or dict<any>
 
 
 popup_hide({id})						*popup_hide()*
@@ -440,11 +467,15 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_hide()
+<
+		Return type: |Number|
 
 
 popup_list()						 *popup_list()*
 		Return a List with the |window-ID| of all existing popups.
 
+		Return type: list<number> or list<any>
+
 
 popup_locate({row}, {col})				 *popup_locate()*
 		Return the |window-ID| of the popup at screen position {row}
@@ -452,6 +483,8 @@
 		highest zindex is returned.  If there are no popups at this
 		position then zero is returned.
 
+		Return type: |Number|
+
 
 popup_menu({what}, {options})				 *popup_menu()*
 		Show the {what} near the cursor, handle selecting one of the
@@ -484,6 +517,8 @@
 
 <		Can also be used as a |method|: >
 			GetChoices()->popup_menu({})
+<
+		Return type: |Number|
 
 
 popup_move({id}, {options})					*popup_move()*
@@ -503,6 +538,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_move(options)
+<
+		Return type: |Number|
 
 
 popup_notification({what}, {options})			 *popup_notification()*
@@ -533,6 +570,8 @@
 
 		Can also be used as a |method|: >
 			GetText()->popup_notification({})
+<
+		Return type: |Number|
 
 
 popup_setoptions({id}, {options})			*popup_setoptions()*
@@ -569,6 +608,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_setoptions(options)
+<
+		Return type: |Number|
 
 
 popup_settext({id}, {text})				*popup_settext()*
@@ -580,6 +621,8 @@
 
 		Can also be used as a |method|: >
 			GetPopup()->popup_settext('hello')
+<
+		Return type: |Number|
 
 
 popup_show({id})						*popup_show()*
@@ -588,6 +631,8 @@
 		If {id} is the info popup it will be positioned next to the
 		current popup menu item.
 
+		Return type: |Number|
+
 
 ==============================================================================
 3. Usage						*popup-usage*
