[clang] Support `guarded_by` attribute and related attributes inside C structs and support late parsing them (PR #95455)

Henrik G. Olsson via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 13 21:14:12 PDT 2024


================
@@ -3330,6 +3340,118 @@ void Parser::DistributeCLateParsedAttrs(Decl *Dcl,
   }
 }
 
+/// GuardedBy attributes (e.g., guarded_by):
+///   AttrName '(' expression ')'
+void Parser::ParseGuardedByAttribute(
+    IdentifierInfo &AttrName, SourceLocation AttrNameLoc,
+    ParsedAttributes &Attrs, IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
+    SourceLocation *EndLoc, ParsedAttr::Form Form) {
+  assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
+
+  BalancedDelimiterTracker Parens(*this, tok::l_paren);
+  Parens.consumeOpen();
+
+  if (Tok.is(tok::r_paren)) {
+    Diag(Tok.getLocation(), diag::err_argument_required_after_attribute);
+    Parens.consumeClose();
+    return;
+  }
+
+  ArgsVector ArgExprs;
+  // Don't evaluate argument when the attribute is ignored.
+  using ExpressionKind =
+      Sema::ExpressionEvaluationContextRecord::ExpressionKind;
+  EnterExpressionEvaluationContext EC(
+      Actions,
+      getLangOpts().CPlusPlus
+          ? Sema::ExpressionEvaluationContext::Unevaluated
+          : Sema::ExpressionEvaluationContext::PotentiallyEvaluated,
----------------
hnrklssn wrote:

Why does C need to parse using `PotentiallyEvaluated` while C++ needs `Unevaluated`? What happens if we parse using `Unevaluted` in C?

https://github.com/llvm/llvm-project/pull/95455


More information about the cfe-commits mailing list