From: Fariborz Jahanian Date: Tue, 3 Jul 2012 23:22:13 +0000 (+0000) Subject: Obj-C++11 parser: handle a fall out of delayed X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b0ed95c27318730e265d84227a234e83e5e5523b;p=clang Obj-C++11 parser: handle a fall out of delayed c-function parsing when a declaration with C++0x braced-init-list is inside an @implementation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159693 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 21dd46f2e9..a96e29556b 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1614,7 +1614,7 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, /*DirectInit=*/true, TypeContainsAuto); } } else if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace) && - !CurParsedObjCImpl) { + (!CurParsedObjCImpl || !D.isFunctionDeclarator())) { // Parse C++0x braced-init-list. Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); diff --git a/test/SemaObjC/delay-parsing-cfunctions.m b/test/SemaObjC/delay-parsing-cfunctions.m index 840923ad6f..81734fdda4 100644 --- a/test/SemaObjC/delay-parsing-cfunctions.m +++ b/test/SemaObjC/delay-parsing-cfunctions.m @@ -1,6 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -Werror -verify -Wno-objc-root-class %s // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -Werror -verify -Wno-objc-root-class %s -// RUN: %clang_cc1 -x objective-c++ -std=c++11 -fsyntax-only -Werror -verify -Wno-objc-root-class %s // rdar://10387088 @interface MyClass diff --git a/test/SemaObjCXX/delay-parsing-cfunctions.mm b/test/SemaObjCXX/delay-parsing-cfunctions.mm new file mode 100644 index 0000000000..8e9c319a0e --- /dev/null +++ b/test/SemaObjCXX/delay-parsing-cfunctions.mm @@ -0,0 +1,43 @@ +// RUN: %clang_cc1 -x objective-c++ -std=c++11 -fsyntax-only -Werror -verify -Wno-objc-root-class %s +// rdar://10387088 + +struct X { +X(); +}; + +@interface MyClass +- (void)someMethod; +@end + +@implementation MyClass +- (void)someMethod { + [self privateMethod]; // clang already does not warn here +} + +int bar(MyClass * myObject) { + [myObject privateMethod]; + return gorfbar(myObject); +} +- (void)privateMethod { } + +int gorfbar(MyClass * myObject) { + [myObject privateMethod]; + [myObject privateMethod1]; + return getMe + bar(myObject); +} + +- (void)privateMethod1 { + getMe = getMe+1; +} + +static int getMe; + +static int test() { + return 0; +} + +int x{17}; + +X::X() = default; + +@end