On Fri, Oct 8, 2010 at 6:35 AM, David Kastrup <d...@gnu.org> wrote:
> Graham Percival <gra...@percival-music.ca> writes:
>> in that the macro might look like a single statement, but it gets
>> expanded into two.  (is it worth enclosing the non-else definition
>> with a { } to avoid this?)
>
> "{ ... }" is not sufficient since that already is a complete statement
> without adding a semicolon, unlike a function call.
>
> The wrapper needs to be "do { ... } while (0)".  It is an idiom that
> compilers optimize away.

Ok, how's this patch?

Cheers,
- Graham
From 15b45a0de620080a445727f9f29b40bd8286ca79 Mon Sep 17 00:00:00 2001
From: Graham Percival <gperc...@gperciva-desktop.(none)>
Date: Sat, 9 Oct 2010 18:47:22 +0100
Subject: [PATCH] Make ASSERT_LIVE_IS_ALLOWED() behave as a function

David Kastrup helpfully pointed out that this macro expanded into
multiple statements, whereas it looks like a function call.  For
example, something like this:
  if (condition) ASSERT_LIVE_IS_ALLOWED(); else
could fail quite badly.

The "do {...} while (0)" is an idiom that compilers optimize away,
but allows the macro to behave as a function.
---
 lily/include/smobs.hh |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/lily/include/smobs.hh b/lily/include/smobs.hh
index 999f6cf..1529505 100644
--- a/lily/include/smobs.hh
+++ b/lily/include/smobs.hh
@@ -156,13 +156,16 @@ extern bool parsed_objects_should_be_dead;
 
 #ifndef NDEBUG
 #define ASSERT_LIVE_IS_ALLOWED()     \
-  static bool passed_here_once;\
-  if (parsed_objects_should_be_dead && !passed_here_once) { \
-    ::programming_error (string ("Parsed object should be dead: ")  + __PRETTY_FUNCTION__ ); \
-    passed_here_once = true;\
-  }    
+  do { \
+    static bool passed_here_once;\
+    if (parsed_objects_should_be_dead && !passed_here_once) { \
+      ::programming_error (string ("Parsed object should be dead: ")  + __PRETTY_FUNCTION__ ); \
+      passed_here_once = true;\
+    } \
+  while (0)
 #else
-#define ASSERT_LIVE_IS_ALLOWED() {};
+#define ASSERT_LIVE_IS_ALLOWED() do { } \
+  while (0)
 #endif
 
 #endif /* SMOBS_HH */
-- 
1.6.0.4

_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to