diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -118,10 +118,12 @@ /// Ident_super - IdentifierInfo for "super", to support fast /// comparison. IdentifierInfo *Ident_super; - /// Ident_vector, Ident_bool - cached IdentifierInfos for "vector" and - /// "bool" fast comparison. Only present if AltiVec or ZVector are enabled. + /// Ident_vector, Ident_bool, Ident_Bool - cached IdentifierInfos for "vector" + /// and "bool" fast comparison. Only present if AltiVec or ZVector are + /// enabled. IdentifierInfo *Ident_vector; IdentifierInfo *Ident_bool; + IdentifierInfo *Ident_Bool; /// Ident_pixel - cached IdentifierInfos for "pixel" fast comparison. /// Only present if AltiVec enabled. IdentifierInfo *Ident_pixel; @@ -879,6 +881,7 @@ if (Tok.getIdentifierInfo() != Ident_vector && Tok.getIdentifierInfo() != Ident_bool && + Tok.getIdentifierInfo() != Ident_Bool && (!getLangOpts().AltiVec || Tok.getIdentifierInfo() != Ident_pixel)) return false; diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -7334,6 +7334,7 @@ case tok::kw_float: case tok::kw_double: case tok::kw_bool: + case tok::kw__Bool: case tok::kw___bool: case tok::kw___pixel: Tok.setKind(tok::kw___vector); @@ -7343,7 +7344,8 @@ Tok.setKind(tok::kw___vector); return true; } - if (Next.getIdentifierInfo() == Ident_bool) { + if (Next.getIdentifierInfo() == Ident_bool || + Next.getIdentifierInfo() == Ident_Bool) { Tok.setKind(tok::kw___vector); return true; } @@ -7368,6 +7370,7 @@ case tok::kw_float: case tok::kw_double: case tok::kw_bool: + case tok::kw__Bool: case tok::kw___bool: case tok::kw___pixel: isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID, Policy); @@ -7377,8 +7380,10 @@ isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID,Policy); return true; } - if (Next.getIdentifierInfo() == Ident_bool) { - isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID,Policy); + if (Next.getIdentifierInfo() == Ident_bool || + Next.getIdentifierInfo() == Ident_Bool) { + isInvalid = + DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID, Policy); return true; } break; diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -503,10 +503,12 @@ Ident_vector = nullptr; Ident_bool = nullptr; + Ident_Bool = nullptr; Ident_pixel = nullptr; if (getLangOpts().AltiVec || getLangOpts().ZVector) { Ident_vector = &PP.getIdentifierTable().get("vector"); Ident_bool = &PP.getIdentifierTable().get("bool"); + Ident_Bool = &PP.getIdentifierTable().get("_Bool"); } if (getLangOpts().AltiVec) Ident_pixel = &PP.getIdentifierTable().get("pixel"); diff --git a/clang/test/Parser/altivec-zvector-bool.c b/clang/test/Parser/altivec-zvector-bool.c new file mode 100644 --- /dev/null +++ b/clang/test/Parser/altivec-zvector-bool.c @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only %s +// RUN: %clang_cc1 -triple=powerpc64-ibm-aix-xcoff \ +// RUN: -target-feature +altivec -fsyntax-only %s +// RUN: %clang_cc1 -triple=powerpc-ibm-aix-xcoff \ +// RUN: -target-feature +altivec -fsyntax-only %s +// RUN: %clang_cc1 -triple=powerpc-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only %s +// RUN: %clang_cc1 -triple=s390x-linux-gnu -target-cpu arch11 \ +// RUN: -fzvector -fsyntax-only %s +// RUN: %clang_cc1 -triple=s390x-ibm-zos -target-cpu arch11 \ +// RUN: -fzvector -fsyntax-only %s + +__vector bool char bc; +__vector bool short bsh; +__vector bool short int bshi; +__vector bool int bi; +__vector _Bool char bc; +__vector _Bool short bsh; +__vector _Bool short int bshi; +__vector _Bool int bi;