23#include "llvm/ADT/ArrayRef.h"
24#include "llvm/ADT/StringExtras.h"
25#include "llvm/ADT/StringSet.h"
26#include "llvm/MC/MCParser/MCAsmParser.h"
34 Expr *ExprUnderCast =
nullptr;
38 ParentsToUpdate.push_back(Parent);
39 if (
auto *ParenE = dyn_cast<ParenExpr>(Parent)) {
40 Parent = ParenE->getSubExpr();
44 Expr *Child =
nullptr;
45 CastExpr *ParentCast = dyn_cast<CastExpr>(Parent);
51 if (
auto *CastE = dyn_cast<CastExpr>(Child))
52 if (CastE->getCastKind() == CK_LValueToRValue) {
53 ExprUnderCast = CastE->getSubExpr();
62 assert(ExprUnderCast &&
63 "Should be reachable only if LValueToRValue cast was found!");
65 for (
Expr *E : ParentsToUpdate)
111 for (
unsigned p = 0, e = AsmStrPieces.size(); p != e; ++p) {
128 if (!
Func->hasAttr<NakedAttr>())
132 WorkList.push_back(E);
133 while (WorkList.size()) {
134 Expr *E = WorkList.pop_back_val();
137 S.
Diag(
Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
142 S.
Diag(DRE->getBeginLoc(), diag::err_asm_naked_parm_ref);
143 S.
Diag(
Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
148 if (
Expr *E = dyn_cast_or_null<Expr>(Child))
149 WorkList.push_back(E);
159 bool is_input_expr) {
165 } EType = ExprSafeType;
170 EType = ExprBitfield;
172 EType = ExprVectorElt;
174 EType = ExprGlobalRegVar;
176 if (EType != ExprSafeType) {
177 S.
Diag(E->
getBeginLoc(), diag::err_asm_non_addr_value_in_memory_constraint)
193 const VarDecl *Variable = dyn_cast<VarDecl>(AsmDeclRef->getDecl());
194 if (Variable && Variable->getStorageClass() ==
SC_Register) {
195 if (AsmLabelAttr *
Attr = Variable->getAttr<AsmLabelAttr>())
196 if (
Target.isValidGCCRegisterName(
Attr->getLabel()))
197 return Target.getNormalizedGCCRegisterName(
Attr->getLabel(),
true);
208 Expr **Clobbers,
int NumClobbers,
unsigned NumLabels,
210 llvm::StringSet<> InOutVars;
213 for (
unsigned int i = 0; i < Exprs.size() - NumLabels; ++i) {
214 std::string Constraint =
216 StringRef InOutReg =
Target.getConstraintRegister(
219 InOutVars.insert(InOutReg);
223 for (
int i = 0; i < NumClobbers; ++i) {
224 std::string Clobber =
228 if (Clobber ==
"cc" || Clobber ==
"memory" || Clobber ==
"unwind")
230 Clobber =
Target.getNormalizedGCCRegisterName(Clobber,
true);
232 if (InOutVars.count(Clobber))
242 if (
auto *SL = dyn_cast<StringLiteral>(
Expr)) {
243 assert(SL->isOrdinary());
244 if (ForAsmLabel && SL->getString().empty()) {
246 << SL->getSourceRange();
259 if (ForAsmLabel &&
V.getArrayInitializedElts() == 0) {
270 bool IsVolatile,
unsigned NumOutputs,
276 unsigned NumClobbers = clobbers.size();
281 llvm::StringMap<bool> FeatureMap;
282 Context.getFunctionFeatureMap(FeatureMap, FD);
284 auto CreateGCCAsmStmt = [&] {
287 Names, constraints.data(), Exprs.data(), asmString,
288 NumClobbers, clobbers.data(), NumLabels, RParenLoc);
294 [](
Expr *E) { return E->getDependence() != ExprDependence::None; }) ||
295 llvm::any_of(clobbers, [](
Expr *E) {
296 return E->getDependence() != ExprDependence::None;
298 return CreateGCCAsmStmt();
300 for (
unsigned i = 0; i != NumOutputs; i++) {
301 Expr *Constraint = constraints[i];
302 StringRef OutputName;
304 OutputName = Names[i]->
getName();
306 std::string ConstraintStr =
309 if (ConstraintStr.find(
'\0') != std::string::npos) {
310 Diag(Constraint->
getBeginLoc(), diag::err_asm_constraint_embedded_null)
312 return CreateGCCAsmStmt();
316 if (!
Context.getTargetInfo().validateOutputConstraint(Info) &&
319 diag::err_asm_invalid_output_constraint)
321 return CreateGCCAsmStmt();
330 Expr *OutputExpr = Exprs[i];
349 OutputConstraintInfos.push_back(Info);
373 diag::err_dereference_incomplete_type))
378 diag::err_asm_invalid_lvalue_in_output)
383 if (!
Context.getTargetInfo().validateOutputSize(
389 return CreateGCCAsmStmt();
395 for (
unsigned i = NumOutputs, e = NumOutputs + NumInputs; i != e; i++) {
396 Expr *Constraint = constraints[i];
400 InputName = Names[i]->
getName();
402 std::string ConstraintStr =
405 if (ConstraintStr.find(
'\0') != std::string::npos) {
406 Diag(Constraint->
getBeginLoc(), diag::err_asm_constraint_embedded_null)
408 return CreateGCCAsmStmt();
412 if (!
Context.getTargetInfo().validateInputConstraint(OutputConstraintInfos,
415 diag::err_asm_invalid_input_constraint)
417 return CreateGCCAsmStmt();
425 Expr *InputExpr = Exprs[i];
429 diag::err_asm_pmf_through_constraint_not_permitted)
445 diag::err_asm_invalid_lvalue_in_input)
453 InputExpr = Exprs[i] =
Result.get();
461 llvm::APSInt IntResult;
467 diag::err_invalid_asm_value_for_constraint)
490 InputConstraintInfos.push_back(Info);
492 const Type *Ty = Exprs[i]->getType().getTypePtr();
498 diag::err_dereference_incomplete_type))
501 unsigned Size =
Context.getTypeSize(Ty);
502 if (!
Context.getTargetInfo().validateInputSize(FeatureMap, ConstraintStr,
505 diag::err_asm_invalid_input_size)
509 std::optional<SourceLocation> UnwindClobberLoc;
512 for (
unsigned i = 0; i != NumClobbers; i++) {
513 Expr *ClobberExpr = clobbers[i];
515 std::string Clobber =
518 if (Clobber.find(
'\0') != std::string::npos) {
519 Diag(ClobberExpr->
getBeginLoc(), diag::err_asm_constraint_embedded_null)
521 return CreateGCCAsmStmt();
524 if (!
Context.getTargetInfo().isValidClobber(Clobber)) {
526 diag::err_asm_unknown_register_name)
529 Context, AsmLoc, IsSimple, IsVolatile, NumOutputs, NumInputs, Names,
530 constraints.data(), Exprs.data(), asmString, NumClobbers,
531 clobbers.data(), NumLabels, RParenLoc);
534 if (Clobber ==
"unwind") {
540 if (UnwindClobberLoc && NumLabels > 0) {
541 targetDiag(*UnwindClobberLoc, diag::err_asm_unwind_and_goto);
542 return CreateGCCAsmStmt();
549 auto GetLocation = [
this](
const Expr *Str,
unsigned Offset) {
550 if (
auto *SL = dyn_cast<StringLiteral>(Str))
557 if (
unsigned DiagID =
NS->AnalyzeAsmString(Pieces,
Context, DiagOffs)) {
558 targetDiag(GetLocation(asmString, DiagOffs), DiagID)
564 for (
unsigned i = 0, e = Pieces.size(); i != e; ++i) {
570 unsigned NumOperands =
NS->getNumOutputs() +
NS->getNumInputs();
572 if (
NS->isAsmGoto() && ConstraintIdx >= NumOperands)
576 if (ConstraintIdx >= NumOperands) {
577 unsigned I = 0, E =
NS->getNumOutputs();
579 for (
unsigned Cnt = ConstraintIdx - NumOperands; I != E; ++I)
580 if (OutputConstraintInfos[I].isReadWrite() && Cnt-- == 0) {
585 assert(I != E &&
"Invalid operand number should have been caught in "
586 " AnalyzeAsmString");
590 Expr *Constraint = constraints[ConstraintIdx];
591 const Type *Ty = Exprs[ConstraintIdx]->getType().getTypePtr();
595 unsigned Size =
Context.getTypeSize(Ty);
596 std::string SuggestedModifier;
597 if (!
Context.getTargetInfo().validateConstraintModifier(
600 targetDiag(Exprs[ConstraintIdx]->getBeginLoc(),
601 diag::warn_asm_mismatched_size_modifier);
603 if (!SuggestedModifier.empty()) {
605 diag::note_asm_missing_constraint_modifier)
606 << SuggestedModifier;
608 SuggestedModifier =
"%" + SuggestedModifier + Piece.
getString();
617 unsigned NumAlternatives = ~0
U;
618 for (
unsigned i = 0, e = OutputConstraintInfos.size(); i != e; ++i) {
621 unsigned AltCount = ConstraintStr.count(
',') + 1;
622 if (NumAlternatives == ~0
U) {
623 NumAlternatives = AltCount;
624 }
else if (NumAlternatives != AltCount) {
626 diag::err_asm_unexpected_constraint_alternatives)
627 << NumAlternatives << AltCount;
633 for (
unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {
636 unsigned AltCount = ConstraintStr.count(
',') + 1;
637 if (NumAlternatives == ~0
U) {
638 NumAlternatives = AltCount;
639 }
else if (NumAlternatives != AltCount) {
641 diag::err_asm_unexpected_constraint_alternatives)
642 << NumAlternatives << AltCount;
652 unsigned InputOpNo = i+NumOutputs;
653 Expr *OutputExpr = Exprs[TiedTo];
654 Expr *InputExpr = Exprs[InputOpNo];
657 assert(TiedTo < InputMatchedToOutput.size() &&
"TiedTo value out of range");
658 if (InputMatchedToOutput[TiedTo] != ~0
U) {
660 diag::err_asm_input_duplicate_match)
662 targetDiag(
NS->getInputExpr(InputMatchedToOutput[TiedTo])->getBeginLoc(),
663 diag::note_asm_input_duplicate_first)
667 InputMatchedToOutput[TiedTo] = i;
674 if (
Context.hasSameType(InTy, OutTy))
680 AD_Int, AD_FP, AD_Other
681 } InputDomain, OutputDomain;
684 InputDomain = AD_Int;
688 InputDomain = AD_Other;
691 OutputDomain = AD_Int;
693 OutputDomain = AD_FP;
695 OutputDomain = AD_Other;
703 uint64_t OutSize =
Context.getTypeSize(OutTy);
704 uint64_t InSize =
Context.getTypeSize(InTy);
705 if (OutSize == InSize && InputDomain == OutputDomain &&
706 InputDomain != AD_Other)
712 bool SmallerValueMentioned =
false;
720 SmallerValueMentioned |= InSize < OutSize;
725 SmallerValueMentioned |= OutSize < InSize;
730 bool FPTiedToInt = (InputDomain == AD_FP) ^ (OutputDomain == AD_FP);
735 if (!SmallerValueMentioned && !FPTiedToInt && InputDomain != AD_Other &&
736 OutputConstraintInfos[TiedTo].allowsRegister()) {
741 bool FitsInGeneralPurposeRegister =
742 OutSize <=
Context.getTargetInfo().getRegisterWidth() &&
743 !
Context.getIntTypeForBitwidth(OutSize,
false).isNull();
744 if (OutputDomain == AD_Other && !FitsInGeneralPurposeRegister) {
756 if (InputDomain == AD_Int && OutputDomain == AD_Int &&
760 (OutTy->
isBooleanType() ? CK_IntegralToBoolean : CK_IntegralCast);
762 Exprs[InputOpNo] = InputExpr;
763 NS->setInputExpr(i, InputExpr);
775 Exprs, constraints.data(), clobbers.data(), NumClobbers, NumLabels,
778 targetDiag(ConstraintLoc, diag::error_inoutput_conflict_with_clobber);
781 typedef std::pair<StringRef , Expr *> NamedOperand;
783 for (
unsigned i = 0, e = NumOutputs + NumInputs + NumLabels; i != e; ++i)
785 NamedOperandList.emplace_back(
786 std::make_pair(Names[i]->getName(), Exprs[i]));
788 llvm::stable_sort(NamedOperandList, llvm::less_first());
791 std::adjacent_find(begin(NamedOperandList), end(NamedOperandList),
792 [](
const NamedOperand &LHS,
const NamedOperand &RHS) {
793 return LHS.first == RHS.first;
795 if (
Found != NamedOperandList.end()) {
797 diag::error_duplicate_asm_operand_name)
798 << (
Found + 1)->first;
799 Diag(
Found->second->getBeginLoc(), diag::note_duplicate_asm_operand_name)
812 llvm::InlineAsmIdentifierInfo &Info) {
815 if (
T->isFunctionType() ||
T->isDependentType())
816 return Info.setLabel(Res);
819 if (
DeclRefExpr *DRE = dyn_cast<clang::DeclRefExpr>(Res))
820 if (DRE->getDecl()->getKind() == Decl::EnumConstant)
823 return Info.setEnum(Eval.
Val.
getInt().getSExtValue());
825 return Info.setLabel(Res);
827 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
828 unsigned Type = Size;
829 if (
const auto *ATy =
Context.getAsArrayType(
T))
830 Type =
Context.getTypeSizeInChars(ATy->getElementType()).getQuantity();
831 bool IsGlobalLV =
false;
834 Info.setVar(Res, IsGlobalLV, Size,
Type);
840 bool IsUnevaluatedContext) {
842 if (IsUnevaluatedContext)
853 if (IsUnevaluatedContext)
867 if (
T->isDependentType()) {
872 if (
T->isFunctionType()) {
888 Member.split(Members,
".");
895 FoundDecl = PT->getPointeeType()->getAsTagDecl();
906 for (StringRef NextMember : Members) {
907 const RecordType *RT =
nullptr;
908 if (
VarDecl *VD = dyn_cast<VarDecl>(FoundDecl))
909 RT = VD->getType()->getAsCanonical<RecordType>();
913 QualType QT = TD->getUnderlyingType();
917 }
else if (
TypeDecl *TD = dyn_cast<TypeDecl>(FoundDecl))
920 else if (
FieldDecl *TD = dyn_cast<FieldDecl>(FoundDecl))
921 RT = TD->getType()->getAsCanonical<RecordType>();
926 diag::err_asm_incomplete_type))
941 FieldDecl *FD = dyn_cast<FieldDecl>(FoundDecl);
959 if (
T->isDependentType()) {
966 nullptr, NameInfo,
nullptr);
969 auto *RD =
T->getAsRecordDecl();
983 FD = dyn_cast<IndirectFieldDecl>(FieldResult.
getFoundDecl());
998 unsigned NumOutputs,
unsigned NumInputs,
1003 bool IsSimple = (NumOutputs != 0 || NumInputs != 0);
1006 bool InvalidOperand =
false;
1007 for (uint64_t I = 0; I < NumOutputs + NumInputs; ++I) {
1010 InvalidOperand =
true;
1012 << E->
getType() << (I < NumOutputs)
1015 InvalidOperand =
true;
1027 true, AsmToks, NumOutputs, NumInputs,
1028 Constraints, Exprs, AsmString,
1035 bool AlwaysCreate) {
1044 std::string InternalName;
1045 llvm::raw_string_ostream
OS(InternalName);
1051 OS <<
"__MSASMLABEL_.${:uid}__";
1052 for (
char C : ExternalLabelName) {
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Target Target
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static bool isOperandMentioned(unsigned OpNo, ArrayRef< GCCAsmStmt::AsmStringPiece > AsmStrPieces)
isOperandMentioned - Return true if the specified operand # is mentioned anywhere in the decomposed a...
static SourceLocation getClobberConflictLocation(MultiExprArg Exprs, Expr **Constraints, Expr **Clobbers, int NumClobbers, unsigned NumLabels, const TargetInfo &Target, ASTContext &Cont)
static bool CheckAsmLValue(Expr *E, Sema &S)
CheckAsmLValue - GNU C has an extremely ugly extension whereby they silently ignore "noop" casts in p...
static StringRef extractRegisterName(const Expr *Expression, const TargetInfo &Target)
static bool CheckNakedParmReference(Expr *E, Sema &S)
static bool checkExprMemoryConstraintCompat(Sema &S, Expr *E, TargetInfo::ConstraintInfo &Info, bool is_input_expr)
Returns true if given expression is not compatible with inline assembly's memory constraint; false ot...
static void removeLValueToRValueCast(Expr *E)
Remove the upper-level LValueToRValue cast from an expression.
static void emitAndFixInvalidAsmCastLValue(const Expr *LVal, Expr *BadArgument, Sema &S)
Emit a warning about usage of "noop"-like casts for lvalues (GNU extension) and fix the argument with...
Defines the clang::TypeLoc interface and its subclasses.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool toIntegralConstant(APSInt &Result, QualType SrcTy, const ASTContext &Ctx) const
Try to convert this value to an integral constant.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Attr - This represents one attribute.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a C++ nested-name-specifier or a global scope specifier.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
SourceLocation getBegin() const
CharUnits - This is an opaque type for sizes expressed in character units.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
void SetResult(APValue Value, const ASTContext &Context)
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
A reference to a declared variable, function, enum, etc.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
SourceLocation getLocation() const
void setLocation(SourceLocation L)
This represents one expression.
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, does not have an incomplet...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
ExprDependence getDependence() const
Represents a member of a struct/union/class.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Represents a function declaration or definition.
AsmStringPiece - this is part of a decomposed asm string specification (for use with the AnalyzeAsmSt...
const std::string & getString() const
unsigned getOperandNo() const
CharSourceRange getRange() const
char getModifier() const
getModifier - Get the modifier for this operand, if present.
This represents a GCC inline-assembly statement extension.
static std::string ExtractStringFromGCCAsmStmtComponent(const Expr *E)
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Represents the declaration of a label.
void setMSAsmLabel(StringRef Name)
void setMSAsmLabelResolved()
bool isMSAsmLabel() const
Represents the results of name lookup.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
This represents a Microsoft inline-assembly statement extension.
This represents a decl that may have a name.
A C++ nested-name-specifier augmented with source location information.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
Represents a struct/union/class.
RecordDecl * getDefinitionOrSelf() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Sema - This implements semantic analysis and AST building for C.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef< Token > AsmToks, StringRef AsmString, unsigned NumOutputs, unsigned NumInputs, ArrayRef< StringRef > Constraints, ArrayRef< StringRef > Clobbers, ArrayRef< Expr * > Exprs, SourceLocation EndLoc)
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
void setFunctionHasBranchIntoScope()
ExprResult LookupInlineAsmIdentifier(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool IsUnevaluatedContext)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
void PopExpressionEvaluationContext()
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
const LangOptions & getLangOpts() const
bool RequireCompleteExprType(Expr *E, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type of the given expression is complete.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
const LangOptions & LangOpts
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
DeclContext * getCurLexicalContext() const
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL, unsigned ByteNo) const
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void FillInlineAsmIdentifierInfo(Expr *Res, llvm::InlineAsmIdentifierInfo &Info)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc)
ExprResult LookupInlineAsmVarDeclField(Expr *RefExpr, StringRef Member, SourceLocation AsmLoc)
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation(), bool IsLabelStmt=false)
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
void setFunctionHasBranchProtectedScope()
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void DiscardCleanupsInEvaluationContext()
LabelDecl * GetOrCreateMSAsmLabel(StringRef ExternalLabelName, SourceLocation Location, bool AlwaysCreate)
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, Expr *AsmString, MultiExprArg Clobbers, unsigned NumLabels, SourceLocation RParenLoc)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Exposes information about the current target.
Represents a declaration of a type.
The base class of the type hierarchy.
bool isBooleanType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isMemberPointerType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Represents a C++ unqualified-id that has been parsed.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
MutableArrayRef< Expr * > MultiExprArg
@ Result
The result type of a method or function.
const FunctionProtoType * T
ActionResult< CXXBaseSpecifier * > BaseResult
CastKind
CastKind - The kind of operation required for a conversion.
ActionResult< Expr * > ExprResult
ActionResult< Stmt * > StmtResult
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool isGlobalLValue() const
Return true if the evaluated lvalue expression is global.
const std::string & getConstraintStr() const
unsigned getTiedOperand() const
bool allowsMemory() const
bool isValidAsmImmediate(const llvm::APInt &Value) const
bool requiresImmediateConstant() const
bool hasTiedOperand() const
Return true if this input operand is a matching constraint that ties it to an output operand.
bool allowsRegister() const