diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Parse/ParseInit.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Parse/ParseInit.cpp | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/contrib/llvm-project/clang/lib/Parse/ParseInit.cpp b/contrib/llvm-project/clang/lib/Parse/ParseInit.cpp index 637f21176792..0a9a359cdaf9 100644 --- a/contrib/llvm-project/clang/lib/Parse/ParseInit.cpp +++ b/contrib/llvm-project/clang/lib/Parse/ParseInit.cpp @@ -18,6 +18,8 @@ #include "clang/Sema/EnterExpressionEvaluationContext.h" #include "clang/Sema/Ownership.h" #include "clang/Sema/Scope.h" +#include "clang/Sema/SemaCodeCompletion.h" +#include "clang/Sema/SemaObjC.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" using namespace clang; @@ -35,7 +37,7 @@ bool Parser::MayBeDesignationStart() { return true; case tok::l_square: { // designator: array-designator - if (!PP.getLangOpts().CPlusPlus11) + if (!PP.getLangOpts().CPlusPlus) return true; // C++11 lambda expressions and C99 designators can be ambiguous all the @@ -203,8 +205,9 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( if (Tok.is(tok::code_completion)) { cutOffParsing(); - Actions.CodeCompleteDesignator(DesignatorCompletion.PreferredBaseType, - DesignatorCompletion.InitExprs, Desig); + Actions.CodeCompletion().CodeCompleteDesignator( + DesignatorCompletion.PreferredBaseType, + DesignatorCompletion.InitExprs, Desig); return ExprError(); } if (Tok.isNot(tok::identifier)) { @@ -290,15 +293,15 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( // Three cases. This is a message send to a type: [type foo] // This is a message send to super: [super foo] // This is a message sent to an expr: [super.bar foo] - switch (Actions.getObjCMessageKind( + switch (Actions.ObjC().getObjCMessageKind( getCurScope(), II, IILoc, II == Ident_super, NextToken().is(tok::period), ReceiverType)) { - case Sema::ObjCSuperMessage: + case SemaObjC::ObjCSuperMessage: CheckArrayDesignatorSyntax(*this, StartLoc, Desig); return ParseAssignmentExprWithObjCMessageExprStart( StartLoc, ConsumeToken(), nullptr, nullptr); - case Sema::ObjCClassMessage: + case SemaObjC::ObjCClassMessage: CheckArrayDesignatorSyntax(*this, StartLoc, Desig); ConsumeToken(); // the identifier if (!ReceiverType) { @@ -326,7 +329,7 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( ReceiverType, nullptr); - case Sema::ObjCInstanceMessage: + case SemaObjC::ObjCInstanceMessage: // Fall through; we'll just parse the expression and // (possibly) treat this like an Objective-C message send // later. @@ -425,6 +428,34 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator( return ExprError(); } +ExprResult Parser::createEmbedExpr() { + assert(Tok.getKind() == tok::annot_embed); + EmbedAnnotationData *Data = + reinterpret_cast<EmbedAnnotationData *>(Tok.getAnnotationValue()); + ExprResult Res; + ASTContext &Context = Actions.getASTContext(); + SourceLocation StartLoc = ConsumeAnnotationToken(); + if (Data->BinaryData.size() == 1) { + Res = IntegerLiteral::Create(Context, + llvm::APInt(CHAR_BIT, Data->BinaryData.back()), + Context.UnsignedCharTy, StartLoc); + } else { + auto CreateStringLiteralFromStringRef = [&](StringRef Str, QualType Ty) { + llvm::APSInt ArraySize = + Context.MakeIntValue(Str.size(), Context.getSizeType()); + QualType ArrayTy = Context.getConstantArrayType( + Ty, ArraySize, nullptr, ArraySizeModifier::Normal, 0); + return StringLiteral::Create(Context, Str, StringLiteralKind::Ordinary, + false, ArrayTy, StartLoc); + }; + + StringLiteral *BinaryDataArg = CreateStringLiteralFromStringRef( + Data->BinaryData, Context.UnsignedCharTy); + Res = Actions.ActOnEmbedExpr(StartLoc, BinaryDataArg); + } + return Res; +} + /// ParseBraceInitializer - Called when parsing an initializer that has a /// leading open brace. /// @@ -470,7 +501,7 @@ ExprResult Parser::ParseBraceInitializer() { auto RunSignatureHelp = [&] { QualType PreferredType; if (!LikelyType.isNull()) - PreferredType = Actions.ProduceConstructorSignatureHelp( + PreferredType = Actions.CodeCompletion().ProduceConstructorSignatureHelp( LikelyType->getCanonicalTypeInternal(), T.getOpenLocation(), InitExprs, T.getOpenLocation(), /*Braced=*/true); CalledSignatureHelp = true; @@ -498,6 +529,8 @@ ExprResult Parser::ParseBraceInitializer() { ExprResult SubElt; if (MayBeDesignationStart()) SubElt = ParseInitializerWithPotentialDesignator(DesignatorCompletion); + else if (Tok.getKind() == tok::annot_embed) + SubElt = createEmbedExpr(); else SubElt = ParseInitializer(); |