This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make dNOOP usable outside function in C++
authorZefram <zefram@fysh.org>
Sat, 16 Dec 2017 22:46:33 +0000 (22:46 +0000)
committerZefram <zefram@fysh.org>
Sat, 16 Dec 2017 22:46:33 +0000 (22:46 +0000)
Commit 7db66e12883f0832ca80164b723768b848187bda changed dNOOP in C++ from
an external function declaration (which was running into inconsistent
linkage) to a no-op statement.  The no-op statement is only valid where
statements are valid, i.e., inside a function, so this doesn't actually
work everywhere that a declaration is expected.

Switch dNOOP to be an incomplete struct declaration, regardless of
language.  This can certainly be used both inside and outside functions,
is valid to repeat, and does not have the linkage problem of a function
declaration.  It should also be as unlikely to attract an "unused"
warning as an external function declaration.

perl.h

diff --git a/perl.h b/perl.h
index f5e284c..162bc6b 100644 (file)
--- a/perl.h
+++ b/perl.h
 #define CLANG_DIAG_RESTORE_STMT CLANG_DIAG_RESTORE NOOP
 
 #define NOOP /*EMPTY*/(void)0
-/* cea2e8a9dd23747f accidentally lost the comment originally from the first
-   check in of thread.h, explaining why we need dNOOP at all:  */
-/* Rats: if dTHR is just blank then the subsequent ";" throws an error */
-/* Declaring a *function*, instead of a variable, ensures that we don't rely
-   on being able to suppress "unused" warnings.  */
-#ifdef __cplusplus
-#define dNOOP (void)0
-#else
-#define dNOOP extern int Perl___notused(void)
-#endif
+#define dNOOP struct Perl___notused_struct
 
 #ifndef pTHX
 /* Don't bother defining tTHX ; using it outside