[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();
|
ConsumeAnnotationToken();
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
case tok::annot_pragma_attribute:
|
|
||||||
HandlePragmaAttribute();
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case tok::eof:
|
case tok::eof:
|
||||||
// Late template parsing can begin.
|
// Late template parsing can begin.
|
||||||
if (getLangOpts().DelayedTemplateParsing)
|
if (getLangOpts().DelayedTemplateParsing)
|
||||||
|
@ -698,6 +694,9 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
|
||||||
case tok::annot_pragma_dump:
|
case tok::annot_pragma_dump:
|
||||||
HandlePragmaDump();
|
HandlePragmaDump();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
case tok::annot_pragma_attribute:
|
||||||
|
HandlePragmaAttribute();
|
||||||
|
return nullptr;
|
||||||
case tok::semi:
|
case tok::semi:
|
||||||
// Either a C++11 empty-declaration or attribute-declaration.
|
// Either a C++11 empty-declaration or attribute-declaration.
|
||||||
SingleDecl =
|
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