diff options
Diffstat (limited to 'clang/lib/Parse')
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index def039b98d6..76fca9e885f 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1111,14 +1111,15 @@ void Parser::ParseDeclarator(Declarator &D) { void Parser::ParseDeclaratorInternal(Declarator &D) { tok::TokenKind Kind = Tok.getKind(); - // Not a pointer or C++ reference. - if (Kind != tok::star && (Kind != tok::amp || !getLang().CPlusPlus)) + // Not a pointer, C++ reference, or block. + if (Kind != tok::star && (Kind != tok::amp || !getLang().CPlusPlus) && + (Kind != tok::caret || !getLang().Blocks)) return ParseDirectDeclarator(D); // Otherwise, '*' -> pointer or '&' -> reference. SourceLocation Loc = ConsumeToken(); // Eat the * or &. - if (Kind == tok::star) { + if (Kind == tok::star || Kind == tok::caret) { // Is a pointer. DeclSpec DS; @@ -1126,10 +1127,14 @@ void Parser::ParseDeclaratorInternal(Declarator &D) { // Recursively parse the declarator. ParseDeclaratorInternal(D); - - // Remember that we parsed a pointer type, and remember the type-quals. - D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc, - DS.TakeAttributes())); + if (Kind == tok::star) + // Remember that we parsed a pointer type, and remember the type-quals. + D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc, + DS.TakeAttributes())); + else + // Remember that we parsed a Block type, and remember the type-quals. + D.AddTypeInfo(DeclaratorChunk::getBlockPointer(DS.getTypeQualifiers(), + Loc)); } else { // Is a reference DeclSpec DS; |

