[Parse] Parse '#pragma clang attribute' as an external-declaration
Previously, we parsed it only in the top level, which excludes namespaces and extern "C" blocks. rdar://problem/48818890 Differential revision: https://reviews.llvm.org/D59282 llvm-svn: 356075
This commit is contained in:
parent
bd1c56648f
commit
fcc53eedab
|
@ -583,10 +583,6 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
|
|||
ConsumeAnnotationToken();
|
||||
return false;
|
||||
|
||||
case tok::annot_pragma_attribute:
|
||||
HandlePragmaAttribute();
|
||||
return false;
|
||||
|
||||
case tok::eof:
|
||||
// Late template parsing can begin.
|
||||
if (getLangOpts().DelayedTemplateParsing)
|
||||
|
@ -698,6 +694,9 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
|
|||
case tok::annot_pragma_dump:
|
||||
HandlePragmaDump();
|
||||
return nullptr;
|
||||
case tok::annot_pragma_attribute:
|
||||
HandlePragmaAttribute();
|
||||
return nullptr;
|
||||
case tok::semi:
|
||||
// Either a C++11 empty-declaration or attribute-declaration.
|
||||
SingleDecl =
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
// RUN: %clang_cc1 -verify -std=c++11 %s
|
||||
// RUN: %clang_cc1 -xobjective-c++ -verify -std=c++11 %s
|
||||
|
||||
#define BEGIN_PRAGMA _Pragma("clang attribute push (__attribute__((availability(macos, introduced=1000))), apply_to=function)")
|
||||
#define END_PRAGMA _Pragma("clang attribute pop")
|
||||
|
||||
extern "C" {
|
||||
BEGIN_PRAGMA
|
||||
int f(); // expected-note{{'f' has been marked as being introduced in macOS 1000 here}}
|
||||
END_PRAGMA
|
||||
}
|
||||
|
||||
namespace my_ns {
|
||||
BEGIN_PRAGMA
|
||||
int g(); // expected-note{{'g' has been marked as being introduced in macOS 1000 here}}
|
||||
END_PRAGMA
|
||||
namespace nested {
|
||||
BEGIN_PRAGMA
|
||||
int h(); // expected-note{{'h' has been marked as being introduced in macOS 1000 here}}
|
||||
END_PRAGMA
|
||||
}
|
||||
}
|
||||
|
||||
int a = f(); // expected-warning{{'f' is only available on macOS 1000 or newer}} expected-note{{annotate 'a'}}
|
||||
int b = my_ns::g(); // expected-warning{{'g' is only available on macOS 1000 or newer}} expected-note{{annotate 'b'}}
|
||||
int c = my_ns::nested::h(); // expected-warning{{'h' is only available on macOS 1000 or newer}} expected-note{{annotate 'c'}}
|
||||
|
||||
struct InStruct {
|
||||
// FIXME: This asserts in Objective-C++!
|
||||
// FIXME: This is a horrible diagnostic!
|
||||
#ifndef __OBJC__
|
||||
BEGIN_PRAGMA // expected-error {{expected member name or ';' after declaration specifiers}}
|
||||
#endif
|
||||
};
|
Loading…
Reference in New Issue