Author: Zarko Todorovski Date: 2021-05-13T11:48:32-04:00 New Revision: 8fa168fc50ba4f63b79773c947ef5b3e43d5c02f
URL: https://github.com/llvm/llvm-project/commit/8fa168fc50ba4f63b79773c947ef5b3e43d5c02f DIFF: https://github.com/llvm/llvm-project/commit/8fa168fc50ba4f63b79773c947ef5b3e43d5c02f.diff LOG: Parse vector bool when stdbool.h and altivec.h are included Currently when including stdbool.h and altivec.h declaration of `vector bool` leads to errors due to `bool` being expanded to '_Bool`. This patch allows the parser to recognize `_Bool`. Reviewed By: hubert.reinterpretcast, Everybody0523 Differential Revision: https://reviews.llvm.org/D102064 Added: clang/test/Parser/altivec-zvector-bool.c Modified: clang/include/clang/Parse/Parser.h clang/lib/Parse/ParseDecl.cpp clang/lib/Parse/Parser.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index b5d6212e2dd41..213f7fb3dc56f 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -118,10 +118,12 @@ class Parser : public CodeCompletionHandler { /// 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 @@ class Parser : public CodeCompletionHandler { 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 index 928ef33bc9f20..fda427508c056 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -7334,6 +7334,7 @@ bool Parser::TryAltiVecVectorTokenOutOfLine() { 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 @@ bool Parser::TryAltiVecVectorTokenOutOfLine() { 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 @@ bool Parser::TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc, 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 @@ bool Parser::TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc, 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 index b178b56e967c6..1ae3ed4ff0d39 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -503,10 +503,12 @@ void Parser::Initialize() { 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 index 0000000000000..6765d26e2df48 --- /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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits