From 9bfebe32b07f8229a1fb96842d52ccc7397f62bf Mon Sep 17 00:00:00 2001 From: Renaud Durlin Date: Sat, 11 Jul 2015 23:13:04 +0200 Subject: [PATCH] Better handling of macros --- cpp/ast.py | 11 +++++++---- test/macro7.h | 7 +++++++ 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 test/macro7.h diff --git a/cpp/ast.py b/cpp/ast.py index 32d959e..f2a15b0 100644 --- a/cpp/ast.py +++ b/cpp/ast.py @@ -1062,14 +1062,17 @@ def _get_method(self, return_type_and_name, modifiers, templated_types, modifiers |= FUNCTION_THROW token = self._get_next_token() assert_parse(token.name == '(', token) - # Consume everything between the (parens). + # Consume everything between the parens. list(self._get_matching_char('(', ')')) token = self._get_next_token() elif token.name == token.name.upper(): - # HACK(nnorwitz): assume that all upper-case names - # are some macro we aren't expanding. + # Assume that all upper-case names are some macro. modifiers |= FUNCTION_UNKNOWN_ANNOTATION token = self._get_next_token() + if token.name == '(': + # Consume everything between the parens. + list(self._get_matching_char('(', ')')) + token = self._get_next_token() else: self._add_back_token(token) token = tokenize.Token(tokenize.SYNTAX, ';', 0, 0) @@ -1078,7 +1081,7 @@ def _get_method(self, return_type_and_name, modifiers, templated_types, if token.name == '&' or token.name == '&&': token = self._get_next_token() - if token.name == '}' or token.name == '#endif': + if token.name == '}' or token.token_type == tokenize.PREPROCESSOR: self._add_back_token(token) token = tokenize.Token(tokenize.SYNTAX, ';', 0, 0) diff --git a/test/macro7.h b/test/macro7.h new file mode 100644 index 0000000..f62ada0 --- /dev/null +++ b/test/macro7.h @@ -0,0 +1,7 @@ +struct VariadicFunction { + LLVM_DEFINE_OVERLOAD(1) +#undef LLVM_DEFINE_OVERLOAD +}; + +#define MY_THROW() throw () +void Foo() MY_THROW() {}