[PR41247] Fixed parsing of private keyword in C++.

Fixed bug in C++ to prevent parsing 'private' as a
valid address space qualifier.

Differential Revision: https://reviews.llvm.org/D59874

llvm-svn: 357162
This commit is contained in:
Anastasia Stulova 2019-03-28 11:47:14 +00:00
parent 38a0616c1d
commit 314fab6d7f
3 changed files with 27 additions and 3 deletions

View File

@ -4791,7 +4791,6 @@ bool Parser::isTypeSpecifierQualifier() {
case tok::kw___kindof:
case tok::kw_private:
case tok::kw___private:
case tok::kw___local:
case tok::kw___global:
@ -4800,9 +4799,11 @@ bool Parser::isTypeSpecifierQualifier() {
case tok::kw___read_only:
case tok::kw___read_write:
case tok::kw___write_only:
return true;
case tok::kw_private:
return getLangOpts().OpenCL;
// C11 _Atomic
case tok::kw__Atomic:
return true;
@ -4982,7 +4983,6 @@ bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
case tok::kw___kindof:
case tok::kw_private:
case tok::kw___private:
case tok::kw___local:
case tok::kw___global:
@ -4995,6 +4995,9 @@ bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
#include "clang/Basic/OpenCLImageTypes.def"
return true;
case tok::kw_private:
return getLangOpts().OpenCL;
}
}
@ -5196,6 +5199,9 @@ void Parser::ParseTypeQualifierListOpt(
// OpenCL qualifiers:
case tok::kw_private:
if (!getLangOpts().OpenCL)
goto DoneWithTypeQuals;
LLVM_FALLTHROUGH;
case tok::kw___private:
case tok::kw___global:
case tok::kw___local:

View File

@ -1414,8 +1414,13 @@ Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult,
// cv-qualifier
case tok::kw_const:
case tok::kw_volatile:
return TPResult::True;
// OpenCL address space qualifiers
case tok::kw_private:
if (!getLangOpts().OpenCL)
return TPResult::False;
LLVM_FALLTHROUGH;
case tok::kw___private:
case tok::kw___local:
case tok::kw___global:

View File

@ -0,0 +1,13 @@
// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only
// Test that 'private' is not parsed as an address space qualifier
// in regular C++ mode.
struct B {
virtual ~B() // expected-error{{expected ';' at end of declaration list}}
private:
void foo();
private int* i; // expected-error{{expected ':'}}
};
void bar(private int*); //expected-error{{variable has incomplete type 'void'}} expected-error{{expected expression}}