//===--- ParseInit.cpp - Initializer Parsing ------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements initializer parsing as specified by C99 6.7.8. // //===----------------------------------------------------------------------===// #include "clang/Basic/TokenKinds.h" #include "clang/Parse/ParseDiagnostic.h" #include "clang/Parse/Parser.h" #include "clang/Parse/RAIIObjectsForParser.h" #include "clang/Sema/Designator.h" #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" usingnamespaceclang; /// MayBeDesignationStart - Return true if the current token might be the start /// of a designator. If we can tell it is impossible that it is a designator, /// return false. bool Parser::MayBeDesignationStart() { … } static void CheckArrayDesignatorSyntax(Parser &P, SourceLocation Loc, Designation &Desig) { … } /// ParseInitializerWithPotentialDesignator - Parse the 'initializer' production /// checking to see if the token stream starts with a designator. /// /// C99: /// /// designation: /// designator-list '=' /// [GNU] array-designator /// [GNU] identifier ':' /// /// designator-list: /// designator /// designator-list designator /// /// designator: /// array-designator /// '.' identifier /// /// array-designator: /// '[' constant-expression ']' /// [GNU] '[' constant-expression '...' constant-expression ']' /// /// C++20: /// /// designated-initializer-list: /// designated-initializer-clause /// designated-initializer-list ',' designated-initializer-clause /// /// designated-initializer-clause: /// designator brace-or-equal-initializer /// /// designator: /// '.' identifier /// /// We allow the C99 syntax extensions in C++20, but do not allow the C++20 /// extension (a braced-init-list after the designator with no '=') in C99. /// /// NOTE: [OBC] allows '[ objc-receiver objc-message-args ]' as an /// initializer (because it is an expression). We need to consider this case /// when parsing array designators. /// /// \p CodeCompleteCB is called with Designation parsed so far. ExprResult Parser::ParseInitializerWithPotentialDesignator( DesignatorCompletionInfo DesignatorCompletion) { … } ExprResult Parser::createEmbedExpr() { … } /// ParseBraceInitializer - Called when parsing an initializer that has a /// leading open brace. /// /// initializer: [C99 6.7.8] /// '{' initializer-list '}' /// '{' initializer-list ',' '}' /// [C23] '{' '}' /// /// initializer-list: /// designation[opt] initializer ...[opt] /// initializer-list ',' designation[opt] initializer ...[opt] /// ExprResult Parser::ParseBraceInitializer() { … } // Return true if a comma (or closing brace) is necessary after the // __if_exists/if_not_exists statement. bool Parser::ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs, bool &InitExprsOk) { … }