Bug Summary

File:clang/lib/Sema/SemaExpr.cpp
Warning:line 10229, column 46
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name SemaExpr.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -relaxed-aliasing -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/tools/clang/lib/Sema -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/tools/clang/lib/Sema -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/lib/Sema -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/include -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/include -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/include -D NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/tools/clang/lib/Sema -fdebug-prefix-map=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e=. -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2021-09-04-040900-46481-1 -x c++ /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/lib/Sema/SemaExpr.cpp

/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/lib/Sema/SemaExpr.cpp

1//===--- SemaExpr.cpp - Semantic Analysis for Expressions -----------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements semantic analysis for expressions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "TreeTransform.h"
14#include "UsedDeclVisitor.h"
15#include "clang/AST/ASTConsumer.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/AST/ASTLambda.h"
18#include "clang/AST/ASTMutationListener.h"
19#include "clang/AST/CXXInheritance.h"
20#include "clang/AST/DeclObjC.h"
21#include "clang/AST/DeclTemplate.h"
22#include "clang/AST/EvaluatedExprVisitor.h"
23#include "clang/AST/Expr.h"
24#include "clang/AST/ExprCXX.h"
25#include "clang/AST/ExprObjC.h"
26#include "clang/AST/ExprOpenMP.h"
27#include "clang/AST/OperationKinds.h"
28#include "clang/AST/RecursiveASTVisitor.h"
29#include "clang/AST/TypeLoc.h"
30#include "clang/Basic/Builtins.h"
31#include "clang/Basic/PartialDiagnostic.h"
32#include "clang/Basic/SourceManager.h"
33#include "clang/Basic/TargetInfo.h"
34#include "clang/Lex/LiteralSupport.h"
35#include "clang/Lex/Preprocessor.h"
36#include "clang/Sema/AnalysisBasedWarnings.h"
37#include "clang/Sema/DeclSpec.h"
38#include "clang/Sema/DelayedDiagnostic.h"
39#include "clang/Sema/Designator.h"
40#include "clang/Sema/Initialization.h"
41#include "clang/Sema/Lookup.h"
42#include "clang/Sema/Overload.h"
43#include "clang/Sema/ParsedTemplate.h"
44#include "clang/Sema/Scope.h"
45#include "clang/Sema/ScopeInfo.h"
46#include "clang/Sema/SemaFixItUtils.h"
47#include "clang/Sema/SemaInternal.h"
48#include "clang/Sema/Template.h"
49#include "llvm/ADT/STLExtras.h"
50#include "llvm/ADT/StringExtras.h"
51#include "llvm/Support/ConvertUTF.h"
52#include "llvm/Support/SaveAndRestore.h"
53
54using namespace clang;
55using namespace sema;
56using llvm::RoundingMode;
57
58/// Determine whether the use of this declaration is valid, without
59/// emitting diagnostics.
60bool Sema::CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid) {
61 // See if this is an auto-typed variable whose initializer we are parsing.
62 if (ParsingInitForAutoVars.count(D))
63 return false;
64
65 // See if this is a deleted function.
66 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
67 if (FD->isDeleted())
68 return false;
69
70 // If the function has a deduced return type, and we can't deduce it,
71 // then we can't use it either.
72 if (getLangOpts().CPlusPlus14 && FD->getReturnType()->isUndeducedType() &&
73 DeduceReturnType(FD, SourceLocation(), /*Diagnose*/ false))
74 return false;
75
76 // See if this is an aligned allocation/deallocation function that is
77 // unavailable.
78 if (TreatUnavailableAsInvalid &&
79 isUnavailableAlignedAllocationFunction(*FD))
80 return false;
81 }
82
83 // See if this function is unavailable.
84 if (TreatUnavailableAsInvalid && D->getAvailability() == AR_Unavailable &&
85 cast<Decl>(CurContext)->getAvailability() != AR_Unavailable)
86 return false;
87
88 if (isa<UnresolvedUsingIfExistsDecl>(D))
89 return false;
90
91 return true;
92}
93
94static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc) {
95 // Warn if this is used but marked unused.
96 if (const auto *A = D->getAttr<UnusedAttr>()) {
97 // [[maybe_unused]] should not diagnose uses, but __attribute__((unused))
98 // should diagnose them.
99 if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused &&
100 A->getSemanticSpelling() != UnusedAttr::C2x_maybe_unused) {
101 const Decl *DC = cast_or_null<Decl>(S.getCurObjCLexicalContext());
102 if (DC && !DC->hasAttr<UnusedAttr>())
103 S.Diag(Loc, diag::warn_used_but_marked_unused) << D;
104 }
105 }
106}
107
108/// Emit a note explaining that this function is deleted.
109void Sema::NoteDeletedFunction(FunctionDecl *Decl) {
110 assert(Decl && Decl->isDeleted())(static_cast<void> (0));
111
112 if (Decl->isDefaulted()) {
113 // If the method was explicitly defaulted, point at that declaration.
114 if (!Decl->isImplicit())
115 Diag(Decl->getLocation(), diag::note_implicitly_deleted);
116
117 // Try to diagnose why this special member function was implicitly
118 // deleted. This might fail, if that reason no longer applies.
119 DiagnoseDeletedDefaultedFunction(Decl);
120 return;
121 }
122
123 auto *Ctor = dyn_cast<CXXConstructorDecl>(Decl);
124 if (Ctor && Ctor->isInheritingConstructor())
125 return NoteDeletedInheritingConstructor(Ctor);
126
127 Diag(Decl->getLocation(), diag::note_availability_specified_here)
128 << Decl << 1;
129}
130
131/// Determine whether a FunctionDecl was ever declared with an
132/// explicit storage class.
133static bool hasAnyExplicitStorageClass(const FunctionDecl *D) {
134 for (auto I : D->redecls()) {
135 if (I->getStorageClass() != SC_None)
136 return true;
137 }
138 return false;
139}
140
141/// Check whether we're in an extern inline function and referring to a
142/// variable or function with internal linkage (C11 6.7.4p3).
143///
144/// This is only a warning because we used to silently accept this code, but
145/// in many cases it will not behave correctly. This is not enabled in C++ mode
146/// because the restriction language is a bit weaker (C++11 [basic.def.odr]p6)
147/// and so while there may still be user mistakes, most of the time we can't
148/// prove that there are errors.
149static void diagnoseUseOfInternalDeclInInlineFunction(Sema &S,
150 const NamedDecl *D,
151 SourceLocation Loc) {
152 // This is disabled under C++; there are too many ways for this to fire in
153 // contexts where the warning is a false positive, or where it is technically
154 // correct but benign.
155 if (S.getLangOpts().CPlusPlus)
156 return;
157
158 // Check if this is an inlined function or method.
159 FunctionDecl *Current = S.getCurFunctionDecl();
160 if (!Current)
161 return;
162 if (!Current->isInlined())
163 return;
164 if (!Current->isExternallyVisible())
165 return;
166
167 // Check if the decl has internal linkage.
168 if (D->getFormalLinkage() != InternalLinkage)
169 return;
170
171 // Downgrade from ExtWarn to Extension if
172 // (1) the supposedly external inline function is in the main file,
173 // and probably won't be included anywhere else.
174 // (2) the thing we're referencing is a pure function.
175 // (3) the thing we're referencing is another inline function.
176 // This last can give us false negatives, but it's better than warning on
177 // wrappers for simple C library functions.
178 const FunctionDecl *UsedFn = dyn_cast<FunctionDecl>(D);
179 bool DowngradeWarning = S.getSourceManager().isInMainFile(Loc);
180 if (!DowngradeWarning && UsedFn)
181 DowngradeWarning = UsedFn->isInlined() || UsedFn->hasAttr<ConstAttr>();
182
183 S.Diag(Loc, DowngradeWarning ? diag::ext_internal_in_extern_inline_quiet
184 : diag::ext_internal_in_extern_inline)
185 << /*IsVar=*/!UsedFn << D;
186
187 S.MaybeSuggestAddingStaticToDecl(Current);
188
189 S.Diag(D->getCanonicalDecl()->getLocation(), diag::note_entity_declared_at)
190 << D;
191}
192
193void Sema::MaybeSuggestAddingStaticToDecl(const FunctionDecl *Cur) {
194 const FunctionDecl *First = Cur->getFirstDecl();
195
196 // Suggest "static" on the function, if possible.
197 if (!hasAnyExplicitStorageClass(First)) {
198 SourceLocation DeclBegin = First->getSourceRange().getBegin();
199 Diag(DeclBegin, diag::note_convert_inline_to_static)
200 << Cur << FixItHint::CreateInsertion(DeclBegin, "static ");
201 }
202}
203
204/// Determine whether the use of this declaration is valid, and
205/// emit any corresponding diagnostics.
206///
207/// This routine diagnoses various problems with referencing
208/// declarations that can occur when using a declaration. For example,
209/// it might warn if a deprecated or unavailable declaration is being
210/// used, or produce an error (and return true) if a C++0x deleted
211/// function is being used.
212///
213/// \returns true if there was an error (this declaration cannot be
214/// referenced), false otherwise.
215///
216bool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs,
217 const ObjCInterfaceDecl *UnknownObjCClass,
218 bool ObjCPropertyAccess,
219 bool AvoidPartialAvailabilityChecks,
220 ObjCInterfaceDecl *ClassReceiver) {
221 SourceLocation Loc = Locs.front();
222 if (getLangOpts().CPlusPlus && isa<FunctionDecl>(D)) {
223 // If there were any diagnostics suppressed by template argument deduction,
224 // emit them now.
225 auto Pos = SuppressedDiagnostics.find(D->getCanonicalDecl());
226 if (Pos != SuppressedDiagnostics.end()) {
227 for (const PartialDiagnosticAt &Suppressed : Pos->second)
228 Diag(Suppressed.first, Suppressed.second);
229
230 // Clear out the list of suppressed diagnostics, so that we don't emit
231 // them again for this specialization. However, we don't obsolete this
232 // entry from the table, because we want to avoid ever emitting these
233 // diagnostics again.
234 Pos->second.clear();
235 }
236
237 // C++ [basic.start.main]p3:
238 // The function 'main' shall not be used within a program.
239 if (cast<FunctionDecl>(D)->isMain())
240 Diag(Loc, diag::ext_main_used);
241
242 diagnoseUnavailableAlignedAllocation(*cast<FunctionDecl>(D), Loc);
243 }
244
245 // See if this is an auto-typed variable whose initializer we are parsing.
246 if (ParsingInitForAutoVars.count(D)) {
247 if (isa<BindingDecl>(D)) {
248 Diag(Loc, diag::err_binding_cannot_appear_in_own_initializer)
249 << D->getDeclName();
250 } else {
251 Diag(Loc, diag::err_auto_variable_cannot_appear_in_own_initializer)
252 << D->getDeclName() << cast<VarDecl>(D)->getType();
253 }
254 return true;
255 }
256
257 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
258 // See if this is a deleted function.
259 if (FD->isDeleted()) {
260 auto *Ctor = dyn_cast<CXXConstructorDecl>(FD);
261 if (Ctor && Ctor->isInheritingConstructor())
262 Diag(Loc, diag::err_deleted_inherited_ctor_use)
263 << Ctor->getParent()
264 << Ctor->getInheritedConstructor().getConstructor()->getParent();
265 else
266 Diag(Loc, diag::err_deleted_function_use);
267 NoteDeletedFunction(FD);
268 return true;
269 }
270
271 // [expr.prim.id]p4
272 // A program that refers explicitly or implicitly to a function with a
273 // trailing requires-clause whose constraint-expression is not satisfied,
274 // other than to declare it, is ill-formed. [...]
275 //
276 // See if this is a function with constraints that need to be satisfied.
277 // Check this before deducing the return type, as it might instantiate the
278 // definition.
279 if (FD->getTrailingRequiresClause()) {
280 ConstraintSatisfaction Satisfaction;
281 if (CheckFunctionConstraints(FD, Satisfaction, Loc))
282 // A diagnostic will have already been generated (non-constant
283 // constraint expression, for example)
284 return true;
285 if (!Satisfaction.IsSatisfied) {
286 Diag(Loc,
287 diag::err_reference_to_function_with_unsatisfied_constraints)
288 << D;
289 DiagnoseUnsatisfiedConstraint(Satisfaction);
290 return true;
291 }
292 }
293
294 // If the function has a deduced return type, and we can't deduce it,
295 // then we can't use it either.
296 if (getLangOpts().CPlusPlus14 && FD->getReturnType()->isUndeducedType() &&
297 DeduceReturnType(FD, Loc))
298 return true;
299
300 if (getLangOpts().CUDA && !CheckCUDACall(Loc, FD))
301 return true;
302
303 if (getLangOpts().SYCLIsDevice && !checkSYCLDeviceFunction(Loc, FD))
304 return true;
305 }
306
307 if (auto *MD = dyn_cast<CXXMethodDecl>(D)) {
308 // Lambdas are only default-constructible or assignable in C++2a onwards.
309 if (MD->getParent()->isLambda() &&
310 ((isa<CXXConstructorDecl>(MD) &&
311 cast<CXXConstructorDecl>(MD)->isDefaultConstructor()) ||
312 MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {
313 Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign)
314 << !isa<CXXConstructorDecl>(MD);
315 }
316 }
317
318 auto getReferencedObjCProp = [](const NamedDecl *D) ->
319 const ObjCPropertyDecl * {
320 if (const auto *MD = dyn_cast<ObjCMethodDecl>(D))
321 return MD->findPropertyDecl();
322 return nullptr;
323 };
324 if (const ObjCPropertyDecl *ObjCPDecl = getReferencedObjCProp(D)) {
325 if (diagnoseArgIndependentDiagnoseIfAttrs(ObjCPDecl, Loc))
326 return true;
327 } else if (diagnoseArgIndependentDiagnoseIfAttrs(D, Loc)) {
328 return true;
329 }
330
331 // [OpenMP 4.0], 2.15 declare reduction Directive, Restrictions
332 // Only the variables omp_in and omp_out are allowed in the combiner.
333 // Only the variables omp_priv and omp_orig are allowed in the
334 // initializer-clause.
335 auto *DRD = dyn_cast<OMPDeclareReductionDecl>(CurContext);
336 if (LangOpts.OpenMP && DRD && !CurContext->containsDecl(D) &&
337 isa<VarDecl>(D)) {
338 Diag(Loc, diag::err_omp_wrong_var_in_declare_reduction)
339 << getCurFunction()->HasOMPDeclareReductionCombiner;
340 Diag(D->getLocation(), diag::note_entity_declared_at) << D;
341 return true;
342 }
343
344 // [OpenMP 5.0], 2.19.7.3. declare mapper Directive, Restrictions
345 // List-items in map clauses on this construct may only refer to the declared
346 // variable var and entities that could be referenced by a procedure defined
347 // at the same location
348 if (LangOpts.OpenMP && isa<VarDecl>(D) &&
349 !isOpenMPDeclareMapperVarDeclAllowed(cast<VarDecl>(D))) {
350 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
351 << getOpenMPDeclareMapperVarName();
352 Diag(D->getLocation(), diag::note_entity_declared_at) << D;
353 return true;
354 }
355
356 if (const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
357 Diag(Loc, diag::err_use_of_empty_using_if_exists);
358 Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
359 return true;
360 }
361
362 DiagnoseAvailabilityOfDecl(D, Locs, UnknownObjCClass, ObjCPropertyAccess,
363 AvoidPartialAvailabilityChecks, ClassReceiver);
364
365 DiagnoseUnusedOfDecl(*this, D, Loc);
366
367 diagnoseUseOfInternalDeclInInlineFunction(*this, D, Loc);
368
369 if (LangOpts.SYCLIsDevice || (LangOpts.OpenMP && LangOpts.OpenMPIsDevice)) {
370 if (auto *VD = dyn_cast<ValueDecl>(D))
371 checkDeviceDecl(VD, Loc);
372
373 if (!Context.getTargetInfo().isTLSSupported())
374 if (const auto *VD = dyn_cast<VarDecl>(D))
375 if (VD->getTLSKind() != VarDecl::TLS_None)
376 targetDiag(*Locs.begin(), diag::err_thread_unsupported);
377 }
378
379 if (isa<ParmVarDecl>(D) && isa<RequiresExprBodyDecl>(D->getDeclContext()) &&
380 !isUnevaluatedContext()) {
381 // C++ [expr.prim.req.nested] p3
382 // A local parameter shall only appear as an unevaluated operand
383 // (Clause 8) within the constraint-expression.
384 Diag(Loc, diag::err_requires_expr_parameter_referenced_in_evaluated_context)
385 << D;
386 Diag(D->getLocation(), diag::note_entity_declared_at) << D;
387 return true;
388 }
389
390 return false;
391}
392
393/// DiagnoseSentinelCalls - This routine checks whether a call or
394/// message-send is to a declaration with the sentinel attribute, and
395/// if so, it checks that the requirements of the sentinel are
396/// satisfied.
397void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
398 ArrayRef<Expr *> Args) {
399 const SentinelAttr *attr = D->getAttr<SentinelAttr>();
400 if (!attr)
401 return;
402
403 // The number of formal parameters of the declaration.
404 unsigned numFormalParams;
405
406 // The kind of declaration. This is also an index into a %select in
407 // the diagnostic.
408 enum CalleeType { CT_Function, CT_Method, CT_Block } calleeType;
409
410 if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
411 numFormalParams = MD->param_size();
412 calleeType = CT_Method;
413 } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
414 numFormalParams = FD->param_size();
415 calleeType = CT_Function;
416 } else if (isa<VarDecl>(D)) {
417 QualType type = cast<ValueDecl>(D)->getType();
418 const FunctionType *fn = nullptr;
419 if (const PointerType *ptr = type->getAs<PointerType>()) {
420 fn = ptr->getPointeeType()->getAs<FunctionType>();
421 if (!fn) return;
422 calleeType = CT_Function;
423 } else if (const BlockPointerType *ptr = type->getAs<BlockPointerType>()) {
424 fn = ptr->getPointeeType()->castAs<FunctionType>();
425 calleeType = CT_Block;
426 } else {
427 return;
428 }
429
430 if (const FunctionProtoType *proto = dyn_cast<FunctionProtoType>(fn)) {
431 numFormalParams = proto->getNumParams();
432 } else {
433 numFormalParams = 0;
434 }
435 } else {
436 return;
437 }
438
439 // "nullPos" is the number of formal parameters at the end which
440 // effectively count as part of the variadic arguments. This is
441 // useful if you would prefer to not have *any* formal parameters,
442 // but the language forces you to have at least one.
443 unsigned nullPos = attr->getNullPos();
444 assert((nullPos == 0 || nullPos == 1) && "invalid null position on sentinel")(static_cast<void> (0));
445 numFormalParams = (nullPos > numFormalParams ? 0 : numFormalParams - nullPos);
446
447 // The number of arguments which should follow the sentinel.
448 unsigned numArgsAfterSentinel = attr->getSentinel();
449
450 // If there aren't enough arguments for all the formal parameters,
451 // the sentinel, and the args after the sentinel, complain.
452 if (Args.size() < numFormalParams + numArgsAfterSentinel + 1) {
453 Diag(Loc, diag::warn_not_enough_argument) << D->getDeclName();
454 Diag(D->getLocation(), diag::note_sentinel_here) << int(calleeType);
455 return;
456 }
457
458 // Otherwise, find the sentinel expression.
459 Expr *sentinelExpr = Args[Args.size() - numArgsAfterSentinel - 1];
460 if (!sentinelExpr) return;
461 if (sentinelExpr->isValueDependent()) return;
462 if (Context.isSentinelNullExpr(sentinelExpr)) return;
463
464 // Pick a reasonable string to insert. Optimistically use 'nil', 'nullptr',
465 // or 'NULL' if those are actually defined in the context. Only use
466 // 'nil' for ObjC methods, where it's much more likely that the
467 // variadic arguments form a list of object pointers.
468 SourceLocation MissingNilLoc = getLocForEndOfToken(sentinelExpr->getEndLoc());
469 std::string NullValue;
470 if (calleeType == CT_Method && PP.isMacroDefined("nil"))
471 NullValue = "nil";
472 else if (getLangOpts().CPlusPlus11)
473 NullValue = "nullptr";
474 else if (PP.isMacroDefined("NULL"))
475 NullValue = "NULL";
476 else
477 NullValue = "(void*) 0";
478
479 if (MissingNilLoc.isInvalid())
480 Diag(Loc, diag::warn_missing_sentinel) << int(calleeType);
481 else
482 Diag(MissingNilLoc, diag::warn_missing_sentinel)
483 << int(calleeType)
484 << FixItHint::CreateInsertion(MissingNilLoc, ", " + NullValue);
485 Diag(D->getLocation(), diag::note_sentinel_here) << int(calleeType);
486}
487
488SourceRange Sema::getExprRange(Expr *E) const {
489 return E ? E->getSourceRange() : SourceRange();
490}
491
492//===----------------------------------------------------------------------===//
493// Standard Promotions and Conversions
494//===----------------------------------------------------------------------===//
495
496/// DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
497ExprResult Sema::DefaultFunctionArrayConversion(Expr *E, bool Diagnose) {
498 // Handle any placeholder expressions which made it here.
499 if (E->getType()->isPlaceholderType()) {
500 ExprResult result = CheckPlaceholderExpr(E);
501 if (result.isInvalid()) return ExprError();
502 E = result.get();
503 }
504
505 QualType Ty = E->getType();
506 assert(!Ty.isNull() && "DefaultFunctionArrayConversion - missing type")(static_cast<void> (0));
507
508 if (Ty->isFunctionType()) {
509 if (auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenCasts()))
510 if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
511 if (!checkAddressOfFunctionIsAvailable(FD, Diagnose, E->getExprLoc()))
512 return ExprError();
513
514 E = ImpCastExprToType(E, Context.getPointerType(Ty),
515 CK_FunctionToPointerDecay).get();
516 } else if (Ty->isArrayType()) {
517 // In C90 mode, arrays only promote to pointers if the array expression is
518 // an lvalue. The relevant legalese is C90 6.2.2.1p3: "an lvalue that has
519 // type 'array of type' is converted to an expression that has type 'pointer
520 // to type'...". In C99 this was changed to: C99 6.3.2.1p3: "an expression
521 // that has type 'array of type' ...". The relevant change is "an lvalue"
522 // (C90) to "an expression" (C99).
523 //
524 // C++ 4.2p1:
525 // An lvalue or rvalue of type "array of N T" or "array of unknown bound of
526 // T" can be converted to an rvalue of type "pointer to T".
527 //
528 if (getLangOpts().C99 || getLangOpts().CPlusPlus || E->isLValue()) {
529 ExprResult Res = ImpCastExprToType(E, Context.getArrayDecayedType(Ty),
530 CK_ArrayToPointerDecay);
531 if (Res.isInvalid())
532 return ExprError();
533 E = Res.get();
534 }
535 }
536 return E;
537}
538
539static void CheckForNullPointerDereference(Sema &S, Expr *E) {
540 // Check to see if we are dereferencing a null pointer. If so,
541 // and if not volatile-qualified, this is undefined behavior that the
542 // optimizer will delete, so warn about it. People sometimes try to use this
543 // to get a deterministic trap and are surprised by clang's behavior. This
544 // only handles the pattern "*null", which is a very syntactic check.
545 const auto *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts());
546 if (UO && UO->getOpcode() == UO_Deref &&
547 UO->getSubExpr()->getType()->isPointerType()) {
548 const LangAS AS =
549 UO->getSubExpr()->getType()->getPointeeType().getAddressSpace();
550 if ((!isTargetAddressSpace(AS) ||
551 (isTargetAddressSpace(AS) && toTargetAddressSpace(AS) == 0)) &&
552 UO->getSubExpr()->IgnoreParenCasts()->isNullPointerConstant(
553 S.Context, Expr::NPC_ValueDependentIsNotNull) &&
554 !UO->getType().isVolatileQualified()) {
555 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
556 S.PDiag(diag::warn_indirection_through_null)
557 << UO->getSubExpr()->getSourceRange());
558 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
559 S.PDiag(diag::note_indirection_through_null));
560 }
561 }
562}
563
564static void DiagnoseDirectIsaAccess(Sema &S, const ObjCIvarRefExpr *OIRE,
565 SourceLocation AssignLoc,
566 const Expr* RHS) {
567 const ObjCIvarDecl *IV = OIRE->getDecl();
568 if (!IV)
569 return;
570
571 DeclarationName MemberName = IV->getDeclName();
572 IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
573 if (!Member || !Member->isStr("isa"))
574 return;
575
576 const Expr *Base = OIRE->getBase();
577 QualType BaseType = Base->getType();
578 if (OIRE->isArrow())
579 BaseType = BaseType->getPointeeType();
580 if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>())
581 if (ObjCInterfaceDecl *IDecl = OTy->getInterface()) {
582 ObjCInterfaceDecl *ClassDeclared = nullptr;
583 ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared);
584 if (!ClassDeclared->getSuperClass()
585 && (*ClassDeclared->ivar_begin()) == IV) {
586 if (RHS) {
587 NamedDecl *ObjectSetClass =
588 S.LookupSingleName(S.TUScope,
589 &S.Context.Idents.get("object_setClass"),
590 SourceLocation(), S.LookupOrdinaryName);
591 if (ObjectSetClass) {
592 SourceLocation RHSLocEnd = S.getLocForEndOfToken(RHS->getEndLoc());
593 S.Diag(OIRE->getExprLoc(), diag::warn_objc_isa_assign)
594 << FixItHint::CreateInsertion(OIRE->getBeginLoc(),
595 "object_setClass(")
596 << FixItHint::CreateReplacement(
597 SourceRange(OIRE->getOpLoc(), AssignLoc), ",")
598 << FixItHint::CreateInsertion(RHSLocEnd, ")");
599 }
600 else
601 S.Diag(OIRE->getLocation(), diag::warn_objc_isa_assign);
602 } else {
603 NamedDecl *ObjectGetClass =
604 S.LookupSingleName(S.TUScope,
605 &S.Context.Idents.get("object_getClass"),
606 SourceLocation(), S.LookupOrdinaryName);
607 if (ObjectGetClass)
608 S.Diag(OIRE->getExprLoc(), diag::warn_objc_isa_use)
609 << FixItHint::CreateInsertion(OIRE->getBeginLoc(),
610 "object_getClass(")
611 << FixItHint::CreateReplacement(
612 SourceRange(OIRE->getOpLoc(), OIRE->getEndLoc()), ")");
613 else
614 S.Diag(OIRE->getLocation(), diag::warn_objc_isa_use);
615 }
616 S.Diag(IV->getLocation(), diag::note_ivar_decl);
617 }
618 }
619}
620
621ExprResult Sema::DefaultLvalueConversion(Expr *E) {
622 // Handle any placeholder expressions which made it here.
623 if (E->getType()->isPlaceholderType()) {
624 ExprResult result = CheckPlaceholderExpr(E);
625 if (result.isInvalid()) return ExprError();
626 E = result.get();
627 }
628
629 // C++ [conv.lval]p1:
630 // A glvalue of a non-function, non-array type T can be
631 // converted to a prvalue.
632 if (!E->isGLValue()) return E;
633
634 QualType T = E->getType();
635 assert(!T.isNull() && "r-value conversion on typeless expression?")(static_cast<void> (0));
636
637 // lvalue-to-rvalue conversion cannot be applied to function or array types.
638 if (T->isFunctionType() || T->isArrayType())
639 return E;
640
641 // We don't want to throw lvalue-to-rvalue casts on top of
642 // expressions of certain types in C++.
643 if (getLangOpts().CPlusPlus &&
644 (E->getType() == Context.OverloadTy ||
645 T->isDependentType() ||
646 T->isRecordType()))
647 return E;
648
649 // The C standard is actually really unclear on this point, and
650 // DR106 tells us what the result should be but not why. It's
651 // generally best to say that void types just doesn't undergo
652 // lvalue-to-rvalue at all. Note that expressions of unqualified
653 // 'void' type are never l-values, but qualified void can be.
654 if (T->isVoidType())
655 return E;
656
657 // OpenCL usually rejects direct accesses to values of 'half' type.
658 if (getLangOpts().OpenCL &&
659 !getOpenCLOptions().isAvailableOption("cl_khr_fp16", getLangOpts()) &&
660 T->isHalfType()) {
661 Diag(E->getExprLoc(), diag::err_opencl_half_load_store)
662 << 0 << T;
663 return ExprError();
664 }
665
666 CheckForNullPointerDereference(*this, E);
667 if (const ObjCIsaExpr *OISA = dyn_cast<ObjCIsaExpr>(E->IgnoreParenCasts())) {
668 NamedDecl *ObjectGetClass = LookupSingleName(TUScope,
669 &Context.Idents.get("object_getClass"),
670 SourceLocation(), LookupOrdinaryName);
671 if (ObjectGetClass)
672 Diag(E->getExprLoc(), diag::warn_objc_isa_use)
673 << FixItHint::CreateInsertion(OISA->getBeginLoc(), "object_getClass(")
674 << FixItHint::CreateReplacement(
675 SourceRange(OISA->getOpLoc(), OISA->getIsaMemberLoc()), ")");
676 else
677 Diag(E->getExprLoc(), diag::warn_objc_isa_use);
678 }
679 else if (const ObjCIvarRefExpr *OIRE =
680 dyn_cast<ObjCIvarRefExpr>(E->IgnoreParenCasts()))
681 DiagnoseDirectIsaAccess(*this, OIRE, SourceLocation(), /* Expr*/nullptr);
682
683 // C++ [conv.lval]p1:
684 // [...] If T is a non-class type, the type of the prvalue is the
685 // cv-unqualified version of T. Otherwise, the type of the
686 // rvalue is T.
687 //
688 // C99 6.3.2.1p2:
689 // If the lvalue has qualified type, the value has the unqualified
690 // version of the type of the lvalue; otherwise, the value has the
691 // type of the lvalue.
692 if (T.hasQualifiers())
693 T = T.getUnqualifiedType();
694
695 // Under the MS ABI, lock down the inheritance model now.
696 if (T->isMemberPointerType() &&
697 Context.getTargetInfo().getCXXABI().isMicrosoft())
698 (void)isCompleteType(E->getExprLoc(), T);
699
700 ExprResult Res = CheckLValueToRValueConversionOperand(E);
701 if (Res.isInvalid())
702 return Res;
703 E = Res.get();
704
705 // Loading a __weak object implicitly retains the value, so we need a cleanup to
706 // balance that.
707 if (E->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
708 Cleanup.setExprNeedsCleanups(true);
709
710 if (E->getType().isDestructedType() == QualType::DK_nontrivial_c_struct)
711 Cleanup.setExprNeedsCleanups(true);
712
713 // C++ [conv.lval]p3:
714 // If T is cv std::nullptr_t, the result is a null pointer constant.
715 CastKind CK = T->isNullPtrType() ? CK_NullToPointer : CK_LValueToRValue;
716 Res = ImplicitCastExpr::Create(Context, T, CK, E, nullptr, VK_PRValue,
717 CurFPFeatureOverrides());
718
719 // C11 6.3.2.1p2:
720 // ... if the lvalue has atomic type, the value has the non-atomic version
721 // of the type of the lvalue ...
722 if (const AtomicType *Atomic = T->getAs<AtomicType>()) {
723 T = Atomic->getValueType().getUnqualifiedType();
724 Res = ImplicitCastExpr::Create(Context, T, CK_AtomicToNonAtomic, Res.get(),
725 nullptr, VK_PRValue, FPOptionsOverride());
726 }
727
728 return Res;
729}
730
731ExprResult Sema::DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose) {
732 ExprResult Res = DefaultFunctionArrayConversion(E, Diagnose);
733 if (Res.isInvalid())
734 return ExprError();
735 Res = DefaultLvalueConversion(Res.get());
736 if (Res.isInvalid())
737 return ExprError();
738 return Res;
739}
740
741/// CallExprUnaryConversions - a special case of an unary conversion
742/// performed on a function designator of a call expression.
743ExprResult Sema::CallExprUnaryConversions(Expr *E) {
744 QualType Ty = E->getType();
745 ExprResult Res = E;
746 // Only do implicit cast for a function type, but not for a pointer
747 // to function type.
748 if (Ty->isFunctionType()) {
749 Res = ImpCastExprToType(E, Context.getPointerType(Ty),
750 CK_FunctionToPointerDecay);
751 if (Res.isInvalid())
752 return ExprError();
753 }
754 Res = DefaultLvalueConversion(Res.get());
755 if (Res.isInvalid())
756 return ExprError();
757 return Res.get();
758}
759
760/// UsualUnaryConversions - Performs various conversions that are common to most
761/// operators (C99 6.3). The conversions of array and function types are
762/// sometimes suppressed. For example, the array->pointer conversion doesn't
763/// apply if the array is an argument to the sizeof or address (&) operators.
764/// In these instances, this routine should *not* be called.
765ExprResult Sema::UsualUnaryConversions(Expr *E) {
766 // First, convert to an r-value.
767 ExprResult Res = DefaultFunctionArrayLvalueConversion(E);
768 if (Res.isInvalid())
769 return ExprError();
770 E = Res.get();
771
772 QualType Ty = E->getType();
773 assert(!Ty.isNull() && "UsualUnaryConversions - missing type")(static_cast<void> (0));
774
775 // Half FP have to be promoted to float unless it is natively supported
776 if (Ty->isHalfType() && !getLangOpts().NativeHalfType)
777 return ImpCastExprToType(Res.get(), Context.FloatTy, CK_FloatingCast);
778
779 // Try to perform integral promotions if the object has a theoretically
780 // promotable type.
781 if (Ty->isIntegralOrUnscopedEnumerationType()) {
782 // C99 6.3.1.1p2:
783 //
784 // The following may be used in an expression wherever an int or
785 // unsigned int may be used:
786 // - an object or expression with an integer type whose integer
787 // conversion rank is less than or equal to the rank of int
788 // and unsigned int.
789 // - A bit-field of type _Bool, int, signed int, or unsigned int.
790 //
791 // If an int can represent all values of the original type, the
792 // value is converted to an int; otherwise, it is converted to an
793 // unsigned int. These are called the integer promotions. All
794 // other types are unchanged by the integer promotions.
795
796 QualType PTy = Context.isPromotableBitField(E);
797 if (!PTy.isNull()) {
798 E = ImpCastExprToType(E, PTy, CK_IntegralCast).get();
799 return E;
800 }
801 if (Ty->isPromotableIntegerType()) {
802 QualType PT = Context.getPromotedIntegerType(Ty);
803 E = ImpCastExprToType(E, PT, CK_IntegralCast).get();
804 return E;
805 }
806 }
807 return E;
808}
809
810/// DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
811/// do not have a prototype. Arguments that have type float or __fp16
812/// are promoted to double. All other argument types are converted by
813/// UsualUnaryConversions().
814ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
815 QualType Ty = E->getType();
816 assert(!Ty.isNull() && "DefaultArgumentPromotion - missing type")(static_cast<void> (0));
817
818 ExprResult Res = UsualUnaryConversions(E);
819 if (Res.isInvalid())
820 return ExprError();
821 E = Res.get();
822
823 // If this is a 'float' or '__fp16' (CVR qualified or typedef)
824 // promote to double.
825 // Note that default argument promotion applies only to float (and
826 // half/fp16); it does not apply to _Float16.
827 const BuiltinType *BTy = Ty->getAs<BuiltinType>();
828 if (BTy && (BTy->getKind() == BuiltinType::Half ||
829 BTy->getKind() == BuiltinType::Float)) {
830 if (getLangOpts().OpenCL &&
831 !getOpenCLOptions().isAvailableOption("cl_khr_fp64", getLangOpts())) {
832 if (BTy->getKind() == BuiltinType::Half) {
833 E = ImpCastExprToType(E, Context.FloatTy, CK_FloatingCast).get();
834 }
835 } else {
836 E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).get();
837 }
838 }
839 if (BTy &&
840 getLangOpts().getExtendIntArgs() ==
841 LangOptions::ExtendArgsKind::ExtendTo64 &&
842 Context.getTargetInfo().supportsExtendIntArgs() && Ty->isIntegerType() &&
843 Context.getTypeSizeInChars(BTy) <
844 Context.getTypeSizeInChars(Context.LongLongTy)) {
845 E = (Ty->isUnsignedIntegerType())
846 ? ImpCastExprToType(E, Context.UnsignedLongLongTy, CK_IntegralCast)
847 .get()
848 : ImpCastExprToType(E, Context.LongLongTy, CK_IntegralCast).get();
849 assert(8 == Context.getTypeSizeInChars(Context.LongLongTy).getQuantity() &&(static_cast<void> (0))
850 "Unexpected typesize for LongLongTy")(static_cast<void> (0));
851 }
852
853 // C++ performs lvalue-to-rvalue conversion as a default argument
854 // promotion, even on class types, but note:
855 // C++11 [conv.lval]p2:
856 // When an lvalue-to-rvalue conversion occurs in an unevaluated
857 // operand or a subexpression thereof the value contained in the
858 // referenced object is not accessed. Otherwise, if the glvalue
859 // has a class type, the conversion copy-initializes a temporary
860 // of type T from the glvalue and the result of the conversion
861 // is a prvalue for the temporary.
862 // FIXME: add some way to gate this entire thing for correctness in
863 // potentially potentially evaluated contexts.
864 if (getLangOpts().CPlusPlus && E->isGLValue() && !isUnevaluatedContext()) {
865 ExprResult Temp = PerformCopyInitialization(
866 InitializedEntity::InitializeTemporary(E->getType()),
867 E->getExprLoc(), E);
868 if (Temp.isInvalid())
869 return ExprError();
870 E = Temp.get();
871 }
872
873 return E;
874}
875
876/// Determine the degree of POD-ness for an expression.
877/// Incomplete types are considered POD, since this check can be performed
878/// when we're in an unevaluated context.
879Sema::VarArgKind Sema::isValidVarArgType(const QualType &Ty) {
880 if (Ty->isIncompleteType()) {
881 // C++11 [expr.call]p7:
882 // After these conversions, if the argument does not have arithmetic,
883 // enumeration, pointer, pointer to member, or class type, the program
884 // is ill-formed.
885 //
886 // Since we've already performed array-to-pointer and function-to-pointer
887 // decay, the only such type in C++ is cv void. This also handles
888 // initializer lists as variadic arguments.
889 if (Ty->isVoidType())
890 return VAK_Invalid;
891
892 if (Ty->isObjCObjectType())
893 return VAK_Invalid;
894 return VAK_Valid;
895 }
896
897 if (Ty.isDestructedType() == QualType::DK_nontrivial_c_struct)
898 return VAK_Invalid;
899
900 if (Ty.isCXX98PODType(Context))
901 return VAK_Valid;
902
903 // C++11 [expr.call]p7:
904 // Passing a potentially-evaluated argument of class type (Clause 9)
905 // having a non-trivial copy constructor, a non-trivial move constructor,
906 // or a non-trivial destructor, with no corresponding parameter,
907 // is conditionally-supported with implementation-defined semantics.
908 if (getLangOpts().CPlusPlus11 && !Ty->isDependentType())
909 if (CXXRecordDecl *Record = Ty->getAsCXXRecordDecl())
910 if (!Record->hasNonTrivialCopyConstructor() &&
911 !Record->hasNonTrivialMoveConstructor() &&
912 !Record->hasNonTrivialDestructor())
913 return VAK_ValidInCXX11;
914
915 if (getLangOpts().ObjCAutoRefCount && Ty->isObjCLifetimeType())
916 return VAK_Valid;
917
918 if (Ty->isObjCObjectType())
919 return VAK_Invalid;
920
921 if (getLangOpts().MSVCCompat)
922 return VAK_MSVCUndefined;
923
924 // FIXME: In C++11, these cases are conditionally-supported, meaning we're
925 // permitted to reject them. We should consider doing so.
926 return VAK_Undefined;
927}
928
929void Sema::checkVariadicArgument(const Expr *E, VariadicCallType CT) {
930 // Don't allow one to pass an Objective-C interface to a vararg.
931 const QualType &Ty = E->getType();
932 VarArgKind VAK = isValidVarArgType(Ty);
933
934 // Complain about passing non-POD types through varargs.
935 switch (VAK) {
936 case VAK_ValidInCXX11:
937 DiagRuntimeBehavior(
938 E->getBeginLoc(), nullptr,
939 PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);
940 LLVM_FALLTHROUGH[[gnu::fallthrough]];
941 case VAK_Valid:
942 if (Ty->isRecordType()) {
943 // This is unlikely to be what the user intended. If the class has a
944 // 'c_str' member function, the user probably meant to call that.
945 DiagRuntimeBehavior(E->getBeginLoc(), nullptr,
946 PDiag(diag::warn_pass_class_arg_to_vararg)
947 << Ty << CT << hasCStrMethod(E) << ".c_str()");
948 }
949 break;
950
951 case VAK_Undefined:
952 case VAK_MSVCUndefined:
953 DiagRuntimeBehavior(E->getBeginLoc(), nullptr,
954 PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg)
955 << getLangOpts().CPlusPlus11 << Ty << CT);
956 break;
957
958 case VAK_Invalid:
959 if (Ty.isDestructedType() == QualType::DK_nontrivial_c_struct)
960 Diag(E->getBeginLoc(),
961 diag::err_cannot_pass_non_trivial_c_struct_to_vararg)
962 << Ty << CT;
963 else if (Ty->isObjCObjectType())
964 DiagRuntimeBehavior(E->getBeginLoc(), nullptr,
965 PDiag(diag::err_cannot_pass_objc_interface_to_vararg)
966 << Ty << CT);
967 else
968 Diag(E->getBeginLoc(), diag::err_cannot_pass_to_vararg)
969 << isa<InitListExpr>(E) << Ty << CT;
970 break;
971 }
972}
973
974/// DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
975/// will create a trap if the resulting type is not a POD type.
976ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
977 FunctionDecl *FDecl) {
978 if (const BuiltinType *PlaceholderTy = E->getType()->getAsPlaceholderType()) {
979 // Strip the unbridged-cast placeholder expression off, if applicable.
980 if (PlaceholderTy->getKind() == BuiltinType::ARCUnbridgedCast &&
981 (CT == VariadicMethod ||
982 (FDecl && FDecl->hasAttr<CFAuditedTransferAttr>()))) {
983 E = stripARCUnbridgedCast(E);
984
985 // Otherwise, do normal placeholder checking.
986 } else {
987 ExprResult ExprRes = CheckPlaceholderExpr(E);
988 if (ExprRes.isInvalid())
989 return ExprError();
990 E = ExprRes.get();
991 }
992 }
993
994 ExprResult ExprRes = DefaultArgumentPromotion(E);
995 if (ExprRes.isInvalid())
996 return ExprError();
997
998 // Copy blocks to the heap.
999 if (ExprRes.get()->getType()->isBlockPointerType())
1000 maybeExtendBlockObject(ExprRes);
1001
1002 E = ExprRes.get();
1003
1004 // Diagnostics regarding non-POD argument types are
1005 // emitted along with format string checking in Sema::CheckFunctionCall().
1006 if (isValidVarArgType(E->getType()) == VAK_Undefined) {
1007 // Turn this into a trap.
1008 CXXScopeSpec SS;
1009 SourceLocation TemplateKWLoc;
1010 UnqualifiedId Name;
1011 Name.setIdentifier(PP.getIdentifierInfo("__builtin_trap"),
1012 E->getBeginLoc());
1013 ExprResult TrapFn = ActOnIdExpression(TUScope, SS, TemplateKWLoc, Name,
1014 /*HasTrailingLParen=*/true,
1015 /*IsAddressOfOperand=*/false);
1016 if (TrapFn.isInvalid())
1017 return ExprError();
1018
1019 ExprResult Call = BuildCallExpr(TUScope, TrapFn.get(), E->getBeginLoc(),
1020 None, E->getEndLoc());
1021 if (Call.isInvalid())
1022 return ExprError();
1023
1024 ExprResult Comma =
1025 ActOnBinOp(TUScope, E->getBeginLoc(), tok::comma, Call.get(), E);
1026 if (Comma.isInvalid())
1027 return ExprError();
1028 return Comma.get();
1029 }
1030
1031 if (!getLangOpts().CPlusPlus &&
1032 RequireCompleteType(E->getExprLoc(), E->getType(),
1033 diag::err_call_incomplete_argument))
1034 return ExprError();
1035
1036 return E;
1037}
1038
1039/// Converts an integer to complex float type. Helper function of
1040/// UsualArithmeticConversions()
1041///
1042/// \return false if the integer expression is an integer type and is
1043/// successfully converted to the complex type.
1044static bool handleIntegerToComplexFloatConversion(Sema &S, ExprResult &IntExpr,
1045 ExprResult &ComplexExpr,
1046 QualType IntTy,
1047 QualType ComplexTy,
1048 bool SkipCast) {
1049 if (IntTy->isComplexType() || IntTy->isRealFloatingType()) return true;
1050 if (SkipCast) return false;
1051 if (IntTy->isIntegerType()) {
1052 QualType fpTy = cast<ComplexType>(ComplexTy)->getElementType();
1053 IntExpr = S.ImpCastExprToType(IntExpr.get(), fpTy, CK_IntegralToFloating);
1054 IntExpr = S.ImpCastExprToType(IntExpr.get(), ComplexTy,
1055 CK_FloatingRealToComplex);
1056 } else {
1057 assert(IntTy->isComplexIntegerType())(static_cast<void> (0));
1058 IntExpr = S.ImpCastExprToType(IntExpr.get(), ComplexTy,
1059 CK_IntegralComplexToFloatingComplex);
1060 }
1061 return false;
1062}
1063
1064/// Handle arithmetic conversion with complex types. Helper function of
1065/// UsualArithmeticConversions()
1066static QualType handleComplexFloatConversion(Sema &S, ExprResult &LHS,
1067 ExprResult &RHS, QualType LHSType,
1068 QualType RHSType,
1069 bool IsCompAssign) {
1070 // if we have an integer operand, the result is the complex type.
1071 if (!handleIntegerToComplexFloatConversion(S, RHS, LHS, RHSType, LHSType,
1072 /*skipCast*/false))
1073 return LHSType;
1074 if (!handleIntegerToComplexFloatConversion(S, LHS, RHS, LHSType, RHSType,
1075 /*skipCast*/IsCompAssign))
1076 return RHSType;
1077
1078 // This handles complex/complex, complex/float, or float/complex.
1079 // When both operands are complex, the shorter operand is converted to the
1080 // type of the longer, and that is the type of the result. This corresponds
1081 // to what is done when combining two real floating-point operands.
1082 // The fun begins when size promotion occur across type domains.
1083 // From H&S 6.3.4: When one operand is complex and the other is a real
1084 // floating-point type, the less precise type is converted, within it's
1085 // real or complex domain, to the precision of the other type. For example,
1086 // when combining a "long double" with a "double _Complex", the
1087 // "double _Complex" is promoted to "long double _Complex".
1088
1089 // Compute the rank of the two types, regardless of whether they are complex.
1090 int Order = S.Context.getFloatingTypeOrder(LHSType, RHSType);
1091
1092 auto *LHSComplexType = dyn_cast<ComplexType>(LHSType);
1093 auto *RHSComplexType = dyn_cast<ComplexType>(RHSType);
1094 QualType LHSElementType =
1095 LHSComplexType ? LHSComplexType->getElementType() : LHSType;
1096 QualType RHSElementType =
1097 RHSComplexType ? RHSComplexType->getElementType() : RHSType;
1098
1099 QualType ResultType = S.Context.getComplexType(LHSElementType);
1100 if (Order < 0) {
1101 // Promote the precision of the LHS if not an assignment.
1102 ResultType = S.Context.getComplexType(RHSElementType);
1103 if (!IsCompAssign) {
1104 if (LHSComplexType)
1105 LHS =
1106 S.ImpCastExprToType(LHS.get(), ResultType, CK_FloatingComplexCast);
1107 else
1108 LHS = S.ImpCastExprToType(LHS.get(), RHSElementType, CK_FloatingCast);
1109 }
1110 } else if (Order > 0) {
1111 // Promote the precision of the RHS.
1112 if (RHSComplexType)
1113 RHS = S.ImpCastExprToType(RHS.get(), ResultType, CK_FloatingComplexCast);
1114 else
1115 RHS = S.ImpCastExprToType(RHS.get(), LHSElementType, CK_FloatingCast);
1116 }
1117 return ResultType;
1118}
1119
1120/// Handle arithmetic conversion from integer to float. Helper function
1121/// of UsualArithmeticConversions()
1122static QualType handleIntToFloatConversion(Sema &S, ExprResult &FloatExpr,
1123 ExprResult &IntExpr,
1124 QualType FloatTy, QualType IntTy,
1125 bool ConvertFloat, bool ConvertInt) {
1126 if (IntTy->isIntegerType()) {
1127 if (ConvertInt)
1128 // Convert intExpr to the lhs floating point type.
1129 IntExpr = S.ImpCastExprToType(IntExpr.get(), FloatTy,
1130 CK_IntegralToFloating);
1131 return FloatTy;
1132 }
1133
1134 // Convert both sides to the appropriate complex float.
1135 assert(IntTy->isComplexIntegerType())(static_cast<void> (0));
1136 QualType result = S.Context.getComplexType(FloatTy);
1137
1138 // _Complex int -> _Complex float
1139 if (ConvertInt)
1140 IntExpr = S.ImpCastExprToType(IntExpr.get(), result,
1141 CK_IntegralComplexToFloatingComplex);
1142
1143 // float -> _Complex float
1144 if (ConvertFloat)
1145 FloatExpr = S.ImpCastExprToType(FloatExpr.get(), result,
1146 CK_FloatingRealToComplex);
1147
1148 return result;
1149}
1150
1151/// Handle arithmethic conversion with floating point types. Helper
1152/// function of UsualArithmeticConversions()
1153static QualType handleFloatConversion(Sema &S, ExprResult &LHS,
1154 ExprResult &RHS, QualType LHSType,
1155 QualType RHSType, bool IsCompAssign) {
1156 bool LHSFloat = LHSType->isRealFloatingType();
1157 bool RHSFloat = RHSType->isRealFloatingType();
1158
1159 // N1169 4.1.4: If one of the operands has a floating type and the other
1160 // operand has a fixed-point type, the fixed-point operand
1161 // is converted to the floating type [...]
1162 if (LHSType->isFixedPointType() || RHSType->isFixedPointType()) {
1163 if (LHSFloat)
1164 RHS = S.ImpCastExprToType(RHS.get(), LHSType, CK_FixedPointToFloating);
1165 else if (!IsCompAssign)
1166 LHS = S.ImpCastExprToType(LHS.get(), RHSType, CK_FixedPointToFloating);
1167 return LHSFloat ? LHSType : RHSType;
1168 }
1169
1170 // If we have two real floating types, convert the smaller operand
1171 // to the bigger result.
1172 if (LHSFloat && RHSFloat) {
1173 int order = S.Context.getFloatingTypeOrder(LHSType, RHSType);
1174 if (order > 0) {
1175 RHS = S.ImpCastExprToType(RHS.get(), LHSType, CK_FloatingCast);
1176 return LHSType;
1177 }
1178
1179 assert(order < 0 && "illegal float comparison")(static_cast<void> (0));
1180 if (!IsCompAssign)
1181 LHS = S.ImpCastExprToType(LHS.get(), RHSType, CK_FloatingCast);
1182 return RHSType;
1183 }
1184
1185 if (LHSFloat) {
1186 // Half FP has to be promoted to float unless it is natively supported
1187 if (LHSType->isHalfType() && !S.getLangOpts().NativeHalfType)
1188 LHSType = S.Context.FloatTy;
1189
1190 return handleIntToFloatConversion(S, LHS, RHS, LHSType, RHSType,
1191 /*ConvertFloat=*/!IsCompAssign,
1192 /*ConvertInt=*/ true);
1193 }
1194 assert(RHSFloat)(static_cast<void> (0));
1195 return handleIntToFloatConversion(S, RHS, LHS, RHSType, LHSType,
1196 /*ConvertFloat=*/ true,
1197 /*ConvertInt=*/!IsCompAssign);
1198}
1199
1200/// Diagnose attempts to convert between __float128 and long double if
1201/// there is no support for such conversion. Helper function of
1202/// UsualArithmeticConversions().
1203static bool unsupportedTypeConversion(const Sema &S, QualType LHSType,
1204 QualType RHSType) {
1205 /* No issue converting if at least one of the types is not a floating point
1206 type or the two types have the same rank.
1207 */
1208 if (!LHSType->isFloatingType() || !RHSType->isFloatingType() ||
1209 S.Context.getFloatingTypeOrder(LHSType, RHSType) == 0)
1210 return false;
1211
1212 assert(LHSType->isFloatingType() && RHSType->isFloatingType() &&(static_cast<void> (0))
1213 "The remaining types must be floating point types.")(static_cast<void> (0));
1214
1215 auto *LHSComplex = LHSType->getAs<ComplexType>();
1216 auto *RHSComplex = RHSType->getAs<ComplexType>();
1217
1218 QualType LHSElemType = LHSComplex ?
1219 LHSComplex->getElementType() : LHSType;
1220 QualType RHSElemType = RHSComplex ?
1221 RHSComplex->getElementType() : RHSType;
1222
1223 // No issue if the two types have the same representation
1224 if (&S.Context.getFloatTypeSemantics(LHSElemType) ==
1225 &S.Context.getFloatTypeSemantics(RHSElemType))
1226 return false;
1227
1228 bool Float128AndLongDouble = (LHSElemType == S.Context.Float128Ty &&
1229 RHSElemType == S.Context.LongDoubleTy);
1230 Float128AndLongDouble |= (LHSElemType == S.Context.LongDoubleTy &&
1231 RHSElemType == S.Context.Float128Ty);
1232
1233 // We've handled the situation where __float128 and long double have the same
1234 // representation. We allow all conversions for all possible long double types
1235 // except PPC's double double.
1236 return Float128AndLongDouble &&
1237 (&S.Context.getFloatTypeSemantics(S.Context.LongDoubleTy) ==
1238 &llvm::APFloat::PPCDoubleDouble());
1239}
1240
1241typedef ExprResult PerformCastFn(Sema &S, Expr *operand, QualType toType);
1242
1243namespace {
1244/// These helper callbacks are placed in an anonymous namespace to
1245/// permit their use as function template parameters.
1246ExprResult doIntegralCast(Sema &S, Expr *op, QualType toType) {
1247 return S.ImpCastExprToType(op, toType, CK_IntegralCast);
1248}
1249
1250ExprResult doComplexIntegralCast(Sema &S, Expr *op, QualType toType) {
1251 return S.ImpCastExprToType(op, S.Context.getComplexType(toType),
1252 CK_IntegralComplexCast);
1253}
1254}
1255
1256/// Handle integer arithmetic conversions. Helper function of
1257/// UsualArithmeticConversions()
1258template <PerformCastFn doLHSCast, PerformCastFn doRHSCast>
1259static QualType handleIntegerConversion(Sema &S, ExprResult &LHS,
1260 ExprResult &RHS, QualType LHSType,
1261 QualType RHSType, bool IsCompAssign) {
1262 // The rules for this case are in C99 6.3.1.8
1263 int order = S.Context.getIntegerTypeOrder(LHSType, RHSType);
1264 bool LHSSigned = LHSType->hasSignedIntegerRepresentation();
1265 bool RHSSigned = RHSType->hasSignedIntegerRepresentation();
1266 if (LHSSigned == RHSSigned) {
1267 // Same signedness; use the higher-ranked type
1268 if (order >= 0) {
1269 RHS = (*doRHSCast)(S, RHS.get(), LHSType);
1270 return LHSType;
1271 } else if (!IsCompAssign)
1272 LHS = (*doLHSCast)(S, LHS.get(), RHSType);
1273 return RHSType;
1274 } else if (order != (LHSSigned ? 1 : -1)) {
1275 // The unsigned type has greater than or equal rank to the
1276 // signed type, so use the unsigned type
1277 if (RHSSigned) {
1278 RHS = (*doRHSCast)(S, RHS.get(), LHSType);
1279 return LHSType;
1280 } else if (!IsCompAssign)
1281 LHS = (*doLHSCast)(S, LHS.get(), RHSType);
1282 return RHSType;
1283 } else if (S.Context.getIntWidth(LHSType) != S.Context.getIntWidth(RHSType)) {
1284 // The two types are different widths; if we are here, that
1285 // means the signed type is larger than the unsigned type, so
1286 // use the signed type.
1287 if (LHSSigned) {
1288 RHS = (*doRHSCast)(S, RHS.get(), LHSType);
1289 return LHSType;
1290 } else if (!IsCompAssign)
1291 LHS = (*doLHSCast)(S, LHS.get(), RHSType);
1292 return RHSType;
1293 } else {
1294 // The signed type is higher-ranked than the unsigned type,
1295 // but isn't actually any bigger (like unsigned int and long
1296 // on most 32-bit systems). Use the unsigned type corresponding
1297 // to the signed type.
1298 QualType result =
1299 S.Context.getCorrespondingUnsignedType(LHSSigned ? LHSType : RHSType);
1300 RHS = (*doRHSCast)(S, RHS.get(), result);
1301 if (!IsCompAssign)
1302 LHS = (*doLHSCast)(S, LHS.get(), result);
1303 return result;
1304 }
1305}
1306
1307/// Handle conversions with GCC complex int extension. Helper function
1308/// of UsualArithmeticConversions()
1309static QualType handleComplexIntConversion(Sema &S, ExprResult &LHS,
1310 ExprResult &RHS, QualType LHSType,
1311 QualType RHSType,
1312 bool IsCompAssign) {
1313 const ComplexType *LHSComplexInt = LHSType->getAsComplexIntegerType();
1314 const ComplexType *RHSComplexInt = RHSType->getAsComplexIntegerType();
1315
1316 if (LHSComplexInt && RHSComplexInt) {
1317 QualType LHSEltType = LHSComplexInt->getElementType();
1318 QualType RHSEltType = RHSComplexInt->getElementType();
1319 QualType ScalarType =
1320 handleIntegerConversion<doComplexIntegralCast, doComplexIntegralCast>
1321 (S, LHS, RHS, LHSEltType, RHSEltType, IsCompAssign);
1322
1323 return S.Context.getComplexType(ScalarType);
1324 }
1325
1326 if (LHSComplexInt) {
1327 QualType LHSEltType = LHSComplexInt->getElementType();
1328 QualType ScalarType =
1329 handleIntegerConversion<doComplexIntegralCast, doIntegralCast>
1330 (S, LHS, RHS, LHSEltType, RHSType, IsCompAssign);
1331 QualType ComplexType = S.Context.getComplexType(ScalarType);
1332 RHS = S.ImpCastExprToType(RHS.get(), ComplexType,
1333 CK_IntegralRealToComplex);
1334
1335 return ComplexType;
1336 }
1337
1338 assert(RHSComplexInt)(static_cast<void> (0));
1339
1340 QualType RHSEltType = RHSComplexInt->getElementType();
1341 QualType ScalarType =
1342 handleIntegerConversion<doIntegralCast, doComplexIntegralCast>
1343 (S, LHS, RHS, LHSType, RHSEltType, IsCompAssign);
1344 QualType ComplexType = S.Context.getComplexType(ScalarType);
1345
1346 if (!IsCompAssign)
1347 LHS = S.ImpCastExprToType(LHS.get(), ComplexType,
1348 CK_IntegralRealToComplex);
1349 return ComplexType;
1350}
1351
1352/// Return the rank of a given fixed point or integer type. The value itself
1353/// doesn't matter, but the values must be increasing with proper increasing
1354/// rank as described in N1169 4.1.1.
1355static unsigned GetFixedPointRank(QualType Ty) {
1356 const auto *BTy = Ty->getAs<BuiltinType>();
1357 assert(BTy && "Expected a builtin type.")(static_cast<void> (0));
1358
1359 switch (BTy->getKind()) {
1360 case BuiltinType::ShortFract:
1361 case BuiltinType::UShortFract:
1362 case BuiltinType::SatShortFract:
1363 case BuiltinType::SatUShortFract:
1364 return 1;
1365 case BuiltinType::Fract:
1366 case BuiltinType::UFract:
1367 case BuiltinType::SatFract:
1368 case BuiltinType::SatUFract:
1369 return 2;
1370 case BuiltinType::LongFract:
1371 case BuiltinType::ULongFract:
1372 case BuiltinType::SatLongFract:
1373 case BuiltinType::SatULongFract:
1374 return 3;
1375 case BuiltinType::ShortAccum:
1376 case BuiltinType::UShortAccum:
1377 case BuiltinType::SatShortAccum:
1378 case BuiltinType::SatUShortAccum:
1379 return 4;
1380 case BuiltinType::Accum:
1381 case BuiltinType::UAccum:
1382 case BuiltinType::SatAccum:
1383 case BuiltinType::SatUAccum:
1384 return 5;
1385 case BuiltinType::LongAccum:
1386 case BuiltinType::ULongAccum:
1387 case BuiltinType::SatLongAccum:
1388 case BuiltinType::SatULongAccum:
1389 return 6;
1390 default:
1391 if (BTy->isInteger())
1392 return 0;
1393 llvm_unreachable("Unexpected fixed point or integer type")__builtin_unreachable();
1394 }
1395}
1396
1397/// handleFixedPointConversion - Fixed point operations between fixed
1398/// point types and integers or other fixed point types do not fall under
1399/// usual arithmetic conversion since these conversions could result in loss
1400/// of precsision (N1169 4.1.4). These operations should be calculated with
1401/// the full precision of their result type (N1169 4.1.6.2.1).
1402static QualType handleFixedPointConversion(Sema &S, QualType LHSTy,
1403 QualType RHSTy) {
1404 assert((LHSTy->isFixedPointType() || RHSTy->isFixedPointType()) &&(static_cast<void> (0))
1405 "Expected at least one of the operands to be a fixed point type")(static_cast<void> (0));
1406 assert((LHSTy->isFixedPointOrIntegerType() ||(static_cast<void> (0))
1407 RHSTy->isFixedPointOrIntegerType()) &&(static_cast<void> (0))
1408 "Special fixed point arithmetic operation conversions are only "(static_cast<void> (0))
1409 "applied to ints or other fixed point types")(static_cast<void> (0));
1410
1411 // If one operand has signed fixed-point type and the other operand has
1412 // unsigned fixed-point type, then the unsigned fixed-point operand is
1413 // converted to its corresponding signed fixed-point type and the resulting
1414 // type is the type of the converted operand.
1415 if (RHSTy->isSignedFixedPointType() && LHSTy->isUnsignedFixedPointType())
1416 LHSTy = S.Context.getCorrespondingSignedFixedPointType(LHSTy);
1417 else if (RHSTy->isUnsignedFixedPointType() && LHSTy->isSignedFixedPointType())
1418 RHSTy = S.Context.getCorrespondingSignedFixedPointType(RHSTy);
1419
1420 // The result type is the type with the highest rank, whereby a fixed-point
1421 // conversion rank is always greater than an integer conversion rank; if the
1422 // type of either of the operands is a saturating fixedpoint type, the result
1423 // type shall be the saturating fixed-point type corresponding to the type
1424 // with the highest rank; the resulting value is converted (taking into
1425 // account rounding and overflow) to the precision of the resulting type.
1426 // Same ranks between signed and unsigned types are resolved earlier, so both
1427 // types are either signed or both unsigned at this point.
1428 unsigned LHSTyRank = GetFixedPointRank(LHSTy);
1429 unsigned RHSTyRank = GetFixedPointRank(RHSTy);
1430
1431 QualType ResultTy = LHSTyRank > RHSTyRank ? LHSTy : RHSTy;
1432
1433 if (LHSTy->isSaturatedFixedPointType() || RHSTy->isSaturatedFixedPointType())
1434 ResultTy = S.Context.getCorrespondingSaturatedType(ResultTy);
1435
1436 return ResultTy;
1437}
1438
1439/// Check that the usual arithmetic conversions can be performed on this pair of
1440/// expressions that might be of enumeration type.
1441static void checkEnumArithmeticConversions(Sema &S, Expr *LHS, Expr *RHS,
1442 SourceLocation Loc,
1443 Sema::ArithConvKind ACK) {
1444 // C++2a [expr.arith.conv]p1:
1445 // If one operand is of enumeration type and the other operand is of a
1446 // different enumeration type or a floating-point type, this behavior is
1447 // deprecated ([depr.arith.conv.enum]).
1448 //
1449 // Warn on this in all language modes. Produce a deprecation warning in C++20.
1450 // Eventually we will presumably reject these cases (in C++23 onwards?).
1451 QualType L = LHS->getType(), R = RHS->getType();
1452 bool LEnum = L->isUnscopedEnumerationType(),
1453 REnum = R->isUnscopedEnumerationType();
1454 bool IsCompAssign = ACK == Sema::ACK_CompAssign;
1455 if ((!IsCompAssign && LEnum && R->isFloatingType()) ||
1456 (REnum && L->isFloatingType())) {
1457 S.Diag(Loc, S.getLangOpts().CPlusPlus20
1458 ? diag::warn_arith_conv_enum_float_cxx20
1459 : diag::warn_arith_conv_enum_float)
1460 << LHS->getSourceRange() << RHS->getSourceRange()
1461 << (int)ACK << LEnum << L << R;
1462 } else if (!IsCompAssign && LEnum && REnum &&
1463 !S.Context.hasSameUnqualifiedType(L, R)) {
1464 unsigned DiagID;
1465 if (!L->castAs<EnumType>()->getDecl()->hasNameForLinkage() ||
1466 !R->castAs<EnumType>()->getDecl()->hasNameForLinkage()) {
1467 // If either enumeration type is unnamed, it's less likely that the
1468 // user cares about this, but this situation is still deprecated in
1469 // C++2a. Use a different warning group.
1470 DiagID = S.getLangOpts().CPlusPlus20
1471 ? diag::warn_arith_conv_mixed_anon_enum_types_cxx20
1472 : diag::warn_arith_conv_mixed_anon_enum_types;
1473 } else if (ACK == Sema::ACK_Conditional) {
1474 // Conditional expressions are separated out because they have
1475 // historically had a different warning flag.
1476 DiagID = S.getLangOpts().CPlusPlus20
1477 ? diag::warn_conditional_mixed_enum_types_cxx20
1478 : diag::warn_conditional_mixed_enum_types;
1479 } else if (ACK == Sema::ACK_Comparison) {
1480 // Comparison expressions are separated out because they have
1481 // historically had a different warning flag.
1482 DiagID = S.getLangOpts().CPlusPlus20
1483 ? diag::warn_comparison_mixed_enum_types_cxx20
1484 : diag::warn_comparison_mixed_enum_types;
1485 } else {
1486 DiagID = S.getLangOpts().CPlusPlus20
1487 ? diag::warn_arith_conv_mixed_enum_types_cxx20
1488 : diag::warn_arith_conv_mixed_enum_types;
1489 }
1490 S.Diag(Loc, DiagID) << LHS->getSourceRange() << RHS->getSourceRange()
1491 << (int)ACK << L << R;
1492 }
1493}
1494
1495/// UsualArithmeticConversions - Performs various conversions that are common to
1496/// binary operators (C99 6.3.1.8). If both operands aren't arithmetic, this
1497/// routine returns the first non-arithmetic type found. The client is
1498/// responsible for emitting appropriate error diagnostics.
1499QualType Sema::UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS,
1500 SourceLocation Loc,
1501 ArithConvKind ACK) {
1502 checkEnumArithmeticConversions(*this, LHS.get(), RHS.get(), Loc, ACK);
1503
1504 if (ACK != ACK_CompAssign) {
1505 LHS = UsualUnaryConversions(LHS.get());
1506 if (LHS.isInvalid())
1507 return QualType();
1508 }
1509
1510 RHS = UsualUnaryConversions(RHS.get());
1511 if (RHS.isInvalid())
1512 return QualType();
1513
1514 // For conversion purposes, we ignore any qualifiers.
1515 // For example, "const float" and "float" are equivalent.
1516 QualType LHSType =
1517 Context.getCanonicalType(LHS.get()->getType()).getUnqualifiedType();
1518 QualType RHSType =
1519 Context.getCanonicalType(RHS.get()->getType()).getUnqualifiedType();
1520
1521 // For conversion purposes, we ignore any atomic qualifier on the LHS.
1522 if (const AtomicType *AtomicLHS = LHSType->getAs<AtomicType>())
1523 LHSType = AtomicLHS->getValueType();
1524
1525 // If both types are identical, no conversion is needed.
1526 if (LHSType == RHSType)
1527 return LHSType;
1528
1529 // If either side is a non-arithmetic type (e.g. a pointer), we are done.
1530 // The caller can deal with this (e.g. pointer + int).
1531 if (!LHSType->isArithmeticType() || !RHSType->isArithmeticType())
1532 return QualType();
1533
1534 // Apply unary and bitfield promotions to the LHS's type.
1535 QualType LHSUnpromotedType = LHSType;
1536 if (LHSType->isPromotableIntegerType())
1537 LHSType = Context.getPromotedIntegerType(LHSType);
1538 QualType LHSBitfieldPromoteTy = Context.isPromotableBitField(LHS.get());
1539 if (!LHSBitfieldPromoteTy.isNull())
1540 LHSType = LHSBitfieldPromoteTy;
1541 if (LHSType != LHSUnpromotedType && ACK != ACK_CompAssign)
1542 LHS = ImpCastExprToType(LHS.get(), LHSType, CK_IntegralCast);
1543
1544 // If both types are identical, no conversion is needed.
1545 if (LHSType == RHSType)
1546 return LHSType;
1547
1548 // At this point, we have two different arithmetic types.
1549
1550 // Diagnose attempts to convert between __float128 and long double where
1551 // such conversions currently can't be handled.
1552 if (unsupportedTypeConversion(*this, LHSType, RHSType))
1553 return QualType();
1554
1555 // Handle complex types first (C99 6.3.1.8p1).
1556 if (LHSType->isComplexType() || RHSType->isComplexType())
1557 return handleComplexFloatConversion(*this, LHS, RHS, LHSType, RHSType,
1558 ACK == ACK_CompAssign);
1559
1560 // Now handle "real" floating types (i.e. float, double, long double).
1561 if (LHSType->isRealFloatingType() || RHSType->isRealFloatingType())
1562 return handleFloatConversion(*this, LHS, RHS, LHSType, RHSType,
1563 ACK == ACK_CompAssign);
1564
1565 // Handle GCC complex int extension.
1566 if (LHSType->isComplexIntegerType() || RHSType->isComplexIntegerType())
1567 return handleComplexIntConversion(*this, LHS, RHS, LHSType, RHSType,
1568 ACK == ACK_CompAssign);
1569
1570 if (LHSType->isFixedPointType() || RHSType->isFixedPointType())
1571 return handleFixedPointConversion(*this, LHSType, RHSType);
1572
1573 // Finally, we have two differing integer types.
1574 return handleIntegerConversion<doIntegralCast, doIntegralCast>
1575 (*this, LHS, RHS, LHSType, RHSType, ACK == ACK_CompAssign);
1576}
1577
1578//===----------------------------------------------------------------------===//
1579// Semantic Analysis for various Expression Types
1580//===----------------------------------------------------------------------===//
1581
1582
1583ExprResult
1584Sema::ActOnGenericSelectionExpr(SourceLocation KeyLoc,
1585 SourceLocation DefaultLoc,
1586 SourceLocation RParenLoc,
1587 Expr *ControllingExpr,
1588 ArrayRef<ParsedType> ArgTypes,
1589 ArrayRef<Expr *> ArgExprs) {
1590 unsigned NumAssocs = ArgTypes.size();
1591 assert(NumAssocs == ArgExprs.size())(static_cast<void> (0));
1592
1593 TypeSourceInfo **Types = new TypeSourceInfo*[NumAssocs];
1594 for (unsigned i = 0; i < NumAssocs; ++i) {
1595 if (ArgTypes[i])
1596 (void) GetTypeFromParser(ArgTypes[i], &Types[i]);
1597 else
1598 Types[i] = nullptr;
1599 }
1600
1601 ExprResult ER = CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
1602 ControllingExpr,
1603 llvm::makeArrayRef(Types, NumAssocs),
1604 ArgExprs);
1605 delete [] Types;
1606 return ER;
1607}
1608
1609ExprResult
1610Sema::CreateGenericSelectionExpr(SourceLocation KeyLoc,
1611 SourceLocation DefaultLoc,
1612 SourceLocation RParenLoc,
1613 Expr *ControllingExpr,
1614 ArrayRef<TypeSourceInfo *> Types,
1615 ArrayRef<Expr *> Exprs) {
1616 unsigned NumAssocs = Types.size();
1617 assert(NumAssocs == Exprs.size())(static_cast<void> (0));
1618
1619 // Decay and strip qualifiers for the controlling expression type, and handle
1620 // placeholder type replacement. See committee discussion from WG14 DR423.
1621 {
1622 EnterExpressionEvaluationContext Unevaluated(
1623 *this, Sema::ExpressionEvaluationContext::Unevaluated);
1624 ExprResult R = DefaultFunctionArrayLvalueConversion(ControllingExpr);
1625 if (R.isInvalid())
1626 return ExprError();
1627 ControllingExpr = R.get();
1628 }
1629
1630 // The controlling expression is an unevaluated operand, so side effects are
1631 // likely unintended.
1632 if (!inTemplateInstantiation() &&
1633 ControllingExpr->HasSideEffects(Context, false))
1634 Diag(ControllingExpr->getExprLoc(),
1635 diag::warn_side_effects_unevaluated_context);
1636
1637 bool TypeErrorFound = false,
1638 IsResultDependent = ControllingExpr->isTypeDependent(),
1639 ContainsUnexpandedParameterPack
1640 = ControllingExpr->containsUnexpandedParameterPack();
1641
1642 for (unsigned i = 0; i < NumAssocs; ++i) {
1643 if (Exprs[i]->containsUnexpandedParameterPack())
1644 ContainsUnexpandedParameterPack = true;
1645
1646 if (Types[i]) {
1647 if (Types[i]->getType()->containsUnexpandedParameterPack())
1648 ContainsUnexpandedParameterPack = true;
1649
1650 if (Types[i]->getType()->isDependentType()) {
1651 IsResultDependent = true;
1652 } else {
1653 // C11 6.5.1.1p2 "The type name in a generic association shall specify a
1654 // complete object type other than a variably modified type."
1655 unsigned D = 0;
1656 if (Types[i]->getType()->isIncompleteType())
1657 D = diag::err_assoc_type_incomplete;
1658 else if (!Types[i]->getType()->isObjectType())
1659 D = diag::err_assoc_type_nonobject;
1660 else if (Types[i]->getType()->isVariablyModifiedType())
1661 D = diag::err_assoc_type_variably_modified;
1662
1663 if (D != 0) {
1664 Diag(Types[i]->getTypeLoc().getBeginLoc(), D)
1665 << Types[i]->getTypeLoc().getSourceRange()
1666 << Types[i]->getType();
1667 TypeErrorFound = true;
1668 }
1669
1670 // C11 6.5.1.1p2 "No two generic associations in the same generic
1671 // selection shall specify compatible types."
1672 for (unsigned j = i+1; j < NumAssocs; ++j)
1673 if (Types[j] && !Types[j]->getType()->isDependentType() &&
1674 Context.typesAreCompatible(Types[i]->getType(),
1675 Types[j]->getType())) {
1676 Diag(Types[j]->getTypeLoc().getBeginLoc(),
1677 diag::err_assoc_compatible_types)
1678 << Types[j]->getTypeLoc().getSourceRange()
1679 << Types[j]->getType()
1680 << Types[i]->getType();
1681 Diag(Types[i]->getTypeLoc().getBeginLoc(),
1682 diag::note_compat_assoc)
1683 << Types[i]->getTypeLoc().getSourceRange()
1684 << Types[i]->getType();
1685 TypeErrorFound = true;
1686 }
1687 }
1688 }
1689 }
1690 if (TypeErrorFound)
1691 return ExprError();
1692
1693 // If we determined that the generic selection is result-dependent, don't
1694 // try to compute the result expression.
1695 if (IsResultDependent)
1696 return GenericSelectionExpr::Create(Context, KeyLoc, ControllingExpr, Types,
1697 Exprs, DefaultLoc, RParenLoc,
1698 ContainsUnexpandedParameterPack);
1699
1700 SmallVector<unsigned, 1> CompatIndices;
1701 unsigned DefaultIndex = -1U;
1702 for (unsigned i = 0; i < NumAssocs; ++i) {
1703 if (!Types[i])
1704 DefaultIndex = i;
1705 else if (Context.typesAreCompatible(ControllingExpr->getType(),
1706 Types[i]->getType()))
1707 CompatIndices.push_back(i);
1708 }
1709
1710 // C11 6.5.1.1p2 "The controlling expression of a generic selection shall have
1711 // type compatible with at most one of the types named in its generic
1712 // association list."
1713 if (CompatIndices.size() > 1) {
1714 // We strip parens here because the controlling expression is typically
1715 // parenthesized in macro definitions.
1716 ControllingExpr = ControllingExpr->IgnoreParens();
1717 Diag(ControllingExpr->getBeginLoc(), diag::err_generic_sel_multi_match)
1718 << ControllingExpr->getSourceRange() << ControllingExpr->getType()
1719 << (unsigned)CompatIndices.size();
1720 for (unsigned I : CompatIndices) {
1721 Diag(Types[I]->getTypeLoc().getBeginLoc(),
1722 diag::note_compat_assoc)
1723 << Types[I]->getTypeLoc().getSourceRange()
1724 << Types[I]->getType();
1725 }
1726 return ExprError();
1727 }
1728
1729 // C11 6.5.1.1p2 "If a generic selection has no default generic association,
1730 // its controlling expression shall have type compatible with exactly one of
1731 // the types named in its generic association list."
1732 if (DefaultIndex == -1U && CompatIndices.size() == 0) {
1733 // We strip parens here because the controlling expression is typically
1734 // parenthesized in macro definitions.
1735 ControllingExpr = ControllingExpr->IgnoreParens();
1736 Diag(ControllingExpr->getBeginLoc(), diag::err_generic_sel_no_match)
1737 << ControllingExpr->getSourceRange() << ControllingExpr->getType();
1738 return ExprError();
1739 }
1740
1741 // C11 6.5.1.1p3 "If a generic selection has a generic association with a
1742 // type name that is compatible with the type of the controlling expression,
1743 // then the result expression of the generic selection is the expression
1744 // in that generic association. Otherwise, the result expression of the
1745 // generic selection is the expression in the default generic association."
1746 unsigned ResultIndex =
1747 CompatIndices.size() ? CompatIndices[0] : DefaultIndex;
1748
1749 return GenericSelectionExpr::Create(
1750 Context, KeyLoc, ControllingExpr, Types, Exprs, DefaultLoc, RParenLoc,
1751 ContainsUnexpandedParameterPack, ResultIndex);
1752}
1753
1754/// getUDSuffixLoc - Create a SourceLocation for a ud-suffix, given the
1755/// location of the token and the offset of the ud-suffix within it.
1756static SourceLocation getUDSuffixLoc(Sema &S, SourceLocation TokLoc,
1757 unsigned Offset) {
1758 return Lexer::AdvanceToTokenCharacter(TokLoc, Offset, S.getSourceManager(),
1759 S.getLangOpts());
1760}
1761
1762/// BuildCookedLiteralOperatorCall - A user-defined literal was found. Look up
1763/// the corresponding cooked (non-raw) literal operator, and build a call to it.
1764static ExprResult BuildCookedLiteralOperatorCall(Sema &S, Scope *Scope,
1765 IdentifierInfo *UDSuffix,
1766 SourceLocation UDSuffixLoc,
1767 ArrayRef<Expr*> Args,
1768 SourceLocation LitEndLoc) {
1769 assert(Args.size() <= 2 && "too many arguments for literal operator")(static_cast<void> (0));
1770
1771 QualType ArgTy[2];
1772 for (unsigned ArgIdx = 0; ArgIdx != Args.size(); ++ArgIdx) {
1773 ArgTy[ArgIdx] = Args[ArgIdx]->getType();
1774 if (ArgTy[ArgIdx]->isArrayType())
1775 ArgTy[ArgIdx] = S.Context.getArrayDecayedType(ArgTy[ArgIdx]);
1776 }
1777
1778 DeclarationName OpName =
1779 S.Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
1780 DeclarationNameInfo OpNameInfo(OpName, UDSuffixLoc);
1781 OpNameInfo.setCXXLiteralOperatorNameLoc(UDSuffixLoc);
1782
1783 LookupResult R(S, OpName, UDSuffixLoc, Sema::LookupOrdinaryName);
1784 if (S.LookupLiteralOperator(Scope, R, llvm::makeArrayRef(ArgTy, Args.size()),
1785 /*AllowRaw*/ false, /*AllowTemplate*/ false,
1786 /*AllowStringTemplatePack*/ false,
1787 /*DiagnoseMissing*/ true) == Sema::LOLR_Error)
1788 return ExprError();
1789
1790 return S.BuildLiteralOperatorCall(R, OpNameInfo, Args, LitEndLoc);
1791}
1792
1793/// ActOnStringLiteral - The specified tokens were lexed as pasted string
1794/// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle string
1795/// concatenation ([C99 5.1.1.2, translation phase #6]), so it may come from
1796/// multiple tokens. However, the common case is that StringToks points to one
1797/// string.
1798///
1799ExprResult
1800Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope *UDLScope) {
1801 assert(!StringToks.empty() && "Must have at least one string!")(static_cast<void> (0));
1802
1803 StringLiteralParser Literal(StringToks, PP);
1804 if (Literal.hadError)
1805 return ExprError();
1806
1807 SmallVector<SourceLocation, 4> StringTokLocs;
1808 for (const Token &Tok : StringToks)
1809 StringTokLocs.push_back(Tok.getLocation());
1810
1811 QualType CharTy = Context.CharTy;
1812 StringLiteral::StringKind Kind = StringLiteral::Ascii;
1813 if (Literal.isWide()) {
1814 CharTy = Context.getWideCharType();
1815 Kind = StringLiteral::Wide;
1816 } else if (Literal.isUTF8()) {
1817 if (getLangOpts().Char8)
1818 CharTy = Context.Char8Ty;
1819 Kind = StringLiteral::UTF8;
1820 } else if (Literal.isUTF16()) {
1821 CharTy = Context.Char16Ty;
1822 Kind = StringLiteral::UTF16;
1823 } else if (Literal.isUTF32()) {
1824 CharTy = Context.Char32Ty;
1825 Kind = StringLiteral::UTF32;
1826 } else if (Literal.isPascal()) {
1827 CharTy = Context.UnsignedCharTy;
1828 }
1829
1830 // Warn on initializing an array of char from a u8 string literal; this
1831 // becomes ill-formed in C++2a.
1832 if (getLangOpts().CPlusPlus && !getLangOpts().CPlusPlus20 &&
1833 !getLangOpts().Char8 && Kind == StringLiteral::UTF8) {
1834 Diag(StringTokLocs.front(), diag::warn_cxx20_compat_utf8_string);
1835
1836 // Create removals for all 'u8' prefixes in the string literal(s). This
1837 // ensures C++2a compatibility (but may change the program behavior when
1838 // built by non-Clang compilers for which the execution character set is
1839 // not always UTF-8).
1840 auto RemovalDiag = PDiag(diag::note_cxx20_compat_utf8_string_remove_u8);
1841 SourceLocation RemovalDiagLoc;
1842 for (const Token &Tok : StringToks) {
1843 if (Tok.getKind() == tok::utf8_string_literal) {
1844 if (RemovalDiagLoc.isInvalid())
1845 RemovalDiagLoc = Tok.getLocation();
1846 RemovalDiag << FixItHint::CreateRemoval(CharSourceRange::getCharRange(
1847 Tok.getLocation(),
1848 Lexer::AdvanceToTokenCharacter(Tok.getLocation(), 2,
1849 getSourceManager(), getLangOpts())));
1850 }
1851 }
1852 Diag(RemovalDiagLoc, RemovalDiag);
1853 }
1854
1855 QualType StrTy =
1856 Context.getStringLiteralArrayType(CharTy, Literal.GetNumStringChars());
1857
1858 // Pass &StringTokLocs[0], StringTokLocs.size() to factory!
1859 StringLiteral *Lit = StringLiteral::Create(Context, Literal.GetString(),
1860 Kind, Literal.Pascal, StrTy,
1861 &StringTokLocs[0],
1862 StringTokLocs.size());
1863 if (Literal.getUDSuffix().empty())
1864 return Lit;
1865
1866 // We're building a user-defined literal.
1867 IdentifierInfo *UDSuffix = &Context.Idents.get(Literal.getUDSuffix());
1868 SourceLocation UDSuffixLoc =
1869 getUDSuffixLoc(*this, StringTokLocs[Literal.getUDSuffixToken()],
1870 Literal.getUDSuffixOffset());
1871
1872 // Make sure we're allowed user-defined literals here.
1873 if (!UDLScope)
1874 return ExprError(Diag(UDSuffixLoc, diag::err_invalid_string_udl));
1875
1876 // C++11 [lex.ext]p5: The literal L is treated as a call of the form
1877 // operator "" X (str, len)
1878 QualType SizeType = Context.getSizeType();
1879
1880 DeclarationName OpName =
1881 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
1882 DeclarationNameInfo OpNameInfo(OpName, UDSuffixLoc);
1883 OpNameInfo.setCXXLiteralOperatorNameLoc(UDSuffixLoc);
1884
1885 QualType ArgTy[] = {
1886 Context.getArrayDecayedType(StrTy), SizeType
1887 };
1888
1889 LookupResult R(*this, OpName, UDSuffixLoc, LookupOrdinaryName);
1890 switch (LookupLiteralOperator(UDLScope, R, ArgTy,
1891 /*AllowRaw*/ false, /*AllowTemplate*/ true,
1892 /*AllowStringTemplatePack*/ true,
1893 /*DiagnoseMissing*/ true, Lit)) {
1894
1895 case LOLR_Cooked: {
1896 llvm::APInt Len(Context.getIntWidth(SizeType), Literal.GetNumStringChars());
1897 IntegerLiteral *LenArg = IntegerLiteral::Create(Context, Len, SizeType,
1898 StringTokLocs[0]);
1899 Expr *Args[] = { Lit, LenArg };
1900
1901 return BuildLiteralOperatorCall(R, OpNameInfo, Args, StringTokLocs.back());
1902 }
1903
1904 case LOLR_Template: {
1905 TemplateArgumentListInfo ExplicitArgs;
1906 TemplateArgument Arg(Lit);
1907 TemplateArgumentLocInfo ArgInfo(Lit);
1908 ExplicitArgs.addArgument(TemplateArgumentLoc(Arg, ArgInfo));
1909 return BuildLiteralOperatorCall(R, OpNameInfo, None, StringTokLocs.back(),
1910 &ExplicitArgs);
1911 }
1912
1913 case LOLR_StringTemplatePack: {
1914 TemplateArgumentListInfo ExplicitArgs;
1915
1916 unsigned CharBits = Context.getIntWidth(CharTy);
1917 bool CharIsUnsigned = CharTy->isUnsignedIntegerType();
1918 llvm::APSInt Value(CharBits, CharIsUnsigned);
1919
1920 TemplateArgument TypeArg(CharTy);
1921 TemplateArgumentLocInfo TypeArgInfo(Context.getTrivialTypeSourceInfo(CharTy));
1922 ExplicitArgs.addArgument(TemplateArgumentLoc(TypeArg, TypeArgInfo));
1923
1924 for (unsigned I = 0, N = Lit->getLength(); I != N; ++I) {
1925 Value = Lit->getCodeUnit(I);
1926 TemplateArgument Arg(Context, Value, CharTy);
1927 TemplateArgumentLocInfo ArgInfo;
1928 ExplicitArgs.addArgument(TemplateArgumentLoc(Arg, ArgInfo));
1929 }
1930 return BuildLiteralOperatorCall(R, OpNameInfo, None, StringTokLocs.back(),
1931 &ExplicitArgs);
1932 }
1933 case LOLR_Raw:
1934 case LOLR_ErrorNoDiagnostic:
1935 llvm_unreachable("unexpected literal operator lookup result")__builtin_unreachable();
1936 case LOLR_Error:
1937 return ExprError();
1938 }
1939 llvm_unreachable("unexpected literal operator lookup result")__builtin_unreachable();
1940}
1941
1942DeclRefExpr *
1943Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
1944 SourceLocation Loc,
1945 const CXXScopeSpec *SS) {
1946 DeclarationNameInfo NameInfo(D->getDeclName(), Loc);
1947 return BuildDeclRefExpr(D, Ty, VK, NameInfo, SS);
1948}
1949
1950DeclRefExpr *
1951Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
1952 const DeclarationNameInfo &NameInfo,
1953 const CXXScopeSpec *SS, NamedDecl *FoundD,
1954 SourceLocation TemplateKWLoc,
1955 const TemplateArgumentListInfo *TemplateArgs) {
1956 NestedNameSpecifierLoc NNS =
1957 SS ? SS->getWithLocInContext(Context) : NestedNameSpecifierLoc();
1958 return BuildDeclRefExpr(D, Ty, VK, NameInfo, NNS, FoundD, TemplateKWLoc,
1959 TemplateArgs);
1960}
1961
1962// CUDA/HIP: Check whether a captured reference variable is referencing a
1963// host variable in a device or host device lambda.
1964static bool isCapturingReferenceToHostVarInCUDADeviceLambda(const Sema &S,
1965 VarDecl *VD) {
1966 if (!S.getLangOpts().CUDA || !VD->hasInit())
1967 return false;
1968 assert(VD->getType()->isReferenceType())(static_cast<void> (0));
1969
1970 // Check whether the reference variable is referencing a host variable.
1971 auto *DRE = dyn_cast<DeclRefExpr>(VD->getInit());
1972 if (!DRE)
1973 return false;
1974 auto *Referee = dyn_cast<VarDecl>(DRE->getDecl());
1975 if (!Referee || !Referee->hasGlobalStorage() ||
1976 Referee->hasAttr<CUDADeviceAttr>())
1977 return false;
1978
1979 // Check whether the current function is a device or host device lambda.
1980 // Check whether the reference variable is a capture by getDeclContext()
1981 // since refersToEnclosingVariableOrCapture() is not ready at this point.
1982 auto *MD = dyn_cast_or_null<CXXMethodDecl>(S.CurContext);
1983 if (MD && MD->getParent()->isLambda() &&
1984 MD->getOverloadedOperator() == OO_Call && MD->hasAttr<CUDADeviceAttr>() &&
1985 VD->getDeclContext() != MD)
1986 return true;
1987
1988 return false;
1989}
1990
1991NonOdrUseReason Sema::getNonOdrUseReasonInCurrentContext(ValueDecl *D) {
1992 // A declaration named in an unevaluated operand never constitutes an odr-use.
1993 if (isUnevaluatedContext())
1994 return NOUR_Unevaluated;
1995
1996 // C++2a [basic.def.odr]p4:
1997 // A variable x whose name appears as a potentially-evaluated expression e
1998 // is odr-used by e unless [...] x is a reference that is usable in
1999 // constant expressions.
2000 // CUDA/HIP:
2001 // If a reference variable referencing a host variable is captured in a
2002 // device or host device lambda, the value of the referee must be copied
2003 // to the capture and the reference variable must be treated as odr-use
2004 // since the value of the referee is not known at compile time and must
2005 // be loaded from the captured.
2006 if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
2007 if (VD->getType()->isReferenceType() &&
2008 !(getLangOpts().OpenMP && isOpenMPCapturedDecl(D)) &&
2009 !isCapturingReferenceToHostVarInCUDADeviceLambda(*this, VD) &&
2010 VD->isUsableInConstantExpressions(Context))
2011 return NOUR_Constant;
2012 }
2013
2014 // All remaining non-variable cases constitute an odr-use. For variables, we
2015 // need to wait and see how the expression is used.
2016 return NOUR_None;
2017}
2018
2019/// BuildDeclRefExpr - Build an expression that references a
2020/// declaration that does not require a closure capture.
2021DeclRefExpr *
2022Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
2023 const DeclarationNameInfo &NameInfo,
2024 NestedNameSpecifierLoc NNS, NamedDecl *FoundD,
2025 SourceLocation TemplateKWLoc,
2026 const TemplateArgumentListInfo *TemplateArgs) {
2027 bool RefersToCapturedVariable =
2028 isa<VarDecl>(D) &&
2029 NeedToCaptureVariable(cast<VarDecl>(D), NameInfo.getLoc());
2030
2031 DeclRefExpr *E = DeclRefExpr::Create(
2032 Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
2033 VK, FoundD, TemplateArgs, getNonOdrUseReasonInCurrentContext(D));
2034 MarkDeclRefReferenced(E);
2035
2036 // C++ [except.spec]p17:
2037 // An exception-specification is considered to be needed when:
2038 // - in an expression, the function is the unique lookup result or
2039 // the selected member of a set of overloaded functions.
2040 //
2041 // We delay doing this until after we've built the function reference and
2042 // marked it as used so that:
2043 // a) if the function is defaulted, we get errors from defining it before /
2044 // instead of errors from computing its exception specification, and
2045 // b) if the function is a defaulted comparison, we can use the body we
2046 // build when defining it as input to the exception specification
2047 // computation rather than computing a new body.
2048 if (auto *FPT = Ty->getAs<FunctionProtoType>()) {
2049 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {
2050 if (auto *NewFPT = ResolveExceptionSpec(NameInfo.getLoc(), FPT))
2051 E->setType(Context.getQualifiedType(NewFPT, Ty.getQualifiers()));
2052 }
2053 }
2054
2055 if (getLangOpts().ObjCWeak && isa<VarDecl>(D) &&
2056 Ty.getObjCLifetime() == Qualifiers::OCL_Weak && !isUnevaluatedContext() &&
2057 !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getBeginLoc()))
2058 getCurFunction()->recordUseOfWeak(E);
2059
2060 FieldDecl *FD = dyn_cast<FieldDecl>(D);
2061 if (IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(D))
2062 FD = IFD->getAnonField();
2063 if (FD) {
2064 UnusedPrivateFields.remove(FD);
2065 // Just in case we're building an illegal pointer-to-member.
2066 if (FD->isBitField())
2067 E->setObjectKind(OK_BitField);
2068 }
2069
2070 // C++ [expr.prim]/8: The expression [...] is a bit-field if the identifier
2071 // designates a bit-field.
2072 if (auto *BD = dyn_cast<BindingDecl>(D))
2073 if (auto *BE = BD->getBinding())
2074 E->setObjectKind(BE->getObjectKind());
2075
2076 return E;
2077}
2078
2079/// Decomposes the given name into a DeclarationNameInfo, its location, and
2080/// possibly a list of template arguments.
2081///
2082/// If this produces template arguments, it is permitted to call
2083/// DecomposeTemplateName.
2084///
2085/// This actually loses a lot of source location information for
2086/// non-standard name kinds; we should consider preserving that in
2087/// some way.
2088void
2089Sema::DecomposeUnqualifiedId(const UnqualifiedId &Id,
2090 TemplateArgumentListInfo &Buffer,
2091 DeclarationNameInfo &NameInfo,
2092 const TemplateArgumentListInfo *&TemplateArgs) {
2093 if (Id.getKind() == UnqualifiedIdKind::IK_TemplateId) {
2094 Buffer.setLAngleLoc(Id.TemplateId->LAngleLoc);
2095 Buffer.setRAngleLoc(Id.TemplateId->RAngleLoc);
2096
2097 ASTTemplateArgsPtr TemplateArgsPtr(Id.TemplateId->getTemplateArgs(),
2098 Id.TemplateId->NumArgs);
2099 translateTemplateArguments(TemplateArgsPtr, Buffer);
2100
2101 TemplateName TName = Id.TemplateId->Template.get();
2102 SourceLocation TNameLoc = Id.TemplateId->TemplateNameLoc;
2103 NameInfo = Context.getNameForTemplate(TName, TNameLoc);
2104 TemplateArgs = &Buffer;
2105 } else {
2106 NameInfo = GetNameFromUnqualifiedId(Id);
2107 TemplateArgs = nullptr;
2108 }
2109}
2110
2111static void emitEmptyLookupTypoDiagnostic(
2112 const TypoCorrection &TC, Sema &SemaRef, const CXXScopeSpec &SS,
2113 DeclarationName Typo, SourceLocation TypoLoc, ArrayRef<Expr *> Args,
2114 unsigned DiagnosticID, unsigned DiagnosticSuggestID) {
2115 DeclContext *Ctx =
2116 SS.isEmpty() ? nullptr : SemaRef.computeDeclContext(SS, false);
2117 if (!TC) {
2118 // Emit a special diagnostic for failed member lookups.
2119 // FIXME: computing the declaration context might fail here (?)
2120 if (Ctx)
2121 SemaRef.Diag(TypoLoc, diag::err_no_member) << Typo << Ctx
2122 << SS.getRange();
2123 else
2124 SemaRef.Diag(TypoLoc, DiagnosticID) << Typo;
2125 return;
2126 }
2127
2128 std::string CorrectedStr = TC.getAsString(SemaRef.getLangOpts());
2129 bool DroppedSpecifier =
2130 TC.WillReplaceSpecifier() && Typo.getAsString() == CorrectedStr;
2131 unsigned NoteID = TC.getCorrectionDeclAs<ImplicitParamDecl>()
2132 ? diag::note_implicit_param_decl
2133 : diag::note_previous_decl;
2134 if (!Ctx)
2135 SemaRef.diagnoseTypo(TC, SemaRef.PDiag(DiagnosticSuggestID) << Typo,
2136 SemaRef.PDiag(NoteID));
2137 else
2138 SemaRef.diagnoseTypo(TC, SemaRef.PDiag(diag::err_no_member_suggest)
2139 << Typo << Ctx << DroppedSpecifier
2140 << SS.getRange(),
2141 SemaRef.PDiag(NoteID));
2142}
2143
2144/// Diagnose a lookup that found results in an enclosing class during error
2145/// recovery. This usually indicates that the results were found in a dependent
2146/// base class that could not be searched as part of a template definition.
2147/// Always issues a diagnostic (though this may be only a warning in MS
2148/// compatibility mode).
2149///
2150/// Return \c true if the error is unrecoverable, or \c false if the caller
2151/// should attempt to recover using these lookup results.
2152bool Sema::DiagnoseDependentMemberLookup(LookupResult &R) {
2153 // During a default argument instantiation the CurContext points
2154 // to a CXXMethodDecl; but we can't apply a this-> fixit inside a
2155 // function parameter list, hence add an explicit check.
2156 bool isDefaultArgument =
2157 !CodeSynthesisContexts.empty() &&
2158 CodeSynthesisContexts.back().Kind ==
2159 CodeSynthesisContext::DefaultFunctionArgumentInstantiation;
2160 CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext);
2161 bool isInstance = CurMethod && CurMethod->isInstance() &&
2162 R.getNamingClass() == CurMethod->getParent() &&
2163 !isDefaultArgument;
2164
2165 // There are two ways we can find a class-scope declaration during template
2166 // instantiation that we did not find in the template definition: if it is a
2167 // member of a dependent base class, or if it is declared after the point of
2168 // use in the same class. Distinguish these by comparing the class in which
2169 // the member was found to the naming class of the lookup.
2170 unsigned DiagID = diag::err_found_in_dependent_base;
2171 unsigned NoteID = diag::note_member_declared_at;
2172 if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {
2173 DiagID = getLangOpts().MSVCCompat ? diag::ext_found_later_in_class
2174 : diag::err_found_later_in_class;
2175 } else if (getLangOpts().MSVCCompat) {
2176 DiagID = diag::ext_found_in_dependent_base;
2177 NoteID = diag::note_dependent_member_use;
2178 }
2179
2180 if (isInstance) {
2181 // Give a code modification hint to insert 'this->'.
2182 Diag(R.getNameLoc(), DiagID)
2183 << R.getLookupName()
2184 << FixItHint::CreateInsertion(R.getNameLoc(), "this->");
2185 CheckCXXThisCapture(R.getNameLoc());
2186 } else {
2187 // FIXME: Add a FixItHint to insert 'Base::' or 'Derived::' (assuming
2188 // they're not shadowed).
2189 Diag(R.getNameLoc(), DiagID) << R.getLookupName();
2190 }
2191
2192 for (NamedDecl *D : R)
2193 Diag(D->getLocation(), NoteID);
2194
2195 // Return true if we are inside a default argument instantiation
2196 // and the found name refers to an instance member function, otherwise
2197 // the caller will try to create an implicit member call and this is wrong
2198 // for default arguments.
2199 //
2200 // FIXME: Is this special case necessary? We could allow the caller to
2201 // diagnose this.
2202 if (isDefaultArgument && ((*R.begin())->isCXXInstanceMember())) {
2203 Diag(R.getNameLoc(), diag::err_member_call_without_object);
2204 return true;
2205 }
2206
2207 // Tell the callee to try to recover.
2208 return false;
2209}
2210
2211/// Diagnose an empty lookup.
2212///
2213/// \return false if new lookup candidates were found
2214bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
2215 CorrectionCandidateCallback &CCC,
2216 TemplateArgumentListInfo *ExplicitTemplateArgs,
2217 ArrayRef<Expr *> Args, TypoExpr **Out) {
2218 DeclarationName Name = R.getLookupName();
2219
2220 unsigned diagnostic = diag::err_undeclared_var_use;
2221 unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;
2222 if (Name.getNameKind() == DeclarationName::CXXOperatorName ||
2223 Name.getNameKind() == DeclarationName::CXXLiteralOperatorName ||
2224 Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {
2225 diagnostic = diag::err_undeclared_use;
2226 diagnostic_suggest = diag::err_undeclared_use_suggest;
2227 }
2228
2229 // If the original lookup was an unqualified lookup, fake an
2230 // unqualified lookup. This is useful when (for example) the
2231 // original lookup would not have found something because it was a
2232 // dependent name.
2233 DeclContext *DC = SS.isEmpty() ? CurContext : nullptr;
2234 while (DC) {
2235 if (isa<CXXRecordDecl>(DC)) {
2236 LookupQualifiedName(R, DC);
2237
2238 if (!R.empty()) {
2239 // Don't give errors about ambiguities in this lookup.
2240 R.suppressDiagnostics();
2241
2242 // If there's a best viable function among the results, only mention
2243 // that one in the notes.
2244 OverloadCandidateSet Candidates(R.getNameLoc(),
2245 OverloadCandidateSet::CSK_Normal);
2246 AddOverloadedCallCandidates(R, ExplicitTemplateArgs, Args, Candidates);
2247 OverloadCandidateSet::iterator Best;
2248 if (Candidates.BestViableFunction(*this, R.getNameLoc(), Best) ==
2249 OR_Success) {
2250 R.clear();
2251 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
2252 R.resolveKind();
2253 }
2254
2255 return DiagnoseDependentMemberLookup(R);
2256 }
2257
2258 R.clear();
2259 }
2260
2261 DC = DC->getLookupParent();
2262 }
2263
2264 // We didn't find anything, so try to correct for a typo.
2265 TypoCorrection Corrected;
2266 if (S && Out) {
2267 SourceLocation TypoLoc = R.getNameLoc();
2268 assert(!ExplicitTemplateArgs &&(static_cast<void> (0))
2269 "Diagnosing an empty lookup with explicit template args!")(static_cast<void> (0));
2270 *Out = CorrectTypoDelayed(
2271 R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
2272 [=](const TypoCorrection &TC) {
2273 emitEmptyLookupTypoDiagnostic(TC, *this, SS, Name, TypoLoc, Args,
2274 diagnostic, diagnostic_suggest);
2275 },
2276 nullptr, CTK_ErrorRecovery);
2277 if (*Out)
2278 return true;
2279 } else if (S &&
2280 (Corrected = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(),
2281 S, &SS, CCC, CTK_ErrorRecovery))) {
2282 std::string CorrectedStr(Corrected.getAsString(getLangOpts()));
2283 bool DroppedSpecifier =
2284 Corrected.WillReplaceSpecifier() && Name.getAsString() == CorrectedStr;
2285 R.setLookupName(Corrected.getCorrection());
2286
2287 bool AcceptableWithRecovery = false;
2288 bool AcceptableWithoutRecovery = false;
2289 NamedDecl *ND = Corrected.getFoundDecl();
2290 if (ND) {
2291 if (Corrected.isOverloaded()) {
2292 OverloadCandidateSet OCS(R.getNameLoc(),
2293 OverloadCandidateSet::CSK_Normal);
2294 OverloadCandidateSet::iterator Best;
2295 for (NamedDecl *CD : Corrected) {
2296 if (FunctionTemplateDecl *FTD =
2297 dyn_cast<FunctionTemplateDecl>(CD))
2298 AddTemplateOverloadCandidate(
2299 FTD, DeclAccessPair::make(FTD, AS_none), ExplicitTemplateArgs,
2300 Args, OCS);
2301 else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
2302 if (!ExplicitTemplateArgs || ExplicitTemplateArgs->size() == 0)
2303 AddOverloadCandidate(FD, DeclAccessPair::make(FD, AS_none),
2304 Args, OCS);
2305 }
2306 switch (OCS.BestViableFunction(*this, R.getNameLoc(), Best)) {
2307 case OR_Success:
2308 ND = Best->FoundDecl;
2309 Corrected.setCorrectionDecl(ND);
2310 break;
2311 default:
2312 // FIXME: Arbitrarily pick the first declaration for the note.
2313 Corrected.setCorrectionDecl(ND);
2314 break;
2315 }
2316 }
2317 R.addDecl(ND);
2318 if (getLangOpts().CPlusPlus && ND->isCXXClassMember()) {
2319 CXXRecordDecl *Record = nullptr;
2320 if (Corrected.getCorrectionSpecifier()) {
2321 const Type *Ty = Corrected.getCorrectionSpecifier()->getAsType();
2322 Record = Ty->getAsCXXRecordDecl();
2323 }
2324 if (!Record)
2325 Record = cast<CXXRecordDecl>(
2326 ND->getDeclContext()->getRedeclContext());
2327 R.setNamingClass(Record);
2328 }
2329
2330 auto *UnderlyingND = ND->getUnderlyingDecl();
2331 AcceptableWithRecovery = isa<ValueDecl>(UnderlyingND) ||
2332 isa<FunctionTemplateDecl>(UnderlyingND);
2333 // FIXME: If we ended up with a typo for a type name or
2334 // Objective-C class name, we're in trouble because the parser
2335 // is in the wrong place to recover. Suggest the typo
2336 // correction, but don't make it a fix-it since we're not going
2337 // to recover well anyway.
2338 AcceptableWithoutRecovery = isa<TypeDecl>(UnderlyingND) ||
2339 getAsTypeTemplateDecl(UnderlyingND) ||
2340 isa<ObjCInterfaceDecl>(UnderlyingND);
2341 } else {
2342 // FIXME: We found a keyword. Suggest it, but don't provide a fix-it
2343 // because we aren't able to recover.
2344 AcceptableWithoutRecovery = true;
2345 }
2346
2347 if (AcceptableWithRecovery || AcceptableWithoutRecovery) {
2348 unsigned NoteID = Corrected.getCorrectionDeclAs<ImplicitParamDecl>()
2349 ? diag::note_implicit_param_decl
2350 : diag::note_previous_decl;
2351 if (SS.isEmpty())
2352 diagnoseTypo(Corrected, PDiag(diagnostic_suggest) << Name,
2353 PDiag(NoteID), AcceptableWithRecovery);
2354 else
2355 diagnoseTypo(Corrected, PDiag(diag::err_no_member_suggest)
2356 << Name << computeDeclContext(SS, false)
2357 << DroppedSpecifier << SS.getRange(),
2358 PDiag(NoteID), AcceptableWithRecovery);
2359
2360 // Tell the callee whether to try to recover.
2361 return !AcceptableWithRecovery;
2362 }
2363 }
2364 R.clear();
2365
2366 // Emit a special diagnostic for failed member lookups.
2367 // FIXME: computing the declaration context might fail here (?)
2368 if (!SS.isEmpty()) {
2369 Diag(R.getNameLoc(), diag::err_no_member)
2370 << Name << computeDeclContext(SS, false)
2371 << SS.getRange();
2372 return true;
2373 }
2374
2375 // Give up, we can't recover.
2376 Diag(R.getNameLoc(), diagnostic) << Name;
2377 return true;
2378}
2379
2380/// In Microsoft mode, if we are inside a template class whose parent class has
2381/// dependent base classes, and we can't resolve an unqualified identifier, then
2382/// assume the identifier is a member of a dependent base class. We can only
2383/// recover successfully in static methods, instance methods, and other contexts
2384/// where 'this' is available. This doesn't precisely match MSVC's
2385/// instantiation model, but it's close enough.
2386static Expr *
2387recoverFromMSUnqualifiedLookup(Sema &S, ASTContext &Context,
2388 DeclarationNameInfo &NameInfo,
2389 SourceLocation TemplateKWLoc,
2390 const TemplateArgumentListInfo *TemplateArgs) {
2391 // Only try to recover from lookup into dependent bases in static methods or
2392 // contexts where 'this' is available.
2393 QualType ThisType = S.getCurrentThisType();
2394 const CXXRecordDecl *RD = nullptr;
2395 if (!ThisType.isNull())
2396 RD = ThisType->getPointeeType()->getAsCXXRecordDecl();
2397 else if (auto *MD = dyn_cast<CXXMethodDecl>(S.CurContext))
2398 RD = MD->getParent();
2399 if (!RD || !RD->hasAnyDependentBases())
2400 return nullptr;
2401
2402 // Diagnose this as unqualified lookup into a dependent base class. If 'this'
2403 // is available, suggest inserting 'this->' as a fixit.
2404 SourceLocation Loc = NameInfo.getLoc();
2405 auto DB = S.Diag(Loc, diag::ext_undeclared_unqual_id_with_dependent_base);
2406 DB << NameInfo.getName() << RD;
2407
2408 if (!ThisType.isNull()) {
2409 DB << FixItHint::CreateInsertion(Loc, "this->");
2410 return CXXDependentScopeMemberExpr::Create(
2411 Context, /*This=*/nullptr, ThisType, /*IsArrow=*/true,
2412 /*Op=*/SourceLocation(), NestedNameSpecifierLoc(), TemplateKWLoc,
2413 /*FirstQualifierFoundInScope=*/nullptr, NameInfo, TemplateArgs);
2414 }
2415
2416 // Synthesize a fake NNS that points to the derived class. This will
2417 // perform name lookup during template instantiation.
2418 CXXScopeSpec SS;
2419 auto *NNS =
2420 NestedNameSpecifier::Create(Context, nullptr, true, RD->getTypeForDecl());
2421 SS.MakeTrivial(Context, NNS, SourceRange(Loc, Loc));
2422 return DependentScopeDeclRefExpr::Create(
2423 Context, SS.getWithLocInContext(Context), TemplateKWLoc, NameInfo,
2424 TemplateArgs);
2425}
2426
2427ExprResult
2428Sema::ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
2429 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
2430 bool HasTrailingLParen, bool IsAddressOfOperand,
2431 CorrectionCandidateCallback *CCC,
2432 bool IsInlineAsmIdentifier, Token *KeywordReplacement) {
2433 assert(!(IsAddressOfOperand && HasTrailingLParen) &&(static_cast<void> (0))
2434 "cannot be direct & operand and have a trailing lparen")(static_cast<void> (0));
2435 if (SS.isInvalid())
2436 return ExprError();
2437
2438 TemplateArgumentListInfo TemplateArgsBuffer;
2439
2440 // Decompose the UnqualifiedId into the following data.
2441 DeclarationNameInfo NameInfo;
2442 const TemplateArgumentListInfo *TemplateArgs;
2443 DecomposeUnqualifiedId(Id, TemplateArgsBuffer, NameInfo, TemplateArgs);
2444
2445 DeclarationName Name = NameInfo.getName();
2446 IdentifierInfo *II = Name.getAsIdentifierInfo();
2447 SourceLocation NameLoc = NameInfo.getLoc();
2448
2449 if (II && II->isEditorPlaceholder()) {
2450 // FIXME: When typed placeholders are supported we can create a typed
2451 // placeholder expression node.
2452 return ExprError();
2453 }
2454
2455 // C++ [temp.dep.expr]p3:
2456 // An id-expression is type-dependent if it contains:
2457 // -- an identifier that was declared with a dependent type,
2458 // (note: handled after lookup)
2459 // -- a template-id that is dependent,
2460 // (note: handled in BuildTemplateIdExpr)
2461 // -- a conversion-function-id that specifies a dependent type,
2462 // -- a nested-name-specifier that contains a class-name that
2463 // names a dependent type.
2464 // Determine whether this is a member of an unknown specialization;
2465 // we need to handle these differently.
2466 bool DependentID = false;
2467 if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName &&
2468 Name.getCXXNameType()->isDependentType()) {
2469 DependentID = true;
2470 } else if (SS.isSet()) {
2471 if (DeclContext *DC = computeDeclContext(SS, false)) {
2472 if (RequireCompleteDeclContext(SS, DC))
2473 return ExprError();
2474 } else {
2475 DependentID = true;
2476 }
2477 }
2478
2479 if (DependentID)
2480 return ActOnDependentIdExpression(SS, TemplateKWLoc, NameInfo,
2481 IsAddressOfOperand, TemplateArgs);
2482
2483 // Perform the required lookup.
2484 LookupResult R(*this, NameInfo,
2485 (Id.getKind() == UnqualifiedIdKind::IK_ImplicitSelfParam)
2486 ? LookupObjCImplicitSelfParam
2487 : LookupOrdinaryName);
2488 if (TemplateKWLoc.isValid() || TemplateArgs) {
2489 // Lookup the template name again to correctly establish the context in
2490 // which it was found. This is really unfortunate as we already did the
2491 // lookup to determine that it was a template name in the first place. If
2492 // this becomes a performance hit, we can work harder to preserve those
2493 // results until we get here but it's likely not worth it.
2494 bool MemberOfUnknownSpecialization;
2495 AssumedTemplateKind AssumedTemplate;
2496 if (LookupTemplateName(R, S, SS, QualType(), /*EnteringContext=*/false,
2497 MemberOfUnknownSpecialization, TemplateKWLoc,
2498 &AssumedTemplate))
2499 return ExprError();
2500
2501 if (MemberOfUnknownSpecialization ||
2502 (R.getResultKind() == LookupResult::NotFoundInCurrentInstantiation))
2503 return ActOnDependentIdExpression(SS, TemplateKWLoc, NameInfo,
2504 IsAddressOfOperand, TemplateArgs);
2505 } else {
2506 bool IvarLookupFollowUp = II && !SS.isSet() && getCurMethodDecl();
2507 LookupParsedName(R, S, &SS, !IvarLookupFollowUp);
2508
2509 // If the result might be in a dependent base class, this is a dependent
2510 // id-expression.
2511 if (R.getResultKind() == LookupResult::NotFoundInCurrentInstantiation)
2512 return ActOnDependentIdExpression(SS, TemplateKWLoc, NameInfo,
2513 IsAddressOfOperand, TemplateArgs);
2514
2515 // If this reference is in an Objective-C method, then we need to do
2516 // some special Objective-C lookup, too.
2517 if (IvarLookupFollowUp) {
2518 ExprResult E(LookupInObjCMethod(R, S, II, true));
2519 if (E.isInvalid())
2520 return ExprError();
2521
2522 if (Expr *Ex = E.getAs<Expr>())
2523 return Ex;
2524 }
2525 }
2526
2527 if (R.isAmbiguous())
2528 return ExprError();
2529
2530 // This could be an implicitly declared function reference (legal in C90,
2531 // extension in C99, forbidden in C++).
2532 if (R.empty() && HasTrailingLParen && II && !getLangOpts().CPlusPlus) {
2533 NamedDecl *D = ImplicitlyDefineFunction(NameLoc, *II, S);
2534 if (D) R.addDecl(D);
2535 }
2536
2537 // Determine whether this name might be a candidate for
2538 // argument-dependent lookup.
2539 bool ADL = UseArgumentDependentLookup(SS, R, HasTrailingLParen);
2540
2541 if (R.empty() && !ADL) {
2542 if (SS.isEmpty() && getLangOpts().MSVCCompat) {
2543 if (Expr *E = recoverFromMSUnqualifiedLookup(*this, Context, NameInfo,
2544 TemplateKWLoc, TemplateArgs))
2545 return E;
2546 }
2547
2548 // Don't diagnose an empty lookup for inline assembly.
2549 if (IsInlineAsmIdentifier)
2550 return ExprError();
2551
2552 // If this name wasn't predeclared and if this is not a function
2553 // call, diagnose the problem.
2554 TypoExpr *TE = nullptr;
2555 DefaultFilterCCC DefaultValidator(II, SS.isValid() ? SS.getScopeRep()
2556 : nullptr);
2557 DefaultValidator.IsAddressOfOperand = IsAddressOfOperand;
2558 assert((!CCC || CCC->IsAddressOfOperand == IsAddressOfOperand) &&(static_cast<void> (0))
2559 "Typo correction callback misconfigured")(static_cast<void> (0));
2560 if (CCC) {
2561 // Make sure the callback knows what the typo being diagnosed is.
2562 CCC->setTypoName(II);
2563 if (SS.isValid())
2564 CCC->setTypoNNS(SS.getScopeRep());
2565 }
2566 // FIXME: DiagnoseEmptyLookup produces bad diagnostics if we're looking for
2567 // a template name, but we happen to have always already looked up the name
2568 // before we get here if it must be a template name.
2569 if (DiagnoseEmptyLookup(S, SS, R, CCC ? *CCC : DefaultValidator, nullptr,
2570 None, &TE)) {
2571 if (TE && KeywordReplacement) {
2572 auto &State = getTypoExprState(TE);
2573 auto BestTC = State.Consumer->getNextCorrection();
2574 if (BestTC.isKeyword()) {
2575 auto *II = BestTC.getCorrectionAsIdentifierInfo();
2576 if (State.DiagHandler)
2577 State.DiagHandler(BestTC);
2578 KeywordReplacement->startToken();
2579 KeywordReplacement->setKind(II->getTokenID());
2580 KeywordReplacement->setIdentifierInfo(II);
2581 KeywordReplacement->setLocation(BestTC.getCorrectionRange().getBegin());
2582 // Clean up the state associated with the TypoExpr, since it has
2583 // now been diagnosed (without a call to CorrectDelayedTyposInExpr).
2584 clearDelayedTypo(TE);
2585 // Signal that a correction to a keyword was performed by returning a
2586 // valid-but-null ExprResult.
2587 return (Expr*)nullptr;
2588 }
2589 State.Consumer->resetCorrectionStream();
2590 }
2591 return TE ? TE : ExprError();
2592 }
2593
2594 assert(!R.empty() &&(static_cast<void> (0))
2595 "DiagnoseEmptyLookup returned false but added no results")(static_cast<void> (0));
2596
2597 // If we found an Objective-C instance variable, let
2598 // LookupInObjCMethod build the appropriate expression to
2599 // reference the ivar.
2600 if (ObjCIvarDecl *Ivar = R.getAsSingle<ObjCIvarDecl>()) {
2601 R.clear();
2602 ExprResult E(LookupInObjCMethod(R, S, Ivar->getIdentifier()));
2603 // In a hopelessly buggy code, Objective-C instance variable
2604 // lookup fails and no expression will be built to reference it.
2605 if (!E.isInvalid() && !E.get())
2606 return ExprError();
2607 return E;
2608 }
2609 }
2610
2611 // This is guaranteed from this point on.
2612 assert(!R.empty() || ADL)(static_cast<void> (0));
2613
2614 // Check whether this might be a C++ implicit instance member access.
2615 // C++ [class.mfct.non-static]p3:
2616 // When an id-expression that is not part of a class member access
2617 // syntax and not used to form a pointer to member is used in the
2618 // body of a non-static member function of class X, if name lookup
2619 // resolves the name in the id-expression to a non-static non-type
2620 // member of some class C, the id-expression is transformed into a
2621 // class member access expression using (*this) as the
2622 // postfix-expression to the left of the . operator.
2623 //
2624 // But we don't actually need to do this for '&' operands if R
2625 // resolved to a function or overloaded function set, because the
2626 // expression is ill-formed if it actually works out to be a
2627 // non-static member function:
2628 //
2629 // C++ [expr.ref]p4:
2630 // Otherwise, if E1.E2 refers to a non-static member function. . .
2631 // [t]he expression can be used only as the left-hand operand of a
2632 // member function call.
2633 //
2634 // There are other safeguards against such uses, but it's important
2635 // to get this right here so that we don't end up making a
2636 // spuriously dependent expression if we're inside a dependent
2637 // instance method.
2638 if (!R.empty() && (*R.begin())->isCXXClassMember()) {
2639 bool MightBeImplicitMember;
2640 if (!IsAddressOfOperand)
2641 MightBeImplicitMember = true;
2642 else if (!SS.isEmpty())
2643 MightBeImplicitMember = false;
2644 else if (R.isOverloadedResult())
2645 MightBeImplicitMember = false;
2646 else if (R.isUnresolvableResult())
2647 MightBeImplicitMember = true;
2648 else
2649 MightBeImplicitMember = isa<FieldDecl>(R.getFoundDecl()) ||
2650 isa<IndirectFieldDecl>(R.getFoundDecl()) ||
2651 isa<MSPropertyDecl>(R.getFoundDecl());
2652
2653 if (MightBeImplicitMember)
2654 return BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc,
2655 R, TemplateArgs, S);
2656 }
2657
2658 if (TemplateArgs || TemplateKWLoc.isValid()) {
2659
2660 // In C++1y, if this is a variable template id, then check it
2661 // in BuildTemplateIdExpr().
2662 // The single lookup result must be a variable template declaration.
2663 if (Id.getKind() == UnqualifiedIdKind::IK_TemplateId && Id.TemplateId &&
2664 Id.TemplateId->Kind == TNK_Var_template) {
2665 assert(R.getAsSingle<VarTemplateDecl>() &&(static_cast<void> (0))
2666 "There should only be one declaration found.")(static_cast<void> (0));
2667 }
2668
2669 return BuildTemplateIdExpr(SS, TemplateKWLoc, R, ADL, TemplateArgs);
2670 }
2671
2672 return BuildDeclarationNameExpr(SS, R, ADL);
2673}
2674
2675/// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
2676/// declaration name, generally during template instantiation.
2677/// There's a large number of things which don't need to be done along
2678/// this path.
2679ExprResult Sema::BuildQualifiedDeclarationNameExpr(
2680 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
2681 bool IsAddressOfOperand, const Scope *S, TypeSourceInfo **RecoveryTSI) {
2682 DeclContext *DC = computeDeclContext(SS, false);
2683 if (!DC)
2684 return BuildDependentDeclRefExpr(SS, /*TemplateKWLoc=*/SourceLocation(),
2685 NameInfo, /*TemplateArgs=*/nullptr);
2686
2687 if (RequireCompleteDeclContext(SS, DC))
2688 return ExprError();
2689
2690 LookupResult R(*this, NameInfo, LookupOrdinaryName);
2691 LookupQualifiedName(R, DC);
2692
2693 if (R.isAmbiguous())
2694 return ExprError();
2695
2696 if (R.getResultKind() == LookupResult::NotFoundInCurrentInstantiation)
2697 return BuildDependentDeclRefExpr(SS, /*TemplateKWLoc=*/SourceLocation(),
2698 NameInfo, /*TemplateArgs=*/nullptr);
2699
2700 if (R.empty()) {
2701 // Don't diagnose problems with invalid record decl, the secondary no_member
2702 // diagnostic during template instantiation is likely bogus, e.g. if a class
2703 // is invalid because it's derived from an invalid base class, then missing
2704 // members were likely supposed to be inherited.
2705 if (const auto *CD = dyn_cast<CXXRecordDecl>(DC))
2706 if (CD->isInvalidDecl())
2707 return ExprError();
2708 Diag(NameInfo.getLoc(), diag::err_no_member)
2709 << NameInfo.getName() << DC << SS.getRange();
2710 return ExprError();
2711 }
2712
2713 if (const TypeDecl *TD = R.getAsSingle<TypeDecl>()) {
2714 // Diagnose a missing typename if this resolved unambiguously to a type in
2715 // a dependent context. If we can recover with a type, downgrade this to
2716 // a warning in Microsoft compatibility mode.
2717 unsigned DiagID = diag::err_typename_missing;
2718 if (RecoveryTSI && getLangOpts().MSVCCompat)
2719 DiagID = diag::ext_typename_missing;
2720 SourceLocation Loc = SS.getBeginLoc();
2721 auto D = Diag(Loc, DiagID);
2722 D << SS.getScopeRep() << NameInfo.getName().getAsString()
2723 << SourceRange(Loc, NameInfo.getEndLoc());
2724
2725 // Don't recover if the caller isn't expecting us to or if we're in a SFINAE
2726 // context.
2727 if (!RecoveryTSI)
2728 return ExprError();
2729
2730 // Only issue the fixit if we're prepared to recover.
2731 D << FixItHint::CreateInsertion(Loc, "typename ");
2732
2733 // Recover by pretending this was an elaborated type.
2734 QualType Ty = Context.getTypeDeclType(TD);
2735 TypeLocBuilder TLB;
2736 TLB.pushTypeSpec(Ty).setNameLoc(NameInfo.getLoc());
2737
2738 QualType ET = getElaboratedType(ETK_None, SS, Ty);
2739 ElaboratedTypeLoc QTL = TLB.push<ElaboratedTypeLoc>(ET);
2740 QTL.setElaboratedKeywordLoc(SourceLocation());
2741 QTL.setQualifierLoc(SS.getWithLocInContext(Context));
2742
2743 *RecoveryTSI = TLB.getTypeSourceInfo(Context, ET);
2744
2745 return ExprEmpty();
2746 }
2747
2748 // Defend against this resolving to an implicit member access. We usually
2749 // won't get here if this might be a legitimate a class member (we end up in
2750 // BuildMemberReferenceExpr instead), but this can be valid if we're forming
2751 // a pointer-to-member or in an unevaluated context in C++11.
2752 if (!R.empty() && (*R.begin())->isCXXClassMember() && !IsAddressOfOperand)
2753 return BuildPossibleImplicitMemberExpr(SS,
2754 /*TemplateKWLoc=*/SourceLocation(),
2755 R, /*TemplateArgs=*/nullptr, S);
2756
2757 return BuildDeclarationNameExpr(SS, R, /* ADL */ false);
2758}
2759
2760/// The parser has read a name in, and Sema has detected that we're currently
2761/// inside an ObjC method. Perform some additional checks and determine if we
2762/// should form a reference to an ivar.
2763///
2764/// Ideally, most of this would be done by lookup, but there's
2765/// actually quite a lot of extra work involved.
2766DeclResult Sema::LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S,
2767 IdentifierInfo *II) {
2768 SourceLocation Loc = Lookup.getNameLoc();
2769 ObjCMethodDecl *CurMethod = getCurMethodDecl();
2770
2771 // Check for error condition which is already reported.
2772 if (!CurMethod)
2773 return DeclResult(true);
2774
2775 // There are two cases to handle here. 1) scoped lookup could have failed,
2776 // in which case we should look for an ivar. 2) scoped lookup could have
2777 // found a decl, but that decl is outside the current instance method (i.e.
2778 // a global variable). In these two cases, we do a lookup for an ivar with
2779 // this name, if the lookup sucedes, we replace it our current decl.
2780
2781 // If we're in a class method, we don't normally want to look for
2782 // ivars. But if we don't find anything else, and there's an
2783 // ivar, that's an error.
2784 bool IsClassMethod = CurMethod->isClassMethod();
2785
2786 bool LookForIvars;
2787 if (Lookup.empty())
2788 LookForIvars = true;
2789 else if (IsClassMethod)
2790 LookForIvars = false;
2791 else
2792 LookForIvars = (Lookup.isSingleResult() &&
2793 Lookup.getFoundDecl()->isDefinedOutsideFunctionOrMethod());
2794 ObjCInterfaceDecl *IFace = nullptr;
2795 if (LookForIvars) {
2796 IFace = CurMethod->getClassInterface();
2797 ObjCInterfaceDecl *ClassDeclared;
2798 ObjCIvarDecl *IV = nullptr;
2799 if (IFace && (IV = IFace->lookupInstanceVariable(II, ClassDeclared))) {
2800 // Diagnose using an ivar in a class method.
2801 if (IsClassMethod) {
2802 Diag(Loc, diag::err_ivar_use_in_class_method) << IV->getDeclName();
2803 return DeclResult(true);
2804 }
2805
2806 // Diagnose the use of an ivar outside of the declaring class.
2807 if (IV->getAccessControl() == ObjCIvarDecl::Private &&
2808 !declaresSameEntity(ClassDeclared, IFace) &&
2809 !getLangOpts().DebuggerSupport)
2810 Diag(Loc, diag::err_private_ivar_access) << IV->getDeclName();
2811
2812 // Success.
2813 return IV;
2814 }
2815 } else if (CurMethod->isInstanceMethod()) {
2816 // We should warn if a local variable hides an ivar.
2817 if (ObjCInterfaceDecl *IFace = CurMethod->getClassInterface()) {
2818 ObjCInterfaceDecl *ClassDeclared;
2819 if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(II, ClassDeclared)) {
2820 if (IV->getAccessControl() != ObjCIvarDecl::Private ||
2821 declaresSameEntity(IFace, ClassDeclared))
2822 Diag(Loc, diag::warn_ivar_use_hidden) << IV->getDeclName();
2823 }
2824 }
2825 } else if (Lookup.isSingleResult() &&
2826 Lookup.getFoundDecl()->isDefinedOutsideFunctionOrMethod()) {
2827 // If accessing a stand-alone ivar in a class method, this is an error.
2828 if (const ObjCIvarDecl *IV =
2829 dyn_cast<ObjCIvarDecl>(Lookup.getFoundDecl())) {
2830 Diag(Loc, diag::err_ivar_use_in_class_method) << IV->getDeclName();
2831 return DeclResult(true);
2832 }
2833 }
2834
2835 // Didn't encounter an error, didn't find an ivar.
2836 return DeclResult(false);
2837}
2838
2839ExprResult Sema::BuildIvarRefExpr(Scope *S, SourceLocation Loc,
2840 ObjCIvarDecl *IV) {
2841 ObjCMethodDecl *CurMethod = getCurMethodDecl();
2842 assert(CurMethod && CurMethod->isInstanceMethod() &&(static_cast<void> (0))
2843 "should not reference ivar from this context")(static_cast<void> (0));
2844
2845 ObjCInterfaceDecl *IFace = CurMethod->getClassInterface();
2846 assert(IFace && "should not reference ivar from this context")(static_cast<void> (0));
2847
2848 // If we're referencing an invalid decl, just return this as a silent
2849 // error node. The error diagnostic was already emitted on the decl.
2850 if (IV->isInvalidDecl())
2851 return ExprError();
2852
2853 // Check if referencing a field with __attribute__((deprecated)).
2854 if (DiagnoseUseOfDecl(IV, Loc))
2855 return ExprError();
2856
2857 // FIXME: This should use a new expr for a direct reference, don't
2858 // turn this into Self->ivar, just return a BareIVarExpr or something.
2859 IdentifierInfo &II = Context.Idents.get("self");
2860 UnqualifiedId SelfName;
2861 SelfName.setImplicitSelfParam(&II);
2862 CXXScopeSpec SelfScopeSpec;
2863 SourceLocation TemplateKWLoc;
2864 ExprResult SelfExpr =
2865 ActOnIdExpression(S, SelfScopeSpec, TemplateKWLoc, SelfName,
2866 /*HasTrailingLParen=*/false,
2867 /*IsAddressOfOperand=*/false);
2868 if (SelfExpr.isInvalid())
2869 return ExprError();
2870
2871 SelfExpr = DefaultLvalueConversion(SelfExpr.get());
2872 if (SelfExpr.isInvalid())
2873 return ExprError();
2874
2875 MarkAnyDeclReferenced(Loc, IV, true);
2876
2877 ObjCMethodFamily MF = CurMethod->getMethodFamily();
2878 if (MF != OMF_init && MF != OMF_dealloc && MF != OMF_finalize &&
2879 !IvarBacksCurrentMethodAccessor(IFace, CurMethod, IV))
2880 Diag(Loc, diag::warn_direct_ivar_access) << IV->getDeclName();
2881
2882 ObjCIvarRefExpr *Result = new (Context)
2883 ObjCIvarRefExpr(IV, IV->getUsageType(SelfExpr.get()->getType()), Loc,
2884 IV->getLocation(), SelfExpr.get(), true, true);
2885
2886 if (IV->getType().getObjCLifetime() == Qualifiers::OCL_Weak) {
2887 if (!isUnevaluatedContext() &&
2888 !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, Loc))
2889 getCurFunction()->recordUseOfWeak(Result);
2890 }
2891 if (getLangOpts().ObjCAutoRefCount)
2892 if (const BlockDecl *BD = CurContext->getInnermostBlockDecl())
2893 ImplicitlyRetainedSelfLocs.push_back({Loc, BD});
2894
2895 return Result;
2896}
2897
2898/// The parser has read a name in, and Sema has detected that we're currently
2899/// inside an ObjC method. Perform some additional checks and determine if we
2900/// should form a reference to an ivar. If so, build an expression referencing
2901/// that ivar.
2902ExprResult
2903Sema::LookupInObjCMethod(LookupResult &Lookup, Scope *S,
2904 IdentifierInfo *II, bool AllowBuiltinCreation) {
2905 // FIXME: Integrate this lookup step into LookupParsedName.
2906 DeclResult Ivar = LookupIvarInObjCMethod(Lookup, S, II);
2907 if (Ivar.isInvalid())
2908 return ExprError();
2909 if (Ivar.isUsable())
2910 return BuildIvarRefExpr(S, Lookup.getNameLoc(),
2911 cast<ObjCIvarDecl>(Ivar.get()));
2912
2913 if (Lookup.empty() && II && AllowBuiltinCreation)
2914 LookupBuiltin(Lookup);
2915
2916 // Sentinel value saying that we didn't do anything special.
2917 return ExprResult(false);
2918}
2919
2920/// Cast a base object to a member's actual type.
2921///
2922/// There are two relevant checks:
2923///
2924/// C++ [class.access.base]p7:
2925///
2926/// If a class member access operator [...] is used to access a non-static
2927/// data member or non-static member function, the reference is ill-formed if
2928/// the left operand [...] cannot be implicitly converted to a pointer to the
2929/// naming class of the right operand.
2930///
2931/// C++ [expr.ref]p7:
2932///
2933/// If E2 is a non-static data member or a non-static member function, the
2934/// program is ill-formed if the class of which E2 is directly a member is an
2935/// ambiguous base (11.8) of the naming class (11.9.3) of E2.
2936///
2937/// Note that the latter check does not consider access; the access of the
2938/// "real" base class is checked as appropriate when checking the access of the
2939/// member name.
2940ExprResult
2941Sema::PerformObjectMemberConversion(Expr *From,
2942 NestedNameSpecifier *Qualifier,
2943 NamedDecl *FoundDecl,
2944 NamedDecl *Member) {
2945 CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(Member->getDeclContext());
2946 if (!RD)
2947 return From;
2948
2949 QualType DestRecordType;
2950 QualType DestType;
2951 QualType FromRecordType;
2952 QualType FromType = From->getType();
2953 bool PointerConversions = false;
2954 if (isa<FieldDecl>(Member)) {
2955 DestRecordType = Context.getCanonicalType(Context.getTypeDeclType(RD));
2956 auto FromPtrType = FromType->getAs<PointerType>();
2957 DestRecordType = Context.getAddrSpaceQualType(
2958 DestRecordType, FromPtrType
2959 ? FromType->getPointeeType().getAddressSpace()
2960 : FromType.getAddressSpace());
2961
2962 if (FromPtrType) {
2963 DestType = Context.getPointerType(DestRecordType);
2964 FromRecordType = FromPtrType->getPointeeType();
2965 PointerConversions = true;
2966 } else {
2967 DestType = DestRecordType;
2968 FromRecordType = FromType;
2969 }
2970 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Member)) {
2971 if (Method->isStatic())
2972 return From;
2973
2974 DestType = Method->getThisType();
2975 DestRecordType = DestType->getPointeeType();
2976
2977 if (FromType->getAs<PointerType>()) {
2978 FromRecordType = FromType->getPointeeType();
2979 PointerConversions = true;
2980 } else {
2981 FromRecordType = FromType;
2982 DestType = DestRecordType;
2983 }
2984
2985 LangAS FromAS = FromRecordType.getAddressSpace();
2986 LangAS DestAS = DestRecordType.getAddressSpace();
2987 if (FromAS != DestAS) {
2988 QualType FromRecordTypeWithoutAS =
2989 Context.removeAddrSpaceQualType(FromRecordType);
2990 QualType FromTypeWithDestAS =
2991 Context.getAddrSpaceQualType(FromRecordTypeWithoutAS, DestAS);
2992 if (PointerConversions)
2993 FromTypeWithDestAS = Context.getPointerType(FromTypeWithDestAS);
2994 From = ImpCastExprToType(From, FromTypeWithDestAS,
2995 CK_AddressSpaceConversion, From->getValueKind())
2996 .get();
2997 }
2998 } else {
2999 // No conversion necessary.
3000 return From;
3001 }
3002
3003 if (DestType->isDependentType() || FromType->isDependentType())
3004 return From;
3005
3006 // If the unqualified types are the same, no conversion is necessary.
3007 if (Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3008 return From;
3009
3010 SourceRange FromRange = From->getSourceRange();
3011 SourceLocation FromLoc = FromRange.getBegin();
3012
3013 ExprValueKind VK = From->getValueKind();
3014
3015 // C++ [class.member.lookup]p8:
3016 // [...] Ambiguities can often be resolved by qualifying a name with its
3017 // class name.
3018 //
3019 // If the member was a qualified name and the qualified referred to a
3020 // specific base subobject type, we'll cast to that intermediate type
3021 // first and then to the object in which the member is declared. That allows
3022 // one to resolve ambiguities in, e.g., a diamond-shaped hierarchy such as:
3023 //
3024 // class Base { public: int x; };
3025 // class Derived1 : public Base { };
3026 // class Derived2 : public Base { };
3027 // class VeryDerived : public Derived1, public Derived2 { void f(); };
3028 //
3029 // void VeryDerived::f() {
3030 // x = 17; // error: ambiguous base subobjects
3031 // Derived1::x = 17; // okay, pick the Base subobject of Derived1
3032 // }
3033 if (Qualifier && Qualifier->getAsType()) {
3034 QualType QType = QualType(Qualifier->getAsType(), 0);
3035 assert(QType->isRecordType() && "lookup done with non-record type")(static_cast<void> (0));
3036
3037 QualType QRecordType = QualType(QType->getAs<RecordType>(), 0);
3038
3039 // In C++98, the qualifier type doesn't actually have to be a base
3040 // type of the object type, in which case we just ignore it.
3041 // Otherwise build the appropriate casts.
3042 if (IsDerivedFrom(FromLoc, FromRecordType, QRecordType)) {
3043 CXXCastPath BasePath;
3044 if (CheckDerivedToBaseConversion(FromRecordType, QRecordType,
3045 FromLoc, FromRange, &BasePath))
3046 return ExprError();
3047
3048 if (PointerConversions)
3049 QType = Context.getPointerType(QType);
3050 From = ImpCastExprToType(From, QType, CK_UncheckedDerivedToBase,
3051 VK, &BasePath).get();
3052
3053 FromType = QType;
3054 FromRecordType = QRecordType;
3055
3056 // If the qualifier type was the same as the destination type,
3057 // we're done.
3058 if (Context.hasSameUnqualifiedType(FromRecordType, DestRecordType))
3059 return From;
3060 }
3061 }
3062
3063 CXXCastPath BasePath;
3064 if (CheckDerivedToBaseConversion(FromRecordType, DestRecordType,
3065 FromLoc, FromRange, &BasePath,
3066 /*IgnoreAccess=*/true))
3067 return ExprError();
3068
3069 return ImpCastExprToType(From, DestType, CK_UncheckedDerivedToBase,
3070 VK, &BasePath);
3071}
3072
3073bool Sema::UseArgumentDependentLookup(const CXXScopeSpec &SS,
3074 const LookupResult &R,
3075 bool HasTrailingLParen) {
3076 // Only when used directly as the postfix-expression of a call.
3077 if (!HasTrailingLParen)
3078 return false;
3079
3080 // Never if a scope specifier was provided.
3081 if (SS.isSet())
3082 return false;
3083
3084 // Only in C++ or ObjC++.
3085 if (!getLangOpts().CPlusPlus)
3086 return false;
3087
3088 // Turn off ADL when we find certain kinds of declarations during
3089 // normal lookup:
3090 for (NamedDecl *D : R) {
3091 // C++0x [basic.lookup.argdep]p3:
3092 // -- a declaration of a class member
3093 // Since using decls preserve this property, we check this on the
3094 // original decl.
3095 if (D->isCXXClassMember())
3096 return false;
3097
3098 // C++0x [basic.lookup.argdep]p3:
3099 // -- a block-scope function declaration that is not a
3100 // using-declaration
3101 // NOTE: we also trigger this for function templates (in fact, we
3102 // don't check the decl type at all, since all other decl types
3103 // turn off ADL anyway).
3104 if (isa<UsingShadowDecl>(D))
3105 D = cast<UsingShadowDecl>(D)->getTargetDecl();
3106 else if (D->getLexicalDeclContext()->isFunctionOrMethod())
3107 return false;
3108
3109 // C++0x [basic.lookup.argdep]p3:
3110 // -- a declaration that is neither a function or a function
3111 // template
3112 // And also for builtin functions.
3113 if (isa<FunctionDecl>(D)) {
3114 FunctionDecl *FDecl = cast<FunctionDecl>(D);
3115
3116 // But also builtin functions.
3117 if (FDecl->getBuiltinID() && FDecl->isImplicit())
3118 return false;
3119 } else if (!isa<FunctionTemplateDecl>(D))
3120 return false;
3121 }
3122
3123 return true;
3124}
3125
3126
3127/// Diagnoses obvious problems with the use of the given declaration
3128/// as an expression. This is only actually called for lookups that
3129/// were not overloaded, and it doesn't promise that the declaration
3130/// will in fact be used.
3131static bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D) {
3132 if (D->isInvalidDecl())
3133 return true;
3134
3135 if (isa<TypedefNameDecl>(D)) {
3136 S.Diag(Loc, diag::err_unexpected_typedef) << D->getDeclName();
3137 return true;
3138 }
3139
3140 if (isa<ObjCInterfaceDecl>(D)) {
3141 S.Diag(Loc, diag::err_unexpected_interface) << D->getDeclName();
3142 return true;
3143 }
3144
3145 if (isa<NamespaceDecl>(D)) {
3146 S.Diag(Loc, diag::err_unexpected_namespace) << D->getDeclName();
3147 return true;
3148 }
3149
3150 return false;
3151}
3152
3153// Certain multiversion types should be treated as overloaded even when there is
3154// only one result.
3155static bool ShouldLookupResultBeMultiVersionOverload(const LookupResult &R) {
3156 assert(R.isSingleResult() && "Expected only a single result")(static_cast<void> (0));
3157 const auto *FD = dyn_cast<FunctionDecl>(R.getFoundDecl());
3158 return FD &&
3159 (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion());
3160}
3161
3162ExprResult Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS,
3163 LookupResult &R, bool NeedsADL,
3164 bool AcceptInvalidDecl) {
3165 // If this is a single, fully-resolved result and we don't need ADL,
3166 // just build an ordinary singleton decl ref.
3167 if (!NeedsADL && R.isSingleResult() &&
3168 !R.getAsSingle<FunctionTemplateDecl>() &&
3169 !ShouldLookupResultBeMultiVersionOverload(R))
3170 return BuildDeclarationNameExpr(SS, R.getLookupNameInfo(), R.getFoundDecl(),
3171 R.getRepresentativeDecl(), nullptr,
3172 AcceptInvalidDecl);
3173
3174 // We only need to check the declaration if there's exactly one
3175 // result, because in the overloaded case the results can only be
3176 // functions and function templates.
3177 if (R.isSingleResult() && !ShouldLookupResultBeMultiVersionOverload(R) &&
3178 CheckDeclInExpr(*this, R.getNameLoc(), R.getFoundDecl()))
3179 return ExprError();
3180
3181 // Otherwise, just build an unresolved lookup expression. Suppress
3182 // any lookup-related diagnostics; we'll hash these out later, when
3183 // we've picked a target.
3184 R.suppressDiagnostics();
3185
3186 UnresolvedLookupExpr *ULE
3187 = UnresolvedLookupExpr::Create(Context, R.getNamingClass(),
3188 SS.getWithLocInContext(Context),
3189 R.getLookupNameInfo(),
3190 NeedsADL, R.isOverloadedResult(),
3191 R.begin(), R.end());
3192
3193 return ULE;
3194}
3195
3196static void
3197diagnoseUncapturableValueReference(Sema &S, SourceLocation loc,
3198 ValueDecl *var, DeclContext *DC);
3199
3200/// Complete semantic analysis for a reference to the given declaration.
3201ExprResult Sema::BuildDeclarationNameExpr(
3202 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
3203 NamedDecl *FoundD, const TemplateArgumentListInfo *TemplateArgs,
3204 bool AcceptInvalidDecl) {
3205 assert(D && "Cannot refer to a NULL declaration")(static_cast<void> (0));
3206 assert(!isa<FunctionTemplateDecl>(D) &&(static_cast<void> (0))
3207 "Cannot refer unambiguously to a function template")(static_cast<void> (0));
3208
3209 SourceLocation Loc = NameInfo.getLoc();
3210 if (CheckDeclInExpr(*this, Loc, D))
3211 return ExprError();
3212
3213 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(D)) {
3214 // Specifically diagnose references to class templates that are missing
3215 // a template argument list.
3216 diagnoseMissingTemplateArguments(TemplateName(Template), Loc);
3217 return ExprError();
3218 }
3219
3220 // Make sure that we're referring to a value.
3221 if (!isa<ValueDecl, UnresolvedUsingIfExistsDecl>(D)) {
3222 Diag(Loc, diag::err_ref_non_value) << D << SS.getRange();
3223 Diag(D->getLocation(), diag::note_declared_at);
3224 return ExprError();
3225 }
3226
3227 // Check whether this declaration can be used. Note that we suppress
3228 // this check when we're going to perform argument-dependent lookup
3229 // on this function name, because this might not be the function
3230 // that overload resolution actually selects.
3231 if (DiagnoseUseOfDecl(D, Loc))
3232 return ExprError();
3233
3234 auto *VD = cast<ValueDecl>(D);
3235
3236 // Only create DeclRefExpr's for valid Decl's.
3237 if (VD->isInvalidDecl() && !AcceptInvalidDecl)
3238 return ExprError();
3239
3240 // Handle members of anonymous structs and unions. If we got here,
3241 // and the reference is to a class member indirect field, then this
3242 // must be the subject of a pointer-to-member expression.
3243 if (IndirectFieldDecl *indirectField = dyn_cast<IndirectFieldDecl>(VD))
3244 if (!indirectField->isCXXClassMember())
3245 return BuildAnonymousStructUnionMemberReference(SS, NameInfo.getLoc(),
3246 indirectField);
3247
3248 QualType type = VD->getType();
3249 if (type.isNull())
3250 return ExprError();
3251 ExprValueKind valueKind = VK_PRValue;
3252
3253 // In 'T ...V;', the type of the declaration 'V' is 'T...', but the type of
3254 // a reference to 'V' is simply (unexpanded) 'T'. The type, like the value,
3255 // is expanded by some outer '...' in the context of the use.
3256 type = type.getNonPackExpansionType();
3257
3258 switch (D->getKind()) {
3259 // Ignore all the non-ValueDecl kinds.
3260#define ABSTRACT_DECL(kind)
3261#define VALUE(type, base)
3262#define DECL(type, base) case Decl::type:
3263#include "clang/AST/DeclNodes.inc"
3264 llvm_unreachable("invalid value decl kind")__builtin_unreachable();
3265
3266 // These shouldn't make it here.
3267 case Decl::ObjCAtDefsField:
3268 llvm_unreachable("forming non-member reference to ivar?")__builtin_unreachable();
3269
3270 // Enum constants are always r-values and never references.
3271 // Unresolved using declarations are dependent.
3272 case Decl::EnumConstant:
3273 case Decl::UnresolvedUsingValue:
3274 case Decl::OMPDeclareReduction:
3275 case Decl::OMPDeclareMapper:
3276 valueKind = VK_PRValue;
3277 break;
3278
3279 // Fields and indirect fields that got here must be for
3280 // pointer-to-member expressions; we just call them l-values for
3281 // internal consistency, because this subexpression doesn't really
3282 // exist in the high-level semantics.
3283 case Decl::Field:
3284 case Decl::IndirectField:
3285 case Decl::ObjCIvar:
3286 assert(getLangOpts().CPlusPlus && "building reference to field in C?")(static_cast<void> (0));
3287
3288 // These can't have reference type in well-formed programs, but
3289 // for internal consistency we do this anyway.
3290 type = type.getNonReferenceType();
3291 valueKind = VK_LValue;
3292 break;
3293
3294 // Non-type template parameters are either l-values or r-values
3295 // depending on the type.
3296 case Decl::NonTypeTemplateParm: {
3297 if (const ReferenceType *reftype = type->getAs<ReferenceType>()) {
3298 type = reftype->getPointeeType();
3299 valueKind = VK_LValue; // even if the parameter is an r-value reference
3300 break;
3301 }
3302
3303 // [expr.prim.id.unqual]p2:
3304 // If the entity is a template parameter object for a template
3305 // parameter of type T, the type of the expression is const T.
3306 // [...] The expression is an lvalue if the entity is a [...] template
3307 // parameter object.
3308 if (type->isRecordType()) {
3309 type = type.getUnqualifiedType().withConst();
3310 valueKind = VK_LValue;
3311 break;
3312 }
3313
3314 // For non-references, we need to strip qualifiers just in case
3315 // the template parameter was declared as 'const int' or whatever.
3316 valueKind = VK_PRValue;
3317 type = type.getUnqualifiedType();
3318 break;
3319 }
3320
3321 case Decl::Var:
3322 case Decl::VarTemplateSpecialization:
3323 case Decl::VarTemplatePartialSpecialization:
3324 case Decl::Decomposition:
3325 case Decl::OMPCapturedExpr:
3326 // In C, "extern void blah;" is valid and is an r-value.
3327 if (!getLangOpts().CPlusPlus && !type.hasQualifiers() &&
3328 type->isVoidType()) {
3329 valueKind = VK_PRValue;
3330 break;
3331 }
3332 LLVM_FALLTHROUGH[[gnu::fallthrough]];
3333
3334 case Decl::ImplicitParam:
3335 case Decl::ParmVar: {
3336 // These are always l-values.
3337 valueKind = VK_LValue;
3338 type = type.getNonReferenceType();
3339
3340 // FIXME: Does the addition of const really only apply in
3341 // potentially-evaluated contexts? Since the variable isn't actually
3342 // captured in an unevaluated context, it seems that the answer is no.
3343 if (!isUnevaluatedContext()) {
3344 QualType CapturedType = getCapturedDeclRefType(cast<VarDecl>(VD), Loc);
3345 if (!CapturedType.isNull())
3346 type = CapturedType;
3347 }
3348
3349 break;
3350 }
3351
3352 case Decl::Binding: {
3353 // These are always lvalues.
3354 valueKind = VK_LValue;
3355 type = type.getNonReferenceType();
3356 // FIXME: Support lambda-capture of BindingDecls, once CWG actually
3357 // decides how that's supposed to work.
3358 auto *BD = cast<BindingDecl>(VD);
3359 if (BD->getDeclContext() != CurContext) {
3360 auto *DD = dyn_cast_or_null<VarDecl>(BD->getDecomposedDecl());
3361 if (DD && DD->hasLocalStorage())
3362 diagnoseUncapturableValueReference(*this, Loc, BD, CurContext);
3363 }
3364 break;
3365 }
3366
3367 case Decl::Function: {
3368 if (unsigned BID = cast<FunctionDecl>(VD)->getBuiltinID()) {
3369 if (!Context.BuiltinInfo.isPredefinedLibFunction(BID)) {
3370 type = Context.BuiltinFnTy;
3371 valueKind = VK_PRValue;
3372 break;
3373 }
3374 }
3375
3376 const FunctionType *fty = type->castAs<FunctionType>();
3377
3378 // If we're referring to a function with an __unknown_anytype
3379 // result type, make the entire expression __unknown_anytype.
3380 if (fty->getReturnType() == Context.UnknownAnyTy) {
3381 type = Context.UnknownAnyTy;
3382 valueKind = VK_PRValue;
3383 break;
3384 }
3385
3386 // Functions are l-values in C++.
3387 if (getLangOpts().CPlusPlus) {
3388 valueKind = VK_LValue;
3389 break;
3390 }
3391
3392 // C99 DR 316 says that, if a function type comes from a
3393 // function definition (without a prototype), that type is only
3394 // used for checking compatibility. Therefore, when referencing
3395 // the function, we pretend that we don't have the full function
3396 // type.
3397 if (!cast<FunctionDecl>(VD)->hasPrototype() && isa<FunctionProtoType>(fty))
3398 type = Context.getFunctionNoProtoType(fty->getReturnType(),
3399 fty->getExtInfo());
3400
3401 // Functions are r-values in C.
3402 valueKind = VK_PRValue;
3403 break;
3404 }
3405
3406 case Decl::CXXDeductionGuide:
3407 llvm_unreachable("building reference to deduction guide")__builtin_unreachable();
3408
3409 case Decl::MSProperty:
3410 case Decl::MSGuid:
3411 case Decl::TemplateParamObject:
3412 // FIXME: Should MSGuidDecl and template parameter objects be subject to
3413 // capture in OpenMP, or duplicated between host and device?
3414 valueKind = VK_LValue;
3415 break;
3416
3417 case Decl::CXXMethod:
3418 // If we're referring to a method with an __unknown_anytype
3419 // result type, make the entire expression __unknown_anytype.
3420 // This should only be possible with a type written directly.
3421 if (const FunctionProtoType *proto =
3422 dyn_cast<FunctionProtoType>(VD->getType()))
3423 if (proto->getReturnType() == Context.UnknownAnyTy) {
3424 type = Context.UnknownAnyTy;
3425 valueKind = VK_PRValue;
3426 break;
3427 }
3428
3429 // C++ methods are l-values if static, r-values if non-static.
3430 if (cast<CXXMethodDecl>(VD)->isStatic()) {
3431 valueKind = VK_LValue;
3432 break;
3433 }
3434 LLVM_FALLTHROUGH[[gnu::fallthrough]];
3435
3436 case Decl::CXXConversion:
3437 case Decl::CXXDestructor:
3438 case Decl::CXXConstructor:
3439 valueKind = VK_PRValue;
3440 break;
3441 }
3442
3443 return BuildDeclRefExpr(VD, type, valueKind, NameInfo, &SS, FoundD,
3444 /*FIXME: TemplateKWLoc*/ SourceLocation(),
3445 TemplateArgs);
3446}
3447
3448static void ConvertUTF8ToWideString(unsigned CharByteWidth, StringRef Source,
3449 SmallString<32> &Target) {
3450 Target.resize(CharByteWidth * (Source.size() + 1));
3451 char *ResultPtr = &Target[0];
3452 const llvm::UTF8 *ErrorPtr;
3453 bool success =
3454 llvm::ConvertUTF8toWide(CharByteWidth, Source, ResultPtr, ErrorPtr);
3455 (void)success;
3456 assert(success)(static_cast<void> (0));
3457 Target.resize(ResultPtr - &Target[0]);
3458}
3459
3460ExprResult Sema::BuildPredefinedExpr(SourceLocation Loc,
3461 PredefinedExpr::IdentKind IK) {
3462 // Pick the current block, lambda, captured statement or function.
3463 Decl *currentDecl = nullptr;
3464 if (const BlockScopeInfo *BSI = getCurBlock())
3465 currentDecl = BSI->TheDecl;
3466 else if (const LambdaScopeInfo *LSI = getCurLambda())
3467 currentDecl = LSI->CallOperator;
3468 else if (const CapturedRegionScopeInfo *CSI = getCurCapturedRegion())
3469 currentDecl = CSI->TheCapturedDecl;
3470 else
3471 currentDecl = getCurFunctionOrMethodDecl();
3472
3473 if (!currentDecl) {
3474 Diag(Loc, diag::ext_predef_outside_function);
3475 currentDecl = Context.getTranslationUnitDecl();
3476 }
3477
3478 QualType ResTy;
3479 StringLiteral *SL = nullptr;
3480 if (cast<DeclContext>(currentDecl)->isDependentContext())
3481 ResTy = Context.DependentTy;
3482 else {
3483 // Pre-defined identifiers are of type char[x], where x is the length of
3484 // the string.
3485 auto Str = PredefinedExpr::ComputeName(IK, currentDecl);
3486 unsigned Length = Str.length();
3487
3488 llvm::APInt LengthI(32, Length + 1);
3489 if (IK == PredefinedExpr::LFunction || IK == PredefinedExpr::LFuncSig) {
3490 ResTy =
3491 Context.adjustStringLiteralBaseType(Context.WideCharTy.withConst());
3492 SmallString<32> RawChars;
3493 ConvertUTF8ToWideString(Context.getTypeSizeInChars(ResTy).getQuantity(),
3494 Str, RawChars);
3495 ResTy = Context.getConstantArrayType(ResTy, LengthI, nullptr,
3496 ArrayType::Normal,
3497 /*IndexTypeQuals*/ 0);
3498 SL = StringLiteral::Create(Context, RawChars, StringLiteral::Wide,
3499 /*Pascal*/ false, ResTy, Loc);
3500 } else {
3501 ResTy = Context.adjustStringLiteralBaseType(Context.CharTy.withConst());
3502 ResTy = Context.getConstantArrayType(ResTy, LengthI, nullptr,
3503 ArrayType::Normal,
3504 /*IndexTypeQuals*/ 0);
3505 SL = StringLiteral::Create(Context, Str, StringLiteral::Ascii,
3506 /*Pascal*/ false, ResTy, Loc);
3507 }
3508 }
3509
3510 return PredefinedExpr::Create(Context, Loc, ResTy, IK, SL);
3511}
3512
3513ExprResult Sema::BuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
3514 SourceLocation LParen,
3515 SourceLocation RParen,
3516 TypeSourceInfo *TSI) {
3517 return SYCLUniqueStableNameExpr::Create(Context, OpLoc, LParen, RParen, TSI);
3518}
3519
3520ExprResult Sema::ActOnSYCLUniqueStableNameExpr(SourceLocation OpLoc,
3521 SourceLocation LParen,
3522 SourceLocation RParen,
3523 ParsedType ParsedTy) {
3524 TypeSourceInfo *TSI = nullptr;
3525 QualType Ty = GetTypeFromParser(ParsedTy, &TSI);
3526
3527 if (Ty.isNull())
3528 return ExprError();
3529 if (!TSI)
3530 TSI = Context.getTrivialTypeSourceInfo(Ty, LParen);
3531
3532 return BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
3533}
3534
3535ExprResult Sema::ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind) {
3536 PredefinedExpr::IdentKind IK;
3537
3538 switch (Kind) {
3539 default: llvm_unreachable("Unknown simple primary expr!")__builtin_unreachable();
3540 case tok::kw___func__: IK = PredefinedExpr::Func; break; // [C99 6.4.2.2]
3541 case tok::kw___FUNCTION__: IK = PredefinedExpr::Function; break;
3542 case tok::kw___FUNCDNAME__: IK = PredefinedExpr::FuncDName; break; // [MS]
3543 case tok::kw___FUNCSIG__: IK = PredefinedExpr::FuncSig; break; // [MS]
3544 case tok::kw_L__FUNCTION__: IK = PredefinedExpr::LFunction; break; // [MS]
3545 case tok::kw_L__FUNCSIG__: IK = PredefinedExpr::LFuncSig; break; // [MS]
3546 case tok::kw___PRETTY_FUNCTION__: IK = PredefinedExpr::PrettyFunction; break;
3547 }
3548
3549 return BuildPredefinedExpr(Loc, IK);
3550}
3551
3552ExprResult Sema::ActOnCharacterConstant(const Token &Tok, Scope *UDLScope) {
3553 SmallString<16> CharBuffer;
3554 bool Invalid = false;
3555 StringRef ThisTok = PP.getSpelling(Tok, CharBuffer, &Invalid);
3556 if (Invalid)
3557 return ExprError();
3558
3559 CharLiteralParser Literal(ThisTok.begin(), ThisTok.end(), Tok.getLocation(),
3560 PP, Tok.getKind());
3561 if (Literal.hadError())
3562 return ExprError();
3563
3564 QualType Ty;
3565 if (Literal.isWide())
3566 Ty = Context.WideCharTy; // L'x' -> wchar_t in C and C++.
3567 else if (Literal.isUTF8() && getLangOpts().Char8)
3568 Ty = Context.Char8Ty; // u8'x' -> char8_t when it exists.
3569 else if (Literal.isUTF16())
3570 Ty = Context.Char16Ty; // u'x' -> char16_t in C11 and C++11.
3571 else if (Literal.isUTF32())
3572 Ty = Context.Char32Ty; // U'x' -> char32_t in C11 and C++11.
3573 else if (!getLangOpts().CPlusPlus || Literal.isMultiChar())
3574 Ty = Context.IntTy; // 'x' -> int in C, 'wxyz' -> int in C++.
3575 else
3576 Ty = Context.CharTy; // 'x' -> char in C++
3577
3578 CharacterLiteral::CharacterKind Kind = CharacterLiteral::Ascii;
3579 if (Literal.isWide())
3580 Kind = CharacterLiteral::Wide;
3581 else if (Literal.isUTF16())
3582 Kind = CharacterLiteral::UTF16;
3583 else if (Literal.isUTF32())
3584 Kind = CharacterLiteral::UTF32;
3585 else if (Literal.isUTF8())
3586 Kind = CharacterLiteral::UTF8;
3587
3588 Expr *Lit = new (Context) CharacterLiteral(Literal.getValue(), Kind, Ty,
3589 Tok.getLocation());
3590
3591 if (Literal.getUDSuffix().empty())
3592 return Lit;
3593
3594 // We're building a user-defined literal.
3595 IdentifierInfo *UDSuffix = &Context.Idents.get(Literal.getUDSuffix());
3596 SourceLocation UDSuffixLoc =
3597 getUDSuffixLoc(*this, Tok.getLocation(), Literal.getUDSuffixOffset());
3598
3599 // Make sure we're allowed user-defined literals here.
3600 if (!UDLScope)
3601 return ExprError(Diag(UDSuffixLoc, diag::err_invalid_character_udl));
3602
3603 // C++11 [lex.ext]p6: The literal L is treated as a call of the form
3604 // operator "" X (ch)
3605 return BuildCookedLiteralOperatorCall(*this, UDLScope, UDSuffix, UDSuffixLoc,
3606 Lit, Tok.getLocation());
3607}
3608
3609ExprResult Sema::ActOnIntegerConstant(SourceLocation Loc, uint64_t Val) {
3610 unsigned IntSize = Context.getTargetInfo().getIntWidth();
3611 return IntegerLiteral::Create(Context, llvm::APInt(IntSize, Val),
3612 Context.IntTy, Loc);
3613}
3614
3615static Expr *BuildFloatingLiteral(Sema &S, NumericLiteralParser &Literal,
3616 QualType Ty, SourceLocation Loc) {
3617 const llvm::fltSemantics &Format = S.Context.getFloatTypeSemantics(Ty);
3618
3619 using llvm::APFloat;
3620 APFloat Val(Format);
3621
3622 APFloat::opStatus result = Literal.GetFloatValue(Val);
3623
3624 // Overflow is always an error, but underflow is only an error if
3625 // we underflowed to zero (APFloat reports denormals as underflow).
3626 if ((result & APFloat::opOverflow) ||
3627 ((result & APFloat::opUnderflow) && Val.isZero())) {
3628 unsigned diagnostic;
3629 SmallString<20> buffer;
3630 if (result & APFloat::opOverflow) {
3631 diagnostic = diag::warn_float_overflow;
3632 APFloat::getLargest(Format).toString(buffer);
3633 } else {
3634 diagnostic = diag::warn_float_underflow;
3635 APFloat::getSmallest(Format).toString(buffer);
3636 }
3637
3638 S.Diag(Loc, diagnostic)
3639 << Ty
3640 << StringRef(buffer.data(), buffer.size());
3641 }
3642
3643 bool isExact = (result == APFloat::opOK);
3644 return FloatingLiteral::Create(S.Context, Val, isExact, Ty, Loc);
3645}
3646
3647bool Sema::CheckLoopHintExpr(Expr *E, SourceLocation Loc) {
3648 assert(E && "Invalid expression")(static_cast<void> (0));
3649
3650 if (E->isValueDependent())
3651 return false;
3652
3653 QualType QT = E->getType();
3654 if (!QT->isIntegerType() || QT->isBooleanType() || QT->isCharType()) {
3655 Diag(E->getExprLoc(), diag::err_pragma_loop_invalid_argument_type) << QT;
3656 return true;
3657 }
3658
3659 llvm::APSInt ValueAPS;
3660 ExprResult R = VerifyIntegerConstantExpression(E, &ValueAPS);
3661
3662 if (R.isInvalid())
3663 return true;
3664
3665 bool ValueIsPositive = ValueAPS.isStrictlyPositive();
3666 if (!ValueIsPositive || ValueAPS.getActiveBits() > 31) {
3667 Diag(E->getExprLoc(), diag::err_pragma_loop_invalid_argument_value)
3668 << toString(ValueAPS, 10) << ValueIsPositive;
3669 return true;
3670 }
3671
3672 return false;
3673}
3674
3675ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
3676 // Fast path for a single digit (which is quite common). A single digit
3677 // cannot have a trigraph, escaped newline, radix prefix, or suffix.
3678 if (Tok.getLength() == 1) {
3679 const char Val = PP.getSpellingOfSingleCharacterNumericConstant(Tok);
3680 return ActOnIntegerConstant(Tok.getLocation(), Val-'0');
3681 }
3682
3683 SmallString<128> SpellingBuffer;
3684 // NumericLiteralParser wants to overread by one character. Add padding to
3685 // the buffer in case the token is copied to the buffer. If getSpelling()
3686 // returns a StringRef to the memory buffer, it should have a null char at
3687 // the EOF, so it is also safe.
3688 SpellingBuffer.resize(Tok.getLength() + 1);
3689
3690 // Get the spelling of the token, which eliminates trigraphs, etc.
3691 bool Invalid = false;
3692 StringRef TokSpelling = PP.getSpelling(Tok, SpellingBuffer, &Invalid);
3693 if (Invalid)
3694 return ExprError();
3695
3696 NumericLiteralParser Literal(TokSpelling, Tok.getLocation(),
3697 PP.getSourceManager(), PP.getLangOpts(),
3698 PP.getTargetInfo(), PP.getDiagnostics());
3699 if (Literal.hadError)
3700 return ExprError();
3701
3702 if (Literal.hasUDSuffix()) {
3703 // We're building a user-defined literal.
3704 IdentifierInfo *UDSuffix = &Context.Idents.get(Literal.getUDSuffix());
3705 SourceLocation UDSuffixLoc =
3706 getUDSuffixLoc(*this, Tok.getLocation(), Literal.getUDSuffixOffset());
3707
3708 // Make sure we're allowed user-defined literals here.
3709 if (!UDLScope)
3710 return ExprError(Diag(UDSuffixLoc, diag::err_invalid_numeric_udl));
3711
3712 QualType CookedTy;
3713 if (Literal.isFloatingLiteral()) {
3714 // C++11 [lex.ext]p4: If S contains a literal operator with parameter type
3715 // long double, the literal is treated as a call of the form
3716 // operator "" X (f L)
3717 CookedTy = Context.LongDoubleTy;
3718 } else {
3719 // C++11 [lex.ext]p3: If S contains a literal operator with parameter type
3720 // unsigned long long, the literal is treated as a call of the form
3721 // operator "" X (n ULL)
3722 CookedTy = Context.UnsignedLongLongTy;
3723 }
3724
3725 DeclarationName OpName =
3726 Context.DeclarationNames.getCXXLiteralOperatorName(UDSuffix);
3727 DeclarationNameInfo OpNameInfo(OpName, UDSuffixLoc);
3728 OpNameInfo.setCXXLiteralOperatorNameLoc(UDSuffixLoc);
3729
3730 SourceLocation TokLoc = Tok.getLocation();
3731
3732 // Perform literal operator lookup to determine if we're building a raw
3733 // literal or a cooked one.
3734 LookupResult R(*this, OpName, UDSuffixLoc, LookupOrdinaryName);
3735 switch (LookupLiteralOperator(UDLScope, R, CookedTy,
3736 /*AllowRaw*/ true, /*AllowTemplate*/ true,
3737 /*AllowStringTemplatePack*/ false,
3738 /*DiagnoseMissing*/ !Literal.isImaginary)) {
3739 case LOLR_ErrorNoDiagnostic:
3740 // Lookup failure for imaginary constants isn't fatal, there's still the
3741 // GNU extension producing _Complex types.
3742 break;
3743 case LOLR_Error:
3744 return ExprError();
3745 case LOLR_Cooked: {
3746 Expr *Lit;
3747 if (Literal.isFloatingLiteral()) {
3748 Lit = BuildFloatingLiteral(*this, Literal, CookedTy, Tok.getLocation());
3749 } else {
3750 llvm::APInt ResultVal(Context.getTargetInfo().getLongLongWidth(), 0);
3751 if (Literal.GetIntegerValue(ResultVal))
3752 Diag(Tok.getLocation(), diag::err_integer_literal_too_large)
3753 << /* Unsigned */ 1;
3754 Lit = IntegerLiteral::Create(Context, ResultVal, CookedTy,
3755 Tok.getLocation());
3756 }
3757 return BuildLiteralOperatorCall(R, OpNameInfo, Lit, TokLoc);
3758 }
3759
3760 case LOLR_Raw: {
3761 // C++11 [lit.ext]p3, p4: If S contains a raw literal operator, the
3762 // literal is treated as a call of the form
3763 // operator "" X ("n")
3764 unsigned Length = Literal.getUDSuffixOffset();
3765 QualType StrTy = Context.getConstantArrayType(
3766 Context.adjustStringLiteralBaseType(Context.CharTy.withConst()),
3767 llvm::APInt(32, Length + 1), nullptr, ArrayType::Normal, 0);
3768 Expr *Lit = StringLiteral::Create(
3769 Context, StringRef(TokSpelling.data(), Length), StringLiteral::Ascii,
3770 /*Pascal*/false, StrTy, &TokLoc, 1);
3771 return BuildLiteralOperatorCall(R, OpNameInfo, Lit, TokLoc);
3772 }
3773
3774 case LOLR_Template: {
3775 // C++11 [lit.ext]p3, p4: Otherwise (S contains a literal operator
3776 // template), L is treated as a call fo the form
3777 // operator "" X <'c1', 'c2', ... 'ck'>()
3778 // where n is the source character sequence c1 c2 ... ck.
3779 TemplateArgumentListInfo ExplicitArgs;
3780 unsigned CharBits = Context.getIntWidth(Context.CharTy);
3781 bool CharIsUnsigned = Context.CharTy->isUnsignedIntegerType();
3782 llvm::APSInt Value(CharBits, CharIsUnsigned);
3783 for (unsigned I = 0, N = Literal.getUDSuffixOffset(); I != N; ++I) {
3784 Value = TokSpelling[I];
3785 TemplateArgument Arg(Context, Value, Context.CharTy);
3786 TemplateArgumentLocInfo ArgInfo;
3787 ExplicitArgs.addArgument(TemplateArgumentLoc(Arg, ArgInfo));
3788 }
3789 return BuildLiteralOperatorCall(R, OpNameInfo, None, TokLoc,
3790 &ExplicitArgs);
3791 }
3792 case LOLR_StringTemplatePack:
3793 llvm_unreachable("unexpected literal operator lookup result")__builtin_unreachable();
3794 }
3795 }
3796
3797 Expr *Res;
3798
3799 if (Literal.isFixedPointLiteral()) {
3800 QualType Ty;
3801
3802 if (Literal.isAccum) {
3803 if (Literal.isHalf) {
3804 Ty = Context.ShortAccumTy;
3805 } else if (Literal.isLong) {
3806 Ty = Context.LongAccumTy;
3807 } else {
3808 Ty = Context.AccumTy;
3809 }
3810 } else if (Literal.isFract) {
3811 if (Literal.isHalf) {
3812 Ty = Context.ShortFractTy;
3813 } else if (Literal.isLong) {
3814 Ty = Context.LongFractTy;
3815 } else {
3816 Ty = Context.FractTy;
3817 }
3818 }
3819
3820 if (Literal.isUnsigned) Ty = Context.getCorrespondingUnsignedType(Ty);
3821
3822 bool isSigned = !Literal.isUnsigned;
3823 unsigned scale = Context.getFixedPointScale(Ty);
3824 unsigned bit_width = Context.getTypeInfo(Ty).Width;
3825
3826 llvm::APInt Val(bit_width, 0, isSigned);
3827 bool Overflowed = Literal.GetFixedPointValue(Val, scale);
3828 bool ValIsZero = Val.isNullValue() && !Overflowed;
3829
3830 auto MaxVal = Context.getFixedPointMax(Ty).getValue();
3831 if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)
3832 // Clause 6.4.4 - The value of a constant shall be in the range of
3833 // representable values for its type, with exception for constants of a
3834 // fract type with a value of exactly 1; such a constant shall denote
3835 // the maximal value for the type.
3836 --Val;
3837 else if (Val.ugt(MaxVal) || Overflowed)
3838 Diag(Tok.getLocation(), diag::err_too_large_for_fixed_point);
3839
3840 Res = FixedPointLiteral::CreateFromRawInt(Context, Val, Ty,
3841 Tok.getLocation(), scale);
3842 } else if (Literal.isFloatingLiteral()) {
3843 QualType Ty;
3844 if (Literal.isHalf){
3845 if (getOpenCLOptions().isAvailableOption("cl_khr_fp16", getLangOpts()))
3846 Ty = Context.HalfTy;
3847 else {
3848 Diag(Tok.getLocation(), diag::err_half_const_requires_fp16);
3849 return ExprError();
3850 }
3851 } else if (Literal.isFloat)
3852 Ty = Context.FloatTy;
3853 else if (Literal.isLong)
3854 Ty = Context.LongDoubleTy;
3855 else if (Literal.isFloat16)
3856 Ty = Context.Float16Ty;
3857 else if (Literal.isFloat128)
3858 Ty = Context.Float128Ty;
3859 else
3860 Ty = Context.DoubleTy;
3861
3862 Res = BuildFloatingLiteral(*this, Literal, Ty, Tok.getLocation());
3863
3864 if (Ty == Context.DoubleTy) {
3865 if (getLangOpts().SinglePrecisionConstants) {
3866 if (Ty->castAs<BuiltinType>()->getKind() != BuiltinType::Float) {
3867 Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
3868 }
3869 } else if (getLangOpts().OpenCL && !getOpenCLOptions().isAvailableOption(
3870 "cl_khr_fp64", getLangOpts())) {
3871 // Impose single-precision float type when cl_khr_fp64 is not enabled.
3872 Diag(Tok.getLocation(), diag::warn_double_const_requires_fp64)
3873 << (getLangOpts().getOpenCLCompatibleVersion() >= 300);
3874 Res = ImpCastExprToType(Res, Context.FloatTy, CK_FloatingCast).get();
3875 }
3876 }
3877 } else if (!Literal.isIntegerLiteral()) {
3878 return ExprError();
3879 } else {
3880 QualType Ty;
3881
3882 // 'long long' is a C99 or C++11 feature.
3883 if (!getLangOpts().C99 && Literal.isLongLong) {
3884 if (getLangOpts().CPlusPlus)
3885 Diag(Tok.getLocation(),
3886 getLangOpts().CPlusPlus11 ?
3887 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
3888 else
3889 Diag(Tok.getLocation(), diag::ext_c99_longlong);
3890 }
3891
3892 // 'z/uz' literals are a C++2b feature.
3893 if (Literal.isSizeT)
3894 Diag(Tok.getLocation(), getLangOpts().CPlusPlus
3895 ? getLangOpts().CPlusPlus2b
3896 ? diag::warn_cxx20_compat_size_t_suffix
3897 : diag::ext_cxx2b_size_t_suffix
3898 : diag::err_cxx2b_size_t_suffix);
3899
3900 // Get the value in the widest-possible width.
3901 unsigned MaxWidth = Context.getTargetInfo().getIntMaxTWidth();
3902 llvm::APInt ResultVal(MaxWidth, 0);
3903
3904 if (Literal.GetIntegerValue(ResultVal)) {
3905 // If this value didn't fit into uintmax_t, error and force to ull.
3906 Diag(Tok.getLocation(), diag::err_integer_literal_too_large)
3907 << /* Unsigned */ 1;
3908 Ty = Context.UnsignedLongLongTy;
3909 assert(Context.getTypeSize(Ty) == ResultVal.getBitWidth() &&(static_cast<void> (0))
3910 "long long is not intmax_t?")(static_cast<void> (0));
3911 } else {
3912 // If this value fits into a ULL, try to figure out what else it fits into
3913 // according to the rules of C99 6.4.4.1p5.
3914
3915 // Octal, Hexadecimal, and integers with a U suffix are allowed to
3916 // be an unsigned int.
3917 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
3918
3919 // Check from smallest to largest, picking the smallest type we can.
3920 unsigned Width = 0;
3921
3922 // Microsoft specific integer suffixes are explicitly sized.
3923 if (Literal.MicrosoftInteger) {
3924 if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
3925 Width = 8;
3926 Ty = Context.CharTy;
3927 } else {
3928 Width = Literal.MicrosoftInteger;
3929 Ty = Context.getIntTypeForBitwidth(Width,
3930 /*Signed=*/!Literal.isUnsigned);
3931 }
3932 }
3933
3934 // Check C++2b size_t literals.
3935 if (Literal.isSizeT) {
3936 assert(!Literal.MicrosoftInteger &&(static_cast<void> (0))
3937 "size_t literals can't be Microsoft literals")(static_cast<void> (0));
3938 unsigned SizeTSize = Context.getTargetInfo().getTypeWidth(
3939 Context.getTargetInfo().getSizeType());
3940
3941 // Does it fit in size_t?
3942 if (ResultVal.isIntN(SizeTSize)) {
3943 // Does it fit in ssize_t?
3944 if (!Literal.isUnsigned && ResultVal[SizeTSize - 1] == 0)
3945 Ty = Context.getSignedSizeType();
3946 else if (AllowUnsigned)
3947 Ty = Context.getSizeType();
3948 Width = SizeTSize;
3949 }
3950 }
3951
3952 if (Ty.isNull() && !Literal.isLong && !Literal.isLongLong &&
3953 !Literal.isSizeT) {
3954 // Are int/unsigned possibilities?
3955 unsigned IntSize = Context.getTargetInfo().getIntWidth();
3956
3957 // Does it fit in a unsigned int?
3958 if (ResultVal.isIntN(IntSize)) {
3959 // Does it fit in a signed int?
3960 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
3961 Ty = Context.IntTy;
3962 else if (AllowUnsigned)
3963 Ty = Context.UnsignedIntTy;
3964 Width = IntSize;
3965 }
3966 }
3967
3968 // Are long/unsigned long possibilities?
3969 if (Ty.isNull() && !Literal.isLongLong && !Literal.isSizeT) {
3970 unsigned LongSize = Context.getTargetInfo().getLongWidth();
3971
3972 // Does it fit in a unsigned long?
3973 if (ResultVal.isIntN(LongSize)) {
3974 // Does it fit in a signed long?
3975 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
3976 Ty = Context.LongTy;
3977 else if (AllowUnsigned)
3978 Ty = Context.UnsignedLongTy;
3979 // Check according to the rules of C90 6.1.3.2p5. C++03 [lex.icon]p2
3980 // is compatible.
3981 else if (!getLangOpts().C99 && !getLangOpts().CPlusPlus11) {
3982 const unsigned LongLongSize =
3983 Context.getTargetInfo().getLongLongWidth();
3984 Diag(Tok.getLocation(),
3985 getLangOpts().CPlusPlus
3986 ? Literal.isLong
3987 ? diag::warn_old_implicitly_unsigned_long_cxx
3988 : /*C++98 UB*/ diag::
3989 ext_old_implicitly_unsigned_long_cxx
3990 : diag::warn_old_implicitly_unsigned_long)
3991 << (LongLongSize > LongSize ? /*will have type 'long long'*/ 0
3992 : /*will be ill-formed*/ 1);
3993 Ty = Context.UnsignedLongTy;
3994 }
3995 Width = LongSize;
3996 }
3997 }
3998
3999 // Check long long if needed.
4000 if (Ty.isNull() && !Literal.isSizeT) {
4001 unsigned LongLongSize = Context.getTargetInfo().getLongLongWidth();
4002
4003 // Does it fit in a unsigned long long?
4004 if (ResultVal.isIntN(LongLongSize)) {
4005 // Does it fit in a signed long long?
4006 // To be compatible with MSVC, hex integer literals ending with the
4007 // LL or i64 suffix are always signed in Microsoft mode.
4008 if (!Literal.isUnsigned && (ResultVal[LongLongSize-1] == 0 ||
4009 (getLangOpts().MSVCCompat && Literal.isLongLong)))
4010 Ty = Context.LongLongTy;
4011 else if (AllowUnsigned)
4012 Ty = Context.UnsignedLongLongTy;
4013 Width = LongLongSize;
4014 }
4015 }
4016
4017 // If we still couldn't decide a type, we either have 'size_t' literal
4018 // that is out of range, or a decimal literal that does not fit in a
4019 // signed long long and has no U suffix.
4020 if (Ty.isNull()) {
4021 if (Literal.isSizeT)
4022 Diag(Tok.getLocation(), diag::err_size_t_literal_too_large)
4023 << Literal.isUnsigned;
4024 else
4025 Diag(Tok.getLocation(),
4026 diag::ext_integer_literal_too_large_for_signed);
4027 Ty = Context.UnsignedLongLongTy;
4028 Width = Context.getTargetInfo().getLongLongWidth();
4029 }
4030
4031 if (ResultVal.getBitWidth() != Width)
4032 ResultVal = ResultVal.trunc(Width);
4033 }
4034 Res = IntegerLiteral::Create(Context, ResultVal, Ty, Tok.getLocation());
4035 }
4036
4037 // If this is an imaginary literal, create the ImaginaryLiteral wrapper.
4038 if (Literal.isImaginary) {
4039 Res = new (Context) ImaginaryLiteral(Res,
4040 Context.getComplexType(Res->getType()));
4041
4042 Diag(Tok.getLocation(), diag::ext_imaginary_constant);
4043 }
4044 return Res;
4045}
4046
4047ExprResult Sema::ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E) {
4048 assert(E && "ActOnParenExpr() missing expr")(static_cast<void> (0));
4049 QualType ExprTy = E->getType();
4050 if (getLangOpts().ProtectParens && CurFPFeatures.getAllowFPReassociate() &&
4051 !E->isLValue() && ExprTy->hasFloatingRepresentation())
4052 return BuildBuiltinCallExpr(R, Builtin::BI__arithmetic_fence, E);
4053 return new (Context) ParenExpr(L, R, E);
4054}
4055
4056static bool CheckVecStepTraitOperandType(Sema &S, QualType T,
4057 SourceLocation Loc,
4058 SourceRange ArgRange) {
4059 // [OpenCL 1.1 6.11.12] "The vec_step built-in function takes a built-in
4060 // scalar or vector data type argument..."
4061 // Every built-in scalar type (OpenCL 1.1 6.1.1) is either an arithmetic
4062 // type (C99 6.2.5p18) or void.
4063 if (!(T->isArithmeticType() || T->isVoidType() || T->isVectorType())) {
4064 S.Diag(Loc, diag::err_vecstep_non_scalar_vector_type)
4065 << T << ArgRange;
4066 return true;
4067 }
4068
4069 assert((T->isVoidType() || !T->isIncompleteType()) &&(static_cast<void> (0))
4070 "Scalar types should always be complete")(static_cast<void> (0));
4071 return false;
4072}
4073
4074static bool CheckExtensionTraitOperandType(Sema &S, QualType T,
4075 SourceLocation Loc,
4076 SourceRange ArgRange,
4077 UnaryExprOrTypeTrait TraitKind) {
4078 // Invalid types must be hard errors for SFINAE in C++.
4079 if (S.LangOpts.CPlusPlus)
4080 return true;
4081
4082 // C99 6.5.3.4p1:
4083 if (T->isFunctionType() &&
4084 (TraitKind == UETT_SizeOf || TraitKind == UETT_AlignOf ||
4085 TraitKind == UETT_PreferredAlignOf)) {
4086 // sizeof(function)/alignof(function) is allowed as an extension.
4087 S.Diag(Loc, diag::ext_sizeof_alignof_function_type)
4088 << getTraitSpelling(TraitKind) << ArgRange;
4089 return false;
4090 }
4091
4092 // Allow sizeof(void)/alignof(void) as an extension, unless in OpenCL where
4093 // this is an error (OpenCL v1.1 s6.3.k)
4094 if (T->isVoidType()) {
4095 unsigned DiagID = S.LangOpts.OpenCL ? diag::err_opencl_sizeof_alignof_type
4096 : diag::ext_sizeof_alignof_void_type;
4097 S.Diag(Loc, DiagID) << getTraitSpelling(TraitKind) << ArgRange;
4098 return false;
4099 }
4100
4101 return true;
4102}
4103
4104static bool CheckObjCTraitOperandConstraints(Sema &S, QualType T,
4105 SourceLocation Loc,
4106 SourceRange ArgRange,
4107 UnaryExprOrTypeTrait TraitKind) {
4108 // Reject sizeof(interface) and sizeof(interface<proto>) if the
4109 // runtime doesn't allow it.
4110 if (!S.LangOpts.ObjCRuntime.allowsSizeofAlignof() && T->isObjCObjectType()) {
4111 S.Diag(Loc, diag::err_sizeof_nonfragile_interface)
4112 << T << (TraitKind == UETT_SizeOf)
4113 << ArgRange;
4114 return true;
4115 }
4116
4117 return false;
4118}
4119
4120/// Check whether E is a pointer from a decayed array type (the decayed
4121/// pointer type is equal to T) and emit a warning if it is.
4122static void warnOnSizeofOnArrayDecay(Sema &S, SourceLocation Loc, QualType T,
4123 Expr *E) {
4124 // Don't warn if the operation changed the type.
4125 if (T != E->getType())
4126 return;
4127
4128 // Now look for array decays.
4129 ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E);
4130 if (!ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
4131 return;
4132
4133 S.Diag(Loc, diag::warn_sizeof_array_decay) << ICE->getSourceRange()
4134 << ICE->getType()
4135 << ICE->getSubExpr()->getType();
4136}
4137
4138/// Check the constraints on expression operands to unary type expression
4139/// and type traits.
4140///
4141/// Completes any types necessary and validates the constraints on the operand
4142/// expression. The logic mostly mirrors the type-based overload, but may modify
4143/// the expression as it completes the type for that expression through template
4144/// instantiation, etc.
4145bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E,
4146 UnaryExprOrTypeTrait ExprKind) {
4147 QualType ExprTy = E->getType();
4148 assert(!ExprTy->isReferenceType())(static_cast<void> (0));
4149
4150 bool IsUnevaluatedOperand =
4151 (ExprKind == UETT_SizeOf || ExprKind == UETT_AlignOf ||
4152 ExprKind == UETT_PreferredAlignOf || ExprKind == UETT_VecStep);
4153 if (IsUnevaluatedOperand) {
4154 ExprResult Result = CheckUnevaluatedOperand(E);
4155 if (Result.isInvalid())
4156 return true;
4157 E = Result.get();
4158 }
4159
4160 // The operand for sizeof and alignof is in an unevaluated expression context,
4161 // so side effects could result in unintended consequences.
4162 // Exclude instantiation-dependent expressions, because 'sizeof' is sometimes
4163 // used to build SFINAE gadgets.
4164 // FIXME: Should we consider instantiation-dependent operands to 'alignof'?
4165 if (IsUnevaluatedOperand && !inTemplateInstantiation() &&
4166 !E->isInstantiationDependent() &&
4167 E->HasSideEffects(Context, false))
4168 Diag(E->getExprLoc(), diag::warn_side_effects_unevaluated_context);
4169
4170 if (ExprKind == UETT_VecStep)
4171 return CheckVecStepTraitOperandType(*this, ExprTy, E->getExprLoc(),
4172 E->getSourceRange());
4173
4174 // Explicitly list some types as extensions.
4175 if (!CheckExtensionTraitOperandType(*this, ExprTy, E->getExprLoc(),
4176 E->getSourceRange(), ExprKind))
4177 return false;
4178
4179 // 'alignof' applied to an expression only requires the base element type of
4180 // the expression to be complete. 'sizeof' requires the expression's type to
4181 // be complete (and will attempt to complete it if it's an array of unknown
4182 // bound).
4183 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4184 if (RequireCompleteSizedType(
4185 E->getExprLoc(), Context.getBaseElementType(E->getType()),
4186 diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4187 getTraitSpelling(ExprKind), E->getSourceRange()))
4188 return true;
4189 } else {
4190 if (RequireCompleteSizedExprType(
4191 E, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4192 getTraitSpelling(ExprKind), E->getSourceRange()))
4193 return true;
4194 }
4195
4196 // Completing the expression's type may have changed it.
4197 ExprTy = E->getType();
4198 assert(!ExprTy->isReferenceType())(static_cast<void> (0));
4199
4200 if (ExprTy->isFunctionType()) {
4201 Diag(E->getExprLoc(), diag::err_sizeof_alignof_function_type)
4202 << getTraitSpelling(ExprKind) << E->getSourceRange();
4203 return true;
4204 }
4205
4206 if (CheckObjCTraitOperandConstraints(*this, ExprTy, E->getExprLoc(),
4207 E->getSourceRange(), ExprKind))
4208 return true;
4209
4210 if (ExprKind == UETT_SizeOf) {
4211 if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E->IgnoreParens())) {
4212 if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {
4213 QualType OType = PVD->getOriginalType();
4214 QualType Type = PVD->getType();
4215 if (Type->isPointerType() && OType->isArrayType()) {
4216 Diag(E->getExprLoc(), diag::warn_sizeof_array_param)
4217 << Type << OType;
4218 Diag(PVD->getLocation(), diag::note_declared_at);
4219 }
4220 }
4221 }
4222
4223 // Warn on "sizeof(array op x)" and "sizeof(x op array)", where the array
4224 // decays into a pointer and returns an unintended result. This is most
4225 // likely a typo for "sizeof(array) op x".
4226 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E->IgnoreParens())) {
4227 warnOnSizeofOnArrayDecay(*this, BO->getOperatorLoc(), BO->getType(),
4228 BO->getLHS());
4229 warnOnSizeofOnArrayDecay(*this, BO->getOperatorLoc(), BO->getType(),
4230 BO->getRHS());
4231 }
4232 }
4233
4234 return false;
4235}
4236
4237/// Check the constraints on operands to unary expression and type
4238/// traits.
4239///
4240/// This will complete any types necessary, and validate the various constraints
4241/// on those operands.
4242///
4243/// The UsualUnaryConversions() function is *not* called by this routine.
4244/// C99 6.3.2.1p[2-4] all state:
4245/// Except when it is the operand of the sizeof operator ...
4246///
4247/// C++ [expr.sizeof]p4
4248/// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
4249/// standard conversions are not applied to the operand of sizeof.
4250///
4251/// This policy is followed for all of the unary trait expressions.
4252bool Sema::CheckUnaryExprOrTypeTraitOperand(QualType ExprType,
4253 SourceLocation OpLoc,
4254 SourceRange ExprRange,
4255 UnaryExprOrTypeTrait ExprKind) {
4256 if (ExprType->isDependentType())
4257 return false;
4258
4259 // C++ [expr.sizeof]p2:
4260 // When applied to a reference or a reference type, the result
4261 // is the size of the referenced type.
4262 // C++11 [expr.alignof]p3:
4263 // When alignof is applied to a reference type, the result
4264 // shall be the alignment of the referenced type.
4265 if (const ReferenceType *Ref = ExprType->getAs<ReferenceType>())
4266 ExprType = Ref->getPointeeType();
4267
4268 // C11 6.5.3.4/3, C++11 [expr.alignof]p3:
4269 // When alignof or _Alignof is applied to an array type, the result
4270 // is the alignment of the element type.
4271 if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf ||
4272 ExprKind == UETT_OpenMPRequiredSimdAlign)
4273 ExprType = Context.getBaseElementType(ExprType);
4274
4275 if (ExprKind == UETT_VecStep)
4276 return CheckVecStepTraitOperandType(*this, ExprType, OpLoc, ExprRange);
4277
4278 // Explicitly list some types as extensions.
4279 if (!CheckExtensionTraitOperandType(*this, ExprType, OpLoc, ExprRange,
4280 ExprKind))
4281 return false;
4282
4283 if (RequireCompleteSizedType(
4284 OpLoc, ExprType, diag::err_sizeof_alignof_incomplete_or_sizeless_type,
4285 getTraitSpelling(ExprKind), ExprRange))
4286 return true;
4287
4288 if (ExprType->isFunctionType()) {
4289 Diag(OpLoc, diag::err_sizeof_alignof_function_type)
4290 << getTraitSpelling(ExprKind) << ExprRange;
4291 return true;
4292 }
4293
4294 if (CheckObjCTraitOperandConstraints(*this, ExprType, OpLoc, ExprRange,
4295 ExprKind))
4296 return true;
4297
4298 return false;
4299}
4300
4301static bool CheckAlignOfExpr(Sema &S, Expr *E, UnaryExprOrTypeTrait ExprKind) {
4302 // Cannot know anything else if the expression is dependent.
4303 if (E->isTypeDependent())
4304 return false;
4305
4306 if (E->getObjectKind() == OK_BitField) {
4307 S.Diag(E->getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield)
4308 << 1 << E->getSourceRange();
4309 return true;
4310 }
4311
4312 ValueDecl *D = nullptr;
4313 Expr *Inner = E->IgnoreParens();
4314 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Inner)) {
4315 D = DRE->getDecl();
4316 } else if (MemberExpr *ME = dyn_cast<MemberExpr>(Inner)) {
4317 D = ME->getMemberDecl();
4318 }
4319
4320 // If it's a field, require the containing struct to have a
4321 // complete definition so that we can compute the layout.
4322 //
4323 // This can happen in C++11 onwards, either by naming the member
4324 // in a way that is not transformed into a member access expression
4325 // (in an unevaluated operand, for instance), or by naming the member
4326 // in a trailing-return-type.
4327 //
4328 // For the record, since __alignof__ on expressions is a GCC
4329 // extension, GCC seems to permit this but always gives the
4330 // nonsensical answer 0.
4331 //
4332 // We don't really need the layout here --- we could instead just
4333 // directly check for all the appropriate alignment-lowing
4334 // attributes --- but that would require duplicating a lot of
4335 // logic that just isn't worth duplicating for such a marginal
4336 // use-case.
4337 if (FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
4338 // Fast path this check, since we at least know the record has a
4339 // definition if we can find a member of it.
4340 if (!FD->getParent()->isCompleteDefinition()) {
4341 S.Diag(E->getExprLoc(), diag::err_alignof_member_of_incomplete_type)
4342 << E->getSourceRange();
4343 return true;
4344 }
4345
4346 // Otherwise, if it's a field, and the field doesn't have
4347 // reference type, then it must have a complete type (or be a
4348 // flexible array member, which we explicitly want to
4349 // white-list anyway), which makes the following checks trivial.
4350 if (!FD->getType()->isReferenceType())
4351 return false;
4352 }
4353
4354 return S.CheckUnaryExprOrTypeTraitOperand(E, ExprKind);
4355}
4356
4357bool Sema::CheckVecStepExpr(Expr *E) {
4358 E = E->IgnoreParens();
4359
4360 // Cannot know anything else if the expression is dependent.
4361 if (E->isTypeDependent())
4362 return false;
4363
4364 return CheckUnaryExprOrTypeTraitOperand(E, UETT_VecStep);
4365}
4366
4367static void captureVariablyModifiedType(ASTContext &Context, QualType T,
4368 CapturingScopeInfo *CSI) {
4369 assert(T->isVariablyModifiedType())(static_cast<void> (0));
4370 assert(CSI != nullptr)(static_cast<void> (0));
4371
4372 // We're going to walk down into the type and look for VLA expressions.
4373 do {
4374 const Type *Ty = T.getTypePtr();
4375 switch (Ty->getTypeClass()) {
4376#define TYPE(Class, Base)
4377#define ABSTRACT_TYPE(Class, Base)
4378#define NON_CANONICAL_TYPE(Class, Base)
4379#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4380#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
4381#include "clang/AST/TypeNodes.inc"
4382 T = QualType();
4383 break;
4384 // These types are never variably-modified.
4385 case Type::Builtin:
4386 case Type::Complex:
4387 case Type::Vector:
4388 case Type::ExtVector:
4389 case Type::ConstantMatrix:
4390 case Type::Record:
4391 case Type::Enum:
4392 case Type::Elaborated:
4393 case Type::TemplateSpecialization:
4394 case Type::ObjCObject:
4395 case Type::ObjCInterface:
4396 case Type::ObjCObjectPointer:
4397 case Type::ObjCTypeParam:
4398 case Type::Pipe:
4399 case Type::ExtInt:
4400 llvm_unreachable("type class is never variably-modified!")__builtin_unreachable();
4401 case Type::Adjusted:
4402 T = cast<AdjustedType>(Ty)->getOriginalType();
4403 break;
4404 case Type::Decayed:
4405 T = cast<DecayedType>(Ty)->getPointeeType();
4406 break;
4407 case Type::Pointer:
4408 T = cast<PointerType>(Ty)->getPointeeType();
4409 break;
4410 case Type::BlockPointer:
4411 T = cast<BlockPointerType>(Ty)->getPointeeType();
4412 break;
4413 case Type::LValueReference:
4414 case Type::RValueReference:
4415 T = cast<ReferenceType>(Ty)->getPointeeType();
4416 break;
4417 case Type::MemberPointer:
4418 T = cast<MemberPointerType>(Ty)->getPointeeType();
4419 break;
4420 case Type::ConstantArray:
4421 case Type::IncompleteArray:
4422 // Losing element qualification here is fine.
4423 T = cast<ArrayType>(Ty)->getElementType();
4424 break;
4425 case Type::VariableArray: {
4426 // Losing element qualification here is fine.
4427 const VariableArrayType *VAT = cast<VariableArrayType>(Ty);
4428
4429 // Unknown size indication requires no size computation.
4430 // Otherwise, evaluate and record it.
4431 auto Size = VAT->getSizeExpr();
4432 if (Size && !CSI->isVLATypeCaptured(VAT) &&
4433 (isa<CapturedRegionScopeInfo>(CSI) || isa<LambdaScopeInfo>(CSI)))
4434 CSI->addVLATypeCapture(Size->getExprLoc(), VAT, Context.getSizeType());
4435
4436 T = VAT->getElementType();
4437 break;
4438 }
4439 case Type::FunctionProto:
4440 case Type::FunctionNoProto:
4441 T = cast<FunctionType>(Ty)->getReturnType();
4442 break;
4443 case Type::Paren:
4444 case Type::TypeOf:
4445 case Type::UnaryTransform:
4446 case Type::Attributed:
4447 case Type::SubstTemplateTypeParm:
4448 case Type::MacroQualified:
4449 // Keep walking after single level desugaring.
4450 T = T.getSingleStepDesugaredType(Context);
4451 break;
4452 case Type::Typedef:
4453 T = cast<TypedefType>(Ty)->desugar();
4454 break;
4455 case Type::Decltype:
4456 T = cast<DecltypeType>(Ty)->desugar();
4457 break;
4458 case Type::Auto:
4459 case Type::DeducedTemplateSpecialization:
4460 T = cast<DeducedType>(Ty)->getDeducedType();
4461 break;
4462 case Type::TypeOfExpr:
4463 T = cast<TypeOfExprType>(Ty)->getUnderlyingExpr()->getType();
4464 break;
4465 case Type::Atomic:
4466 T = cast<AtomicType>(Ty)->getValueType();
4467 break;
4468 }
4469 } while (!T.isNull() && T->isVariablyModifiedType());
4470}
4471
4472/// Build a sizeof or alignof expression given a type operand.
4473ExprResult
4474Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
4475 SourceLocation OpLoc,
4476 UnaryExprOrTypeTrait ExprKind,
4477 SourceRange R) {
4478 if (!TInfo)
4479 return ExprError();
4480
4481 QualType T = TInfo->getType();
4482
4483 if (!T->isDependentType() &&
4484 CheckUnaryExprOrTypeTraitOperand(T, OpLoc, R, ExprKind))
4485 return ExprError();
4486
4487 if (T->isVariablyModifiedType() && FunctionScopes.size() > 1) {
4488 if (auto *TT = T->getAs<TypedefType>()) {
4489 for (auto I = FunctionScopes.rbegin(),
4490 E = std::prev(FunctionScopes.rend());
4491 I != E; ++I) {
4492 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
4493 if (CSI == nullptr)
4494 break;
4495 DeclContext *DC = nullptr;
4496 if (auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
4497 DC = LSI->CallOperator;
4498 else if (auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
4499 DC = CRSI->TheCapturedDecl;
4500 else if (auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
4501 DC = BSI->TheDecl;
4502 if (DC) {
4503 if (DC->containsDecl(TT->getDecl()))
4504 break;
4505 captureVariablyModifiedType(Context, T, CSI);
4506 }
4507 }
4508 }
4509 }
4510
4511 // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
4512 return new (Context) UnaryExprOrTypeTraitExpr(
4513 ExprKind, TInfo, Context.getSizeType(), OpLoc, R.getEnd());
4514}
4515
4516/// Build a sizeof or alignof expression given an expression
4517/// operand.
4518ExprResult
4519Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
4520 UnaryExprOrTypeTrait ExprKind) {
4521 ExprResult PE = CheckPlaceholderExpr(E);
4522 if (PE.isInvalid())
4523 return ExprError();
4524
4525 E = PE.get();
4526
4527 // Verify that the operand is valid.
4528 bool isInvalid = false;
4529 if (E->isTypeDependent()) {
4530 // Delay type-checking for type-dependent expressions.
4531 } else if (ExprKind == UETT_AlignOf || ExprKind == UETT_PreferredAlignOf) {
4532 isInvalid = CheckAlignOfExpr(*this, E, ExprKind);
4533 } else if (ExprKind == UETT_VecStep) {
4534 isInvalid = CheckVecStepExpr(E);
4535 } else if (ExprKind == UETT_OpenMPRequiredSimdAlign) {
4536 Diag(E->getExprLoc(), diag::err_openmp_default_simd_align_expr);
4537 isInvalid = true;
4538 } else if (E->refersToBitField()) { // C99 6.5.3.4p1.
4539 Diag(E->getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
4540 isInvalid = true;
4541 } else {
4542 isInvalid = CheckUnaryExprOrTypeTraitOperand(E, UETT_SizeOf);
4543 }
4544
4545 if (isInvalid)
4546 return ExprError();
4547
4548 if (ExprKind == UETT_SizeOf && E->getType()->isVariableArrayType()) {
4549 PE = TransformToPotentiallyEvaluated(E);
4550 if (PE.isInvalid()) return ExprError();
4551 E = PE.get();
4552 }
4553
4554 // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
4555 return new (Context) UnaryExprOrTypeTraitExpr(
4556 ExprKind, E, Context.getSizeType(), OpLoc, E->getSourceRange().getEnd());
4557}
4558
4559/// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
4560/// expr and the same for @c alignof and @c __alignof
4561/// Note that the ArgRange is invalid if isType is false.
4562ExprResult
4563Sema::ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
4564 UnaryExprOrTypeTrait ExprKind, bool IsType,
4565 void *TyOrEx, SourceRange ArgRange) {
4566 // If error parsing type, ignore.
4567 if (!TyOrEx) return ExprError();
4568
4569 if (IsType) {
4570 TypeSourceInfo *TInfo;
4571 (void) GetTypeFromParser(ParsedType::getFromOpaquePtr(TyOrEx), &TInfo);
4572 return CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, ArgRange);
4573 }
4574
4575 Expr *ArgEx = (Expr *)TyOrEx;
4576 ExprResult Result = CreateUnaryExprOrTypeTraitExpr(ArgEx, OpLoc, ExprKind);
4577 return Result;
4578}
4579
4580static QualType CheckRealImagOperand(Sema &S, ExprResult &V, SourceLocation Loc,
4581 bool IsReal) {
4582 if (V.get()->isTypeDependent())
4583 return S.Context.DependentTy;
4584
4585 // _Real and _Imag are only l-values for normal l-values.
4586 if (V.get()->getObjectKind() != OK_Ordinary) {
4587 V = S.DefaultLvalueConversion(V.get());
4588 if (V.isInvalid())
4589 return QualType();
4590 }
4591
4592 // These operators return the element type of a complex type.
4593 if (const ComplexType *CT = V.get()->getType()->getAs<ComplexType>())
4594 return CT->getElementType();
4595
4596 // Otherwise they pass through real integer and floating point types here.
4597 if (V.get()->getType()->isArithmeticType())
4598 return V.get()->getType();
4599
4600 // Test for placeholders.
4601 ExprResult PR = S.CheckPlaceholderExpr(V.get());
4602 if (PR.isInvalid()) return QualType();
4603 if (PR.get() != V.get()) {
4604 V = PR;
4605 return CheckRealImagOperand(S, V, Loc, IsReal);
4606 }
4607
4608 // Reject anything else.
4609 S.Diag(Loc, diag::err_realimag_invalid_type) << V.get()->getType()
4610 << (IsReal ? "__real" : "__imag");
4611 return QualType();
4612}
4613
4614
4615
4616ExprResult
4617Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
4618 tok::TokenKind Kind, Expr *Input) {
4619 UnaryOperatorKind Opc;
4620 switch (Kind) {
4621 default: llvm_unreachable("Unknown unary op!")__builtin_unreachable();
4622 case tok::plusplus: Opc = UO_PostInc; break;
4623 case tok::minusminus: Opc = UO_PostDec; break;
4624 }
4625
4626 // Since this might is a postfix expression, get rid of ParenListExprs.
4627 ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Input);
4628 if (Result.isInvalid()) return ExprError();
4629 Input = Result.get();
4630
4631 return BuildUnaryOp(S, OpLoc, Opc, Input);
4632}
4633
4634/// Diagnose if arithmetic on the given ObjC pointer is illegal.
4635///
4636/// \return true on error
4637static bool checkArithmeticOnObjCPointer(Sema &S,
4638 SourceLocation opLoc,
4639 Expr *op) {
4640 assert(op->getType()->isObjCObjectPointerType())(static_cast<void> (0));
4641 if (S.LangOpts.ObjCRuntime.allowsPointerArithmetic() &&
4642 !S.LangOpts.ObjCSubscriptingLegacyRuntime)
4643 return false;
4644
4645 S.Diag(opLoc, diag::err_arithmetic_nonfragile_interface)
4646 << op->getType()->castAs<ObjCObjectPointerType>()->getPointeeType()
4647 << op->getSourceRange();
4648 return true;
4649}
4650
4651static bool isMSPropertySubscriptExpr(Sema &S, Expr *Base) {
4652 auto *BaseNoParens = Base->IgnoreParens();
4653 if (auto *MSProp = dyn_cast<MSPropertyRefExpr>(BaseNoParens))
4654 return MSProp->getPropertyDecl()->getType()->isArrayType();
4655 return isa<MSPropertySubscriptExpr>(BaseNoParens);
4656}
4657
4658ExprResult
4659Sema::ActOnArraySubscriptExpr(Scope *S, Expr *base, SourceLocation lbLoc,
4660 Expr *idx, SourceLocation rbLoc) {
4661 if (base && !base->getType().isNull() &&
4662 base->getType()->isSpecificPlaceholderType(BuiltinType::OMPArraySection))
4663 return ActOnOMPArraySectionExpr(base, lbLoc, idx, SourceLocation(),
4664 SourceLocation(), /*Length*/ nullptr,
4665 /*Stride=*/nullptr, rbLoc);
4666
4667 // Since this might be a postfix expression, get rid of ParenListExprs.
4668 if (isa<ParenListExpr>(base)) {
4669 ExprResult result = MaybeConvertParenListExprToParenExpr(S, base);
4670 if (result.isInvalid()) return ExprError();
4671 base = result.get();
4672 }
4673
4674 // Check if base and idx form a MatrixSubscriptExpr.
4675 //
4676 // Helper to check for comma expressions, which are not allowed as indices for
4677 // matrix subscript expressions.
4678 auto CheckAndReportCommaError = [this, base, rbLoc](Expr *E) {
4679 if (isa<BinaryOperator>(E) && cast<BinaryOperator>(E)->isCommaOp()) {
4680 Diag(E->getExprLoc(), diag::err_matrix_subscript_comma)
4681 << SourceRange(base->getBeginLoc(), rbLoc);
4682 return true;
4683 }
4684 return false;
4685 };
4686 // The matrix subscript operator ([][])is considered a single operator.
4687 // Separating the index expressions by parenthesis is not allowed.
4688 if (base->getType()->isSpecificPlaceholderType(
4689 BuiltinType::IncompleteMatrixIdx) &&
4690 !isa<MatrixSubscriptExpr>(base)) {
4691 Diag(base->getExprLoc(), diag::err_matrix_separate_incomplete_index)
4692 << SourceRange(base->getBeginLoc(), rbLoc);
4693 return ExprError();
4694 }
4695 // If the base is a MatrixSubscriptExpr, try to create a new
4696 // MatrixSubscriptExpr.
4697 auto *matSubscriptE = dyn_cast<MatrixSubscriptExpr>(base);
4698 if (matSubscriptE) {
4699 if (CheckAndReportCommaError(idx))
4700 return ExprError();
4701
4702 assert(matSubscriptE->isIncomplete() &&(static_cast<void> (0))
4703 "base has to be an incomplete matrix subscript")(static_cast<void> (0));
4704 return CreateBuiltinMatrixSubscriptExpr(
4705 matSubscriptE->getBase(), matSubscriptE->getRowIdx(), idx, rbLoc);
4706 }
4707
4708 // Handle any non-overload placeholder types in the base and index
4709 // expressions. We can't handle overloads here because the other
4710 // operand might be an overloadable type, in which case the overload
4711 // resolution for the operator overload should get the first crack
4712 // at the overload.
4713 bool IsMSPropertySubscript = false;
4714 if (base->getType()->isNonOverloadPlaceholderType()) {
4715 IsMSPropertySubscript = isMSPropertySubscriptExpr(*this, base);
4716 if (!IsMSPropertySubscript) {
4717 ExprResult result = CheckPlaceholderExpr(base);
4718 if (result.isInvalid())
4719 return ExprError();
4720 base = result.get();
4721 }
4722 }
4723
4724 // If the base is a matrix type, try to create a new MatrixSubscriptExpr.
4725 if (base->getType()->isMatrixType()) {
4726 if (CheckAndReportCommaError(idx))
4727 return ExprError();
4728
4729 return CreateBuiltinMatrixSubscriptExpr(base, idx, nullptr, rbLoc);
4730 }
4731
4732 // A comma-expression as the index is deprecated in C++2a onwards.
4733 if (getLangOpts().CPlusPlus20 &&
4734 ((isa<BinaryOperator>(idx) && cast<BinaryOperator>(idx)->isCommaOp()) ||
4735 (isa<CXXOperatorCallExpr>(idx) &&
4736 cast<CXXOperatorCallExpr>(idx)->getOperator() == OO_Comma))) {
4737 Diag(idx->getExprLoc(), diag::warn_deprecated_comma_subscript)
4738 << SourceRange(base->getBeginLoc(), rbLoc);
4739 }
4740
4741 if (idx->getType()->isNonOverloadPlaceholderType()) {
4742 ExprResult result = CheckPlaceholderExpr(idx);
4743 if (result.isInvalid()) return ExprError();
4744 idx = result.get();
4745 }
4746
4747 // Build an unanalyzed expression if either operand is type-dependent.
4748 if (getLangOpts().CPlusPlus &&
4749 (base->isTypeDependent() || idx->isTypeDependent())) {
4750 return new (Context) ArraySubscriptExpr(base, idx, Context.DependentTy,
4751 VK_LValue, OK_Ordinary, rbLoc);
4752 }
4753
4754 // MSDN, property (C++)
4755 // https://msdn.microsoft.com/en-us/library/yhfk0thd(v=vs.120).aspx
4756 // This attribute can also be used in the declaration of an empty array in a
4757 // class or structure definition. For example:
4758 // __declspec(property(get=GetX, put=PutX)) int x[];
4759 // The above statement indicates that x[] can be used with one or more array
4760 // indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b),
4761 // and p->x[a][b] = i will be turned into p->PutX(a, b, i);
4762 if (IsMSPropertySubscript) {
4763 // Build MS property subscript expression if base is MS property reference
4764 // or MS property subscript.
4765 return new (Context) MSPropertySubscriptExpr(
4766 base, idx, Context.PseudoObjectTy, VK_LValue, OK_Ordinary, rbLoc);
4767 }
4768
4769 // Use C++ overloaded-operator rules if either operand has record
4770 // type. The spec says to do this if either type is *overloadable*,
4771 // but enum types can't declare subscript operators or conversion
4772 // operators, so there's nothing interesting for overload resolution
4773 // to do if there aren't any record types involved.
4774 //
4775 // ObjC pointers have their own subscripting logic that is not tied
4776 // to overload resolution and so should not take this path.
4777 if (getLangOpts().CPlusPlus &&
4778 (base->getType()->isRecordType() ||
4779 (!base->getType()->isObjCObjectPointerType() &&
4780 idx->getType()->isRecordType()))) {
4781 return CreateOverloadedArraySubscriptExpr(lbLoc, rbLoc, base, idx);
4782 }
4783
4784 ExprResult Res = CreateBuiltinArraySubscriptExpr(base, lbLoc, idx, rbLoc);
4785
4786 if (!Res.isInvalid() && isa<ArraySubscriptExpr>(Res.get()))
4787 CheckSubscriptAccessOfNoDeref(cast<ArraySubscriptExpr>(Res.get()));
4788
4789 return Res;
4790}
4791
4792ExprResult Sema::tryConvertExprToType(Expr *E, QualType Ty) {
4793 InitializedEntity Entity = InitializedEntity::InitializeTemporary(Ty);
4794 InitializationKind Kind =
4795 InitializationKind::CreateCopy(E->getBeginLoc(), SourceLocation());
4796 InitializationSequence InitSeq(*this, Entity, Kind, E);
4797 return InitSeq.Perform(*this, Entity, Kind, E);
4798}
4799
4800ExprResult Sema::CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
4801 Expr *ColumnIdx,
4802 SourceLocation RBLoc) {
4803 ExprResult BaseR = CheckPlaceholderExpr(Base);
4804 if (BaseR.isInvalid())
4805 return BaseR;
4806 Base = BaseR.get();
4807
4808 ExprResult RowR = CheckPlaceholderExpr(RowIdx);
4809 if (RowR.isInvalid())
4810 return RowR;
4811 RowIdx = RowR.get();
4812
4813 if (!ColumnIdx)
4814 return new (Context) MatrixSubscriptExpr(
4815 Base, RowIdx, ColumnIdx, Context.IncompleteMatrixIdxTy, RBLoc);
4816
4817 // Build an unanalyzed expression if any of the operands is type-dependent.
4818 if (Base->isTypeDependent() || RowIdx->isTypeDependent() ||
4819 ColumnIdx->isTypeDependent())
4820 return new (Context) MatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
4821 Context.DependentTy, RBLoc);
4822
4823 ExprResult ColumnR = CheckPlaceholderExpr(ColumnIdx);
4824 if (ColumnR.isInvalid())
4825 return ColumnR;
4826 ColumnIdx = ColumnR.get();
4827
4828 // Check that IndexExpr is an integer expression. If it is a constant
4829 // expression, check that it is less than Dim (= the number of elements in the
4830 // corresponding dimension).
4831 auto IsIndexValid = [&](Expr *IndexExpr, unsigned Dim,
4832 bool IsColumnIdx) -> Expr * {
4833 if (!IndexExpr->getType()->isIntegerType() &&
4834 !IndexExpr->isTypeDependent()) {
4835 Diag(IndexExpr->getBeginLoc(), diag::err_matrix_index_not_integer)
4836 << IsColumnIdx;
4837 return nullptr;
4838 }
4839
4840 if (Optional<llvm::APSInt> Idx =
4841 IndexExpr->getIntegerConstantExpr(Context)) {
4842 if ((*Idx < 0 || *Idx >= Dim)) {
4843 Diag(IndexExpr->getBeginLoc(), diag::err_matrix_index_outside_range)
4844 << IsColumnIdx << Dim;
4845 return nullptr;
4846 }
4847 }
4848
4849 ExprResult ConvExpr =
4850 tryConvertExprToType(IndexExpr, Context.getSizeType());
4851 assert(!ConvExpr.isInvalid() &&(static_cast<void> (0))
4852 "should be able to convert any integer type to size type")(static_cast<void> (0));
4853 return ConvExpr.get();
4854 };
4855
4856 auto *MTy = Base->getType()->getAs<ConstantMatrixType>();
4857 RowIdx = IsIndexValid(RowIdx, MTy->getNumRows(), false);
4858 ColumnIdx = IsIndexValid(ColumnIdx, MTy->getNumColumns(), true);
4859 if (!RowIdx || !ColumnIdx)
4860 return ExprError();
4861
4862 return new (Context) MatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
4863 MTy->getElementType(), RBLoc);
4864}
4865
4866void Sema::CheckAddressOfNoDeref(const Expr *E) {
4867 ExpressionEvaluationContextRecord &LastRecord = ExprEvalContexts.back();
4868 const Expr *StrippedExpr = E->IgnoreParenImpCasts();
4869
4870 // For expressions like `&(*s).b`, the base is recorded and what should be
4871 // checked.
4872 const MemberExpr *Member = nullptr;
4873 while ((Member = dyn_cast<MemberExpr>(StrippedExpr)) && !Member->isArrow())
4874 StrippedExpr = Member->getBase()->IgnoreParenImpCasts();
4875
4876 LastRecord.PossibleDerefs.erase(StrippedExpr);
4877}
4878
4879void Sema::CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E) {
4880 if (isUnevaluatedContext())
4881 return;
4882
4883 QualType ResultTy = E->getType();
4884 ExpressionEvaluationContextRecord &LastRecord = ExprEvalContexts.back();
4885
4886 // Bail if the element is an array since it is not memory access.
4887 if (isa<ArrayType>(ResultTy))
4888 return;
4889
4890 if (ResultTy->hasAttr(attr::NoDeref)) {
4891 LastRecord.PossibleDerefs.insert(E);
4892 return;
4893 }
4894
4895 // Check if the base type is a pointer to a member access of a struct
4896 // marked with noderef.
4897 const Expr *Base = E->getBase();
4898 QualType BaseTy = Base->getType();
4899 if (!(isa<ArrayType>(BaseTy) || isa<PointerType>(BaseTy)))
4900 // Not a pointer access
4901 return;
4902
4903 const MemberExpr *Member = nullptr;
4904 while ((Member = dyn_cast<MemberExpr>(Base->IgnoreParenCasts())) &&
4905 Member->isArrow())
4906 Base = Member->getBase();
4907
4908 if (const auto *Ptr = dyn_cast<PointerType>(Base->getType())) {
4909 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
4910 LastRecord.PossibleDerefs.insert(E);
4911 }
4912}
4913
4914ExprResult Sema::ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc,
4915 Expr *LowerBound,
4916 SourceLocation ColonLocFirst,
4917 SourceLocation ColonLocSecond,
4918 Expr *Length, Expr *Stride,
4919 SourceLocation RBLoc) {
4920 if (Base->getType()->isPlaceholderType() &&
4921 !Base->getType()->isSpecificPlaceholderType(
4922 BuiltinType::OMPArraySection)) {
4923 ExprResult Result = CheckPlaceholderExpr(Base);
4924 if (Result.isInvalid())
4925 return ExprError();
4926 Base = Result.get();
4927 }
4928 if (LowerBound && LowerBound->getType()->isNonOverloadPlaceholderType()) {
4929 ExprResult Result = CheckPlaceholderExpr(LowerBound);
4930 if (Result.isInvalid())
4931 return ExprError();
4932 Result = DefaultLvalueConversion(Result.get());
4933 if (Result.isInvalid())
4934 return ExprError();
4935 LowerBound = Result.get();
4936 }
4937 if (Length && Length->getType()->isNonOverloadPlaceholderType()) {
4938 ExprResult Result = CheckPlaceholderExpr(Length);
4939 if (Result.isInvalid())
4940 return ExprError();
4941 Result = DefaultLvalueConversion(Result.get());
4942 if (Result.isInvalid())
4943 return ExprError();
4944 Length = Result.get();
4945 }
4946 if (Stride && Stride->getType()->isNonOverloadPlaceholderType()) {
4947 ExprResult Result = CheckPlaceholderExpr(Stride);
4948 if (Result.isInvalid())
4949 return ExprError();
4950 Result = DefaultLvalueConversion(Result.get());
4951 if (Result.isInvalid())
4952 return ExprError();
4953 Stride = Result.get();
4954 }
4955
4956 // Build an unanalyzed expression if either operand is type-dependent.
4957 if (Base->isTypeDependent() ||
4958 (LowerBound &&
4959 (LowerBound->isTypeDependent() || LowerBound->isValueDependent())) ||
4960 (Length && (Length->isTypeDependent() || Length->isValueDependent())) ||
4961 (Stride && (Stride->isTypeDependent() || Stride->isValueDependent()))) {
4962 return new (Context) OMPArraySectionExpr(
4963 Base, LowerBound, Length, Stride, Context.DependentTy, VK_LValue,
4964 OK_Ordinary, ColonLocFirst, ColonLocSecond, RBLoc);
4965 }
4966
4967 // Perform default conversions.
4968 QualType OriginalTy = OMPArraySectionExpr::getBaseOriginalType(Base);
4969 QualType ResultTy;
4970 if (OriginalTy->isAnyPointerType()) {
4971 ResultTy = OriginalTy->getPointeeType();
4972 } else if (OriginalTy->isArrayType()) {
4973 ResultTy = OriginalTy->getAsArrayTypeUnsafe()->getElementType();
4974 } else {
4975 return ExprError(
4976 Diag(Base->getExprLoc(), diag::err_omp_typecheck_section_value)
4977 << Base->getSourceRange());
4978 }
4979 // C99 6.5.2.1p1
4980 if (LowerBound) {
4981 auto Res = PerformOpenMPImplicitIntegerConversion(LowerBound->getExprLoc(),
4982 LowerBound);
4983 if (Res.isInvalid())
4984 return ExprError(Diag(LowerBound->getExprLoc(),
4985 diag::err_omp_typecheck_section_not_integer)
4986 << 0 << LowerBound->getSourceRange());
4987 LowerBound = Res.get();
4988
4989 if (LowerBound->getType()->isSpecificBuiltinType(BuiltinType::Char_S) ||
4990 LowerBound->getType()->isSpecificBuiltinType(BuiltinType::Char_U))
4991 Diag(LowerBound->getExprLoc(), diag::warn_omp_section_is_char)
4992 << 0 << LowerBound->getSourceRange();
4993 }
4994 if (Length) {
4995 auto Res =
4996 PerformOpenMPImplicitIntegerConversion(Length->getExprLoc(), Length);
4997 if (Res.isInvalid())
4998 return ExprError(Diag(Length->getExprLoc(),
4999 diag::err_omp_typecheck_section_not_integer)
5000 << 1 << Length->getSourceRange());
5001 Length = Res.get();
5002
5003 if (Length->getType()->isSpecificBuiltinType(BuiltinType::Char_S) ||
5004 Length->getType()->isSpecificBuiltinType(BuiltinType::Char_U))
5005 Diag(Length->getExprLoc(), diag::warn_omp_section_is_char)
5006 << 1 << Length->getSourceRange();
5007 }
5008 if (Stride) {
5009 ExprResult Res =
5010 PerformOpenMPImplicitIntegerConversion(Stride->getExprLoc(), Stride);
5011 if (Res.isInvalid())
5012 return ExprError(Diag(Stride->getExprLoc(),
5013 diag::err_omp_typecheck_section_not_integer)
5014 << 1 << Stride->getSourceRange());
5015 Stride = Res.get();
5016
5017 if (Stride->getType()->isSpecificBuiltinType(BuiltinType::Char_S) ||
5018 Stride->getType()->isSpecificBuiltinType(BuiltinType::Char_U))
5019 Diag(Stride->getExprLoc(), diag::warn_omp_section_is_char)
5020 << 1 << Stride->getSourceRange();
5021 }
5022
5023 // C99 6.5.2.1p1: "shall have type "pointer to *object* type". Similarly,
5024 // C++ [expr.sub]p1: The type "T" shall be a completely-defined object
5025 // type. Note that functions are not objects, and that (in C99 parlance)
5026 // incomplete types are not object types.
5027 if (ResultTy->isFunctionType()) {
5028 Diag(Base->getExprLoc(), diag::err_omp_section_function_type)
5029 << ResultTy << Base->getSourceRange();
5030 return ExprError();
5031 }
5032
5033 if (RequireCompleteType(Base->getExprLoc(), ResultTy,
5034 diag::err_omp_section_incomplete_type, Base))
5035 return ExprError();
5036
5037 if (LowerBound && !OriginalTy->isAnyPointerType()) {
5038 Expr::EvalResult Result;
5039 if (LowerBound->EvaluateAsInt(Result, Context)) {
5040 // OpenMP 5.0, [2.1.5 Array Sections]
5041 // The array section must be a subset of the original array.
5042 llvm::APSInt LowerBoundValue = Result.Val.getInt();
5043 if (LowerBoundValue.isNegative()) {
5044 Diag(LowerBound->getExprLoc(), diag::err_omp_section_not_subset_of_array)
5045 << LowerBound->getSourceRange();
5046 return ExprError();
5047 }
5048 }
5049 }
5050
5051 if (Length) {
5052 Expr::EvalResult Result;
5053 if (Length->EvaluateAsInt(Result, Context)) {
5054 // OpenMP 5.0, [2.1.5 Array Sections]
5055 // The length must evaluate to non-negative integers.
5056 llvm::APSInt LengthValue = Result.Val.getInt();
5057 if (LengthValue.isNegative()) {
5058 Diag(Length->getExprLoc(), diag::err_omp_section_length_negative)
5059 << toString(LengthValue, /*Radix=*/10, /*Signed=*/true)
5060 << Length->getSourceRange();
5061 return ExprError();
5062 }
5063 }
5064 } else if (ColonLocFirst.isValid() &&
5065 (OriginalTy.isNull() || (!OriginalTy->isConstantArrayType() &&
5066 !OriginalTy->isVariableArrayType()))) {
5067 // OpenMP 5.0, [2.1.5 Array Sections]
5068 // When the size of the array dimension is not known, the length must be
5069 // specified explicitly.
5070 Diag(ColonLocFirst, diag::err_omp_section_length_undefined)
5071 << (!OriginalTy.isNull() && OriginalTy->isArrayType());
5072 return ExprError();
5073 }
5074
5075 if (Stride) {
5076 Expr::EvalResult Result;
5077 if (Stride->EvaluateAsInt(Result, Context)) {
5078 // OpenMP 5.0, [2.1.5 Array Sections]
5079 // The stride must evaluate to a positive integer.
5080 llvm::APSInt StrideValue = Result.Val.getInt();
5081 if (!StrideValue.isStrictlyPositive()) {
5082 Diag(Stride->getExprLoc(), diag::err_omp_section_stride_non_positive)
5083 << toString(StrideValue, /*Radix=*/10, /*Signed=*/true)
5084 << Stride->getSourceRange();
5085 return ExprError();
5086 }
5087 }
5088 }
5089
5090 if (!Base->getType()->isSpecificPlaceholderType(
5091 BuiltinType::OMPArraySection)) {
5092 ExprResult Result = DefaultFunctionArrayLvalueConversion(Base);
5093 if (Result.isInvalid())
5094 return ExprError();
5095 Base = Result.get();
5096 }
5097 return new (Context) OMPArraySectionExpr(
5098 Base, LowerBound, Length, Stride, Context.OMPArraySectionTy, VK_LValue,
5099 OK_Ordinary, ColonLocFirst, ColonLocSecond, RBLoc);
5100}
5101
5102ExprResult Sema::ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
5103 SourceLocation RParenLoc,
5104 ArrayRef<Expr *> Dims,
5105 ArrayRef<SourceRange> Brackets) {
5106 if (Base->getType()->isPlaceholderType()) {
5107 ExprResult Result = CheckPlaceholderExpr(Base);
5108 if (Result.isInvalid())
5109 return ExprError();
5110 Result = DefaultLvalueConversion(Result.get());
5111 if (Result.isInvalid())
5112 return ExprError();
5113 Base = Result.get();
5114 }
5115 QualType BaseTy = Base->getType();
5116 // Delay analysis of the types/expressions if instantiation/specialization is
5117 // required.
5118 if (!BaseTy->isPointerType() && Base->isTypeDependent())
5119 return OMPArrayShapingExpr::Create(Context, Context.DependentTy, Base,
5120 LParenLoc, RParenLoc, Dims, Brackets);
5121 if (!BaseTy->isPointerType() ||
5122 (!Base->isTypeDependent() &&
5123 BaseTy->getPointeeType()->isIncompleteType()))
5124 return ExprError(Diag(Base->getExprLoc(),
5125 diag::err_omp_non_pointer_type_array_shaping_base)
5126 << Base->getSourceRange());
5127
5128 SmallVector<Expr *, 4> NewDims;
5129 bool ErrorFound = false;
5130 for (Expr *Dim : Dims) {
5131 if (Dim->getType()->isPlaceholderType()) {
5132 ExprResult Result = CheckPlaceholderExpr(Dim);
5133 if (Result.isInvalid()) {
5134 ErrorFound = true;
5135 continue;
5136 }
5137 Result = DefaultLvalueConversion(Result.get());
5138 if (Result.isInvalid()) {
5139 ErrorFound = true;
5140 continue;
5141 }
5142 Dim = Result.get();
5143 }
5144 if (!Dim->isTypeDependent()) {
5145 ExprResult Result =
5146 PerformOpenMPImplicitIntegerConversion(Dim->getExprLoc(), Dim);
5147 if (Result.isInvalid()) {
5148 ErrorFound = true;
5149 Diag(Dim->getExprLoc(), diag::err_omp_typecheck_shaping_not_integer)
5150 << Dim->getSourceRange();
5151 continue;
5152 }
5153 Dim = Result.get();
5154 Expr::EvalResult EvResult;
5155 if (!Dim->isValueDependent() && Dim->EvaluateAsInt(EvResult, Context)) {
5156 // OpenMP 5.0, [2.1.4 Array Shaping]
5157 // Each si is an integral type expression that must evaluate to a
5158 // positive integer.
5159 llvm::APSInt Value = EvResult.Val.getInt();
5160 if (!Value.isStrictlyPositive()) {
5161 Diag(Dim->getExprLoc(), diag::err_omp_shaping_dimension_not_positive)
5162 << toString(Value, /*Radix=*/10, /*Signed=*/true)
5163 << Dim->getSourceRange();
5164 ErrorFound = true;
5165 continue;
5166 }
5167 }
5168 }
5169 NewDims.push_back(Dim);
5170 }
5171 if (ErrorFound)
5172 return ExprError();
5173 return OMPArrayShapingExpr::Create(Context, Context.OMPArrayShapingTy, Base,
5174 LParenLoc, RParenLoc, NewDims, Brackets);
5175}
5176
5177ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc,
5178 SourceLocation LLoc, SourceLocation RLoc,
5179 ArrayRef<OMPIteratorData> Data) {
5180 SmallVector<OMPIteratorExpr::IteratorDefinition, 4> ID;
5181 bool IsCorrect = true;
5182 for (const OMPIteratorData &D : Data) {
5183 TypeSourceInfo *TInfo = nullptr;
5184 SourceLocation StartLoc;
5185 QualType DeclTy;
5186 if (!D.Type.getAsOpaquePtr()) {
5187 // OpenMP 5.0, 2.1.6 Iterators
5188 // In an iterator-specifier, if the iterator-type is not specified then
5189 // the type of that iterator is of int type.
5190 DeclTy = Context.IntTy;
5191 StartLoc = D.DeclIdentLoc;
5192 } else {
5193 DeclTy = GetTypeFromParser(D.Type, &TInfo);
5194 StartLoc = TInfo->getTypeLoc().getBeginLoc();
5195 }
5196
5197 bool IsDeclTyDependent = DeclTy->isDependentType() ||
5198 DeclTy->containsUnexpandedParameterPack() ||
5199 DeclTy->isInstantiationDependentType();
5200 if (!IsDeclTyDependent) {
5201 if (!DeclTy->isIntegralType(Context) && !DeclTy->isAnyPointerType()) {
5202 // OpenMP 5.0, 2.1.6 Iterators, Restrictions, C/C++
5203 // The iterator-type must be an integral or pointer type.
5204 Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer)
5205 << DeclTy;
5206 IsCorrect = false;
5207 continue;
5208 }
5209 if (DeclTy.isConstant(Context)) {
5210 // OpenMP 5.0, 2.1.6 Iterators, Restrictions, C/C++
5211 // The iterator-type must not be const qualified.
5212 Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer)
5213 << DeclTy;
5214 IsCorrect = false;
5215 continue;
5216 }
5217 }
5218
5219 // Iterator declaration.
5220 assert(D.DeclIdent && "Identifier expected.")(static_cast<void> (0));
5221 // Always try to create iterator declarator to avoid extra error messages
5222 // about unknown declarations use.
5223 auto *VD = VarDecl::Create(Context, CurContext, StartLoc, D.DeclIdentLoc,
5224 D.DeclIdent, DeclTy, TInfo, SC_None);
5225 VD->setImplicit();
5226 if (S) {
5227 // Check for conflicting previous declaration.
5228 DeclarationNameInfo NameInfo(VD->getDeclName(), D.DeclIdentLoc);
5229 LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
5230 ForVisibleRedeclaration);
5231 Previous.suppressDiagnostics();
5232 LookupName(Previous, S);
5233
5234 FilterLookupForScope(Previous, CurContext, S, /*ConsiderLinkage=*/false,
5235 /*AllowInlineNamespace=*/false);
5236 if (!Previous.empty()) {
5237 NamedDecl *Old = Previous.getRepresentativeDecl();
5238 Diag(D.DeclIdentLoc, diag::err_redefinition) << VD->getDeclName();
5239 Diag(Old->getLocation(), diag::note_previous_definition);
5240 } else {
5241 PushOnScopeChains(VD, S);
5242 }
5243 } else {
5244 CurContext->addDecl(VD);
5245 }
5246 Expr *Begin = D.Range.Begin;
5247 if (!IsDeclTyDependent && Begin && !Begin->isTypeDependent()) {
5248 ExprResult BeginRes =
5249 PerformImplicitConversion(Begin, DeclTy, AA_Converting);
5250 Begin = BeginRes.get();
5251 }
5252 Expr *End = D.Range.End;
5253 if (!IsDeclTyDependent && End && !End->isTypeDependent()) {
5254 ExprResult EndRes = PerformImplicitConversion(End, DeclTy, AA_Converting);
5255 End = EndRes.get();
5256 }
5257 Expr *Step = D.Range.Step;
5258 if (!IsDeclTyDependent && Step && !Step->isTypeDependent()) {
5259 if (!Step->getType()->isIntegralType(Context)) {
5260 Diag(Step->getExprLoc(), diag::err_omp_iterator_step_not_integral)
5261 << Step << Step->getSourceRange();
5262 IsCorrect = false;
5263 continue;
5264 }
5265 Optional<llvm::APSInt> Result = Step->getIntegerConstantExpr(Context);
5266 // OpenMP 5.0, 2.1.6 Iterators, Restrictions
5267 // If the step expression of a range-specification equals zero, the
5268 // behavior is unspecified.
5269 if (Result && Result->isNullValue()) {
5270 Diag(Step->getExprLoc(), diag::err_omp_iterator_step_constant_zero)
5271 << Step << Step->getSourceRange();
5272 IsCorrect = false;
5273 continue;
5274 }
5275 }
5276 if (!Begin || !End || !IsCorrect) {
5277 IsCorrect = false;
5278 continue;
5279 }
5280 OMPIteratorExpr::IteratorDefinition &IDElem = ID.emplace_back();
5281 IDElem.IteratorDecl = VD;
5282 IDElem.AssignmentLoc = D.AssignLoc;
5283 IDElem.Range.Begin = Begin;
5284 IDElem.Range.End = End;
5285 IDElem.Range.Step = Step;
5286 IDElem.ColonLoc = D.ColonLoc;
5287 IDElem.SecondColonLoc = D.SecColonLoc;
5288 }
5289 if (!IsCorrect) {
5290 // Invalidate all created iterator declarations if error is found.
5291 for (const OMPIteratorExpr::IteratorDefinition &D : ID) {
5292 if (Decl *ID = D.IteratorDecl)
5293 ID->setInvalidDecl();
5294 }
5295 return ExprError();
5296 }
5297 SmallVector<OMPIteratorHelperData, 4> Helpers;
5298 if (!CurContext->isDependentContext()) {
5299 // Build number of ityeration for each iteration range.
5300 // Ni = ((Stepi > 0) ? ((Endi + Stepi -1 - Begini)/Stepi) :
5301 // ((Begini-Stepi-1-Endi) / -Stepi);
5302 for (OMPIteratorExpr::IteratorDefinition &D : ID) {
5303 // (Endi - Begini)
5304 ExprResult Res = CreateBuiltinBinOp(D.AssignmentLoc, BO_Sub, D.Range.End,
5305 D.Range.Begin);
5306 if(!Res.isUsable()) {
5307 IsCorrect = false;
5308 continue;
5309 }
5310 ExprResult St, St1;
5311 if (D.Range.Step) {
5312 St = D.Range.Step;
5313 // (Endi - Begini) + Stepi
5314 Res = CreateBuiltinBinOp(D.AssignmentLoc, BO_Add, Res.get(), St.get());
5315 if (!Res.isUsable()) {
5316 IsCorrect = false;
5317 continue;
5318 }
5319 // (Endi - Begini) + Stepi - 1
5320 Res =
5321 CreateBuiltinBinOp(D.AssignmentLoc, BO_Sub, Res.get(),
5322 ActOnIntegerConstant(D.AssignmentLoc, 1).get());
5323 if (!Res.isUsable()) {
5324 IsCorrect = false;
5325 continue;
5326 }
5327 // ((Endi - Begini) + Stepi - 1) / Stepi
5328 Res = CreateBuiltinBinOp(D.AssignmentLoc, BO_Div, Res.get(), St.get());
5329 if (!Res.isUsable()) {
5330 IsCorrect = false;
5331 continue;
5332 }
5333 St1 = CreateBuiltinUnaryOp(D.AssignmentLoc, UO_Minus, D.Range.Step);
5334 // (Begini - Endi)
5335 ExprResult Res1 = CreateBuiltinBinOp(D.AssignmentLoc, BO_Sub,
5336 D.Range.Begin, D.Range.End);
5337 if (!Res1.isUsable()) {
5338 IsCorrect = false;
5339 continue;
5340 }
5341 // (Begini - Endi) - Stepi
5342 Res1 =
5343 CreateBuiltinBinOp(D.AssignmentLoc, BO_Add, Res1.get(), St1.get());
5344 if (!Res1.isUsable()) {
5345 IsCorrect = false;
5346 continue;
5347 }
5348 // (Begini - Endi) - Stepi - 1
5349 Res1 =
5350 CreateBuiltinBinOp(D.AssignmentLoc, BO_Sub, Res1.get(),
5351 ActOnIntegerConstant(D.AssignmentLoc, 1).get());
5352 if (!Res1.isUsable()) {
5353 IsCorrect = false;
5354 continue;
5355 }
5356 // ((Begini - Endi) - Stepi - 1) / (-Stepi)
5357 Res1 =
5358 CreateBuiltinBinOp(D.AssignmentLoc, BO_Div, Res1.get(), St1.get());
5359 if (!Res1.isUsable()) {
5360 IsCorrect = false;
5361 continue;
5362 }
5363 // Stepi > 0.
5364 ExprResult CmpRes =
5365 CreateBuiltinBinOp(D.AssignmentLoc, BO_GT, D.Range.Step,
5366 ActOnIntegerConstant(D.AssignmentLoc, 0).get());
5367 if (!CmpRes.isUsable()) {
5368 IsCorrect = false;
5369 continue;
5370 }
5371 Res = ActOnConditionalOp(D.AssignmentLoc, D.AssignmentLoc, CmpRes.get(),
5372 Res.get(), Res1.get());
5373 if (!Res.isUsable()) {
5374 IsCorrect = false;
5375 continue;
5376 }
5377 }
5378 Res = ActOnFinishFullExpr(Res.get(), /*DiscardedValue=*/false);
5379 if (!Res.isUsable()) {
5380 IsCorrect = false;
5381 continue;
5382 }
5383
5384 // Build counter update.
5385 // Build counter.
5386 auto *CounterVD =
5387 VarDecl::Create(Context, CurContext, D.IteratorDecl->getBeginLoc(),
5388 D.IteratorDecl->getBeginLoc(), nullptr,
5389 Res.get()->getType(), nullptr, SC_None);
5390 CounterVD->setImplicit();
5391 ExprResult RefRes =
5392 BuildDeclRefExpr(CounterVD, CounterVD->getType(), VK_LValue,
5393 D.IteratorDecl->getBeginLoc());
5394 // Build counter update.
5395 // I = Begini + counter * Stepi;
5396 ExprResult UpdateRes;
5397 if (D.Range.Step) {
5398 UpdateRes = CreateBuiltinBinOp(
5399 D.AssignmentLoc, BO_Mul,
5400 DefaultLvalueConversion(RefRes.get()).get(), St.get());
5401 } else {
5402 UpdateRes = DefaultLvalueConversion(RefRes.get());
5403 }
5404 if (!UpdateRes.isUsable()) {
5405 IsCorrect = false;
5406 continue;
5407 }
5408 UpdateRes = CreateBuiltinBinOp(D.AssignmentLoc, BO_Add, D.Range.Begin,
5409 UpdateRes.get());
5410 if (!UpdateRes.isUsable()) {
5411 IsCorrect = false;
5412 continue;
5413 }
5414 ExprResult VDRes =
5415 BuildDeclRefExpr(cast<VarDecl>(D.IteratorDecl),
5416 cast<VarDecl>(D.IteratorDecl)->getType(), VK_LValue,
5417 D.IteratorDecl->getBeginLoc());
5418 UpdateRes = CreateBuiltinBinOp(D.AssignmentLoc, BO_Assign, VDRes.get(),
5419 UpdateRes.get());
5420 if (!UpdateRes.isUsable()) {
5421 IsCorrect = false;
5422 continue;
5423 }
5424 UpdateRes =
5425 ActOnFinishFullExpr(UpdateRes.get(), /*DiscardedValue=*/true);
5426 if (!UpdateRes.isUsable()) {
5427 IsCorrect = false;
5428 continue;
5429 }
5430 ExprResult CounterUpdateRes =
5431 CreateBuiltinUnaryOp(D.AssignmentLoc, UO_PreInc, RefRes.get());
5432 if (!CounterUpdateRes.isUsable()) {
5433 IsCorrect = false;
5434 continue;
5435 }
5436 CounterUpdateRes =
5437 ActOnFinishFullExpr(CounterUpdateRes.get(), /*DiscardedValue=*/true);
5438 if (!CounterUpdateRes.isUsable()) {
5439 IsCorrect = false;
5440 continue;
5441 }
5442 OMPIteratorHelperData &HD = Helpers.emplace_back();
5443 HD.CounterVD = CounterVD;
5444 HD.Upper = Res.get();
5445 HD.Update = UpdateRes.get();
5446 HD.CounterUpdate = CounterUpdateRes.get();
5447 }
5448 } else {
5449 Helpers.assign(ID.size(), {});
5450 }
5451 if (!IsCorrect) {
5452 // Invalidate all created iterator declarations if error is found.
5453 for (const OMPIteratorExpr::IteratorDefinition &D : ID) {
5454 if (Decl *ID = D.IteratorDecl)
5455 ID->setInvalidDecl();
5456 }
5457 return ExprError();
5458 }
5459 return OMPIteratorExpr::Create(Context, Context.OMPIteratorTy, IteratorKwLoc,
5460 LLoc, RLoc, ID, Helpers);
5461}
5462
5463ExprResult
5464Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
5465 Expr *Idx, SourceLocation RLoc) {
5466 Expr *LHSExp = Base;
5467 Expr *RHSExp = Idx;
5468
5469 ExprValueKind VK = VK_LValue;
5470 ExprObjectKind OK = OK_Ordinary;
5471
5472 // Per C++ core issue 1213, the result is an xvalue if either operand is
5473 // a non-lvalue array, and an lvalue otherwise.
5474 if (getLangOpts().CPlusPlus11) {
5475 for (auto *Op : {LHSExp, RHSExp}) {
5476 Op = Op->IgnoreImplicit();
5477 if (Op->getType()->isArrayType() && !Op->isLValue())
5478 VK = VK_XValue;
5479 }
5480 }
5481
5482 // Perform default conversions.
5483 if (!LHSExp->getType()->getAs<VectorType>()) {
5484 ExprResult Result = DefaultFunctionArrayLvalueConversion(LHSExp);
5485 if (Result.isInvalid())
5486 return ExprError();
5487 LHSExp = Result.get();
5488 }
5489 ExprResult Result = DefaultFunctionArrayLvalueConversion(RHSExp);
5490 if (Result.isInvalid())
5491 return ExprError();
5492 RHSExp = Result.get();
5493
5494 QualType LHSTy = LHSExp->getType(), RHSTy = RHSExp->getType();
5495
5496 // C99 6.5.2.1p2: the expression e1[e2] is by definition precisely equivalent
5497 // to the expression *((e1)+(e2)). This means the array "Base" may actually be
5498 // in the subscript position. As a result, we need to derive the array base
5499 // and index from the expression types.
5500 Expr *BaseExpr, *IndexExpr;
5501 QualType ResultType;
5502 if (LHSTy->isDependentType() || RHSTy->isDependentType()) {
5503 BaseExpr = LHSExp;
5504 IndexExpr = RHSExp;
5505 ResultType = Context.DependentTy;
5506 } else if (const PointerType *PTy = LHSTy->getAs<PointerType>()) {
5507 BaseExpr = LHSExp;
5508 IndexExpr = RHSExp;
5509 ResultType = PTy->getPointeeType();
5510 } else if (const ObjCObjectPointerType *PTy =
5511 LHSTy->getAs<ObjCObjectPointerType>()) {
5512 BaseExpr = LHSExp;
5513 IndexExpr = RHSExp;
5514
5515 // Use custom logic if this should be the pseudo-object subscript
5516 // expression.
5517 if (!LangOpts.isSubscriptPointerArithmetic())
5518 return BuildObjCSubscriptExpression(RLoc, BaseExpr, IndexExpr, nullptr,
5519 nullptr);
5520
5521 ResultType = PTy->getPointeeType();
5522 } else if (const PointerType *PTy = RHSTy->getAs<PointerType>()) {
5523 // Handle the uncommon case of "123[Ptr]".
5524 BaseExpr = RHSExp;
5525 IndexExpr = LHSExp;
5526 ResultType = PTy->getPointeeType();
5527 } else if (const ObjCObjectPointerType *PTy =
5528 RHSTy->getAs<ObjCObjectPointerType>()) {
5529 // Handle the uncommon case of "123[Ptr]".
5530 BaseExpr = RHSExp;
5531 IndexExpr = LHSExp;
5532 ResultType = PTy->getPointeeType();
5533 if (!LangOpts.isSubscriptPointerArithmetic()) {
5534 Diag(LLoc, diag::err_subscript_nonfragile_interface)
5535 << ResultType << BaseExpr->getSourceRange();
5536 return ExprError();
5537 }
5538 } else if (const VectorType *VTy = LHSTy->getAs<VectorType>()) {
5539 BaseExpr = LHSExp; // vectors: V[123]
5540 IndexExpr = RHSExp;
5541 // We apply C++ DR1213 to vector subscripting too.
5542 if (getLangOpts().CPlusPlus11 && LHSExp->isPRValue()) {
5543 ExprResult Materialized = TemporaryMaterializationConversion(LHSExp);
5544 if (Materialized.isInvalid())
5545 return ExprError();
5546 LHSExp = Materialized.get();
5547 }
5548 VK = LHSExp->getValueKind();
5549 if (VK != VK_PRValue)
5550 OK = OK_VectorComponent;
5551
5552 ResultType = VTy->getElementType();
5553 QualType BaseType = BaseExpr->getType();
5554 Qualifiers BaseQuals = BaseType.getQualifiers();
5555 Qualifiers MemberQuals = ResultType.getQualifiers();
5556 Qualifiers Combined = BaseQuals + MemberQuals;
5557 if (Combined != MemberQuals)
5558 ResultType = Context.getQualifiedType(ResultType, Combined);
5559 } else if (LHSTy->isArrayType()) {
5560 // If we see an array that wasn't promoted by
5561 // DefaultFunctionArrayLvalueConversion, it must be an array that
5562 // wasn't promoted because of the C90 rule that doesn't
5563 // allow promoting non-lvalue arrays. Warn, then
5564 // force the promotion here.
5565 Diag(LHSExp->getBeginLoc(), diag::ext_subscript_non_lvalue)
5566 << LHSExp->getSourceRange();
5567 LHSExp = ImpCastExprToType(LHSExp, Context.getArrayDecayedType(LHSTy),
5568 CK_ArrayToPointerDecay).get();
5569 LHSTy = LHSExp->getType();
5570
5571 BaseExpr = LHSExp;
5572 IndexExpr = RHSExp;
5573 ResultType = LHSTy->castAs<PointerType>()->getPointeeType();
5574 } else if (RHSTy->isArrayType()) {
5575 // Same as previous, except for 123[f().a] case
5576 Diag(RHSExp->getBeginLoc(), diag::ext_subscript_non_lvalue)
5577 << RHSExp->getSourceRange();
5578 RHSExp = ImpCastExprToType(RHSExp, Context.getArrayDecayedType(RHSTy),
5579 CK_ArrayToPointerDecay).get();
5580 RHSTy = RHSExp->getType();
5581
5582 BaseExpr = RHSExp;
5583 IndexExpr = LHSExp;
5584 ResultType = RHSTy->castAs<PointerType>()->getPointeeType();
5585 } else {
5586 return ExprError(Diag(LLoc, diag::err_typecheck_subscript_value)
5587 << LHSExp->getSourceRange() << RHSExp->getSourceRange());
5588 }
5589 // C99 6.5.2.1p1
5590 if (!IndexExpr->getType()->isIntegerType() && !IndexExpr->isTypeDependent())
5591 return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer)
5592 << IndexExpr->getSourceRange());
5593
5594 if ((IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_S) ||
5595 IndexExpr->getType()->isSpecificBuiltinType(BuiltinType::Char_U))
5596 && !IndexExpr->isTypeDependent())
5597 Diag(LLoc, diag::warn_subscript_is_char) << IndexExpr->getSourceRange();
5598
5599 // C99 6.5.2.1p1: "shall have type "pointer to *object* type". Similarly,
5600 // C++ [expr.sub]p1: The type "T" shall be a completely-defined object
5601 // type. Note that Functions are not objects, and that (in C99 parlance)
5602 // incomplete types are not object types.
5603 if (ResultType->isFunctionType()) {
5604 Diag(BaseExpr->getBeginLoc(), diag::err_subscript_function_type)
5605 << ResultType << BaseExpr->getSourceRange();
5606 return ExprError();
5607 }
5608
5609 if (ResultType->isVoidType() && !getLangOpts().CPlusPlus) {
5610 // GNU extension: subscripting on pointer to void
5611 Diag(LLoc, diag::ext_gnu_subscript_void_type)
5612 << BaseExpr->getSourceRange();
5613
5614 // C forbids expressions of unqualified void type from being l-values.
5615 // See IsCForbiddenLValueType.
5616 if (!ResultType.hasQualifiers())
5617 VK = VK_PRValue;
5618 } else if (!ResultType->isDependentType() &&
5619 RequireCompleteSizedType(
5620 LLoc, ResultType,
5621 diag::err_subscript_incomplete_or_sizeless_type, BaseExpr))
5622 return ExprError();
5623
5624 assert(VK == VK_PRValue || LangOpts.CPlusPlus ||(static_cast<void> (0))
5625 !ResultType.isCForbiddenLValueType())(static_cast<void> (0));
5626
5627 if (LHSExp->IgnoreParenImpCasts()->getType()->isVariablyModifiedType() &&
5628 FunctionScopes.size() > 1) {
5629 if (auto *TT =
5630 LHSExp->IgnoreParenImpCasts()->getType()->getAs<TypedefType>()) {
5631 for (auto I = FunctionScopes.rbegin(),
5632 E = std::prev(FunctionScopes.rend());
5633 I != E; ++I) {
5634 auto *CSI = dyn_cast<CapturingScopeInfo>(*I);
5635 if (CSI == nullptr)
5636 break;
5637 DeclContext *DC = nullptr;
5638 if (auto *LSI = dyn_cast<LambdaScopeInfo>(CSI))
5639 DC = LSI->CallOperator;
5640 else if (auto *CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
5641 DC = CRSI->TheCapturedDecl;
5642 else if (auto *BSI = dyn_cast<BlockScopeInfo>(CSI))
5643 DC = BSI->TheDecl;
5644 if (DC) {
5645 if (DC->containsDecl(TT->getDecl()))
5646 break;
5647 captureVariablyModifiedType(
5648 Context, LHSExp->IgnoreParenImpCasts()->getType(), CSI);
5649 }
5650 }
5651 }
5652 }
5653
5654 return new (Context)
5655 ArraySubscriptExpr(LHSExp, RHSExp, ResultType, VK, OK, RLoc);
5656}
5657
5658bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD,
5659 ParmVarDecl *Param) {
5660 if (Param->hasUnparsedDefaultArg()) {
5661 // If we've already cleared out the location for the default argument,
5662 // that means we're parsing it right now.
5663 if (!UnparsedDefaultArgLocs.count(Param)) {
5664 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD;
5665 Diag(CallLoc, diag::note_recursive_default_argument_used_here);
5666 Param->setInvalidDecl();
5667 return true;
5668 }
5669
5670 Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later)
5671 << FD << cast<CXXRecordDecl>(FD->getDeclContext());
5672 Diag(UnparsedDefaultArgLocs[Param],
5673 diag::note_default_argument_declared_here);
5674 return true;
5675 }
5676
5677 if (Param->hasUninstantiatedDefaultArg() &&
5678 InstantiateDefaultArgument(CallLoc, FD, Param))
5679 return true;
5680
5681 assert(Param->hasInit() && "default argument but no initializer?")(static_cast<void> (0));
5682
5683 // If the default expression creates temporaries, we need to
5684 // push them to the current stack of expression temporaries so they'll
5685 // be properly destroyed.
5686 // FIXME: We should really be rebuilding the default argument with new
5687 // bound temporaries; see the comment in PR5810.
5688 // We don't need to do that with block decls, though, because
5689 // blocks in default argument expression can never capture anything.
5690 if (auto Init = dyn_cast<ExprWithCleanups>(Param->getInit())) {
5691 // Set the "needs cleanups" bit regardless of whether there are
5692 // any explicit objects.
5693 Cleanup.setExprNeedsCleanups(Init->cleanupsHaveSideEffects());
5694
5695 // Append all the objects to the cleanup list. Right now, this
5696 // should always be a no-op, because blocks in default argument
5697 // expressions should never be able to capture anything.
5698 assert(!Init->getNumObjects() &&(static_cast<void> (0))
5699 "default argument expression has capturing blocks?")(static_cast<void> (0));
5700 }
5701
5702 // We already type-checked the argument, so we know it works.
5703 // Just mark all of the declarations in this potentially-evaluated expression
5704 // as being "referenced".
5705 EnterExpressionEvaluationContext EvalContext(
5706 *this, ExpressionEvaluationContext::PotentiallyEvaluated, Param);
5707 MarkDeclarationsReferencedInExpr(Param->getDefaultArg(),
5708 /*SkipLocalVariables=*/true);
5709 return false;
5710}
5711
5712ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
5713 FunctionDecl *FD, ParmVarDecl *Param) {
5714 assert(Param->hasDefaultArg() && "can't build nonexistent default arg")(static_cast<void> (0));
5715 if (CheckCXXDefaultArgExpr(CallLoc, FD, Param))
5716 return ExprError();
5717 return CXXDefaultArgExpr::Create(Context, CallLoc, Param, CurContext);
5718}
5719
5720Sema::VariadicCallType
5721Sema::getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto,
5722 Expr *Fn) {
5723 if (Proto && Proto->isVariadic()) {
5724 if (dyn_cast_or_null<CXXConstructorDecl>(FDecl))
5725 return VariadicConstructor;
5726 else if (Fn && Fn->getType()->isBlockPointerType())
5727 return VariadicBlock;
5728 else if (FDecl) {
5729 if (CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
5730 if (Method->isInstance())
5731 return VariadicMethod;
5732 } else if (Fn && Fn->getType() == Context.BoundMemberTy)
5733 return VariadicMethod;
5734 return VariadicFunction;
5735 }
5736 return VariadicDoesNotApply;
5737}
5738
5739namespace {
5740class FunctionCallCCC final : public FunctionCallFilterCCC {
5741public:
5742 FunctionCallCCC(Sema &SemaRef, const IdentifierInfo *FuncName,
5743 unsigned NumArgs, MemberExpr *ME)
5744 : FunctionCallFilterCCC(SemaRef, NumArgs, false, ME),
5745 FunctionName(FuncName) {}
5746
5747 bool ValidateCandidate(const TypoCorrection &candidate) override {
5748 if (!candidate.getCorrectionSpecifier() ||
5749 candidate.getCorrectionAsIdentifierInfo() != FunctionName) {
5750 return false;
5751 }
5752
5753 return FunctionCallFilterCCC::ValidateCandidate(candidate);
5754 }
5755
5756 std::unique_ptr<CorrectionCandidateCallback> clone() override {
5757 return std::make_unique<FunctionCallCCC>(*this);
5758 }
5759
5760private:
5761 const IdentifierInfo *const FunctionName;
5762};
5763}
5764
5765static TypoCorrection TryTypoCorrectionForCall(Sema &S, Expr *Fn,
5766 FunctionDecl *FDecl,
5767 ArrayRef<Expr *> Args) {
5768 MemberExpr *ME = dyn_cast<MemberExpr>(Fn);
5769 DeclarationName FuncName = FDecl->getDeclName();
5770 SourceLocation NameLoc = ME ? ME->getMemberLoc() : Fn->getBeginLoc();
5771
5772 FunctionCallCCC CCC(S, FuncName.getAsIdentifierInfo(), Args.size(), ME);
5773 if (TypoCorrection Corrected = S.CorrectTypo(
5774 DeclarationNameInfo(FuncName, NameLoc), Sema::LookupOrdinaryName,
5775 S.getScopeForContext(S.CurContext), nullptr, CCC,
5776 Sema::CTK_ErrorRecovery)) {
5777 if (NamedDecl *ND = Corrected.getFoundDecl()) {
5778 if (Corrected.isOverloaded()) {
5779 OverloadCandidateSet OCS(NameLoc, OverloadCandidateSet::CSK_Normal);
5780 OverloadCandidateSet::iterator Best;
5781 for (NamedDecl *CD : Corrected) {
5782 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(CD))
5783 S.AddOverloadCandidate(FD, DeclAccessPair::make(FD, AS_none), Args,
5784 OCS);
5785 }
5786 switch (OCS.BestViableFunction(S, NameLoc, Best)) {
5787 case OR_Success:
5788 ND = Best->FoundDecl;
5789 Corrected.setCorrectionDecl(ND);
5790 break;
5791 default:
5792 break;
5793 }
5794 }
5795 ND = ND->getUnderlyingDecl();
5796 if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND))
5797 return Corrected;
5798 }
5799 }
5800 return TypoCorrection();
5801}
5802
5803/// ConvertArgumentsForCall - Converts the arguments specified in
5804/// Args/NumArgs to the parameter types of the function FDecl with
5805/// function prototype Proto. Call is the call expression itself, and
5806/// Fn is the function expression. For a C++ member function, this
5807/// routine does not attempt to convert the object argument. Returns
5808/// true if the call is ill-formed.
5809bool
5810Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
5811 FunctionDecl *FDecl,
5812 const FunctionProtoType *Proto,
5813 ArrayRef<Expr *> Args,
5814 SourceLocation RParenLoc,
5815 bool IsExecConfig) {
5816 // Bail out early if calling a builtin with custom typechecking.
5817 if (FDecl)
5818 if (unsigned ID = FDecl->getBuiltinID())
5819 if (Context.BuiltinInfo.hasCustomTypechecking(ID))
5820 return false;
5821
5822 // C99 6.5.2.2p7 - the arguments are implicitly converted, as if by
5823 // assignment, to the types of the corresponding parameter, ...
5824 unsigned NumParams = Proto->getNumParams();
5825 bool Invalid = false;
5826 unsigned MinArgs = FDecl ? FDecl->getMinRequiredArguments() : NumParams;
5827 unsigned FnKind = Fn->getType()->isBlockPointerType()
5828 ? 1 /* block */
5829 : (IsExecConfig ? 3 /* kernel function (exec config) */
5830 : 0 /* function */);
5831
5832 // If too few arguments are available (and we don't have default
5833 // arguments for the remaining parameters), don't make the call.
5834 if (Args.size() < NumParams) {
5835 if (Args.size() < MinArgs) {
5836 TypoCorrection TC;
5837 if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {
5838 unsigned diag_id =
5839 MinArgs == NumParams && !Proto->isVariadic()
5840 ? diag::err_typecheck_call_too_few_args_suggest
5841 : diag::err_typecheck_call_too_few_args_at_least_suggest;
5842 diagnoseTypo(TC, PDiag(diag_id) << FnKind << MinArgs
5843 << static_cast<unsigned>(Args.size())
5844 << TC.getCorrectionRange());
5845 } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())
5846 Diag(RParenLoc,
5847 MinArgs == NumParams && !Proto->isVariadic()
5848 ? diag::err_typecheck_call_too_few_args_one
5849 : diag::err_typecheck_call_too_few_args_at_least_one)
5850 << FnKind << FDecl->getParamDecl(0) << Fn->getSourceRange();
5851 else
5852 Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic()
5853 ? diag::err_typecheck_call_too_few_args
5854 : diag::err_typecheck_call_too_few_args_at_least)
5855 << FnKind << MinArgs << static_cast<unsigned>(Args.size())
5856 << Fn->getSourceRange();
5857
5858 // Emit the location of the prototype.
5859 if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig)
5860 Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;
5861
5862 return true;
5863 }
5864 // We reserve space for the default arguments when we create
5865 // the call expression, before calling ConvertArgumentsForCall.
5866 assert((Call->getNumArgs() == NumParams) &&(static_cast<void> (0))
5867 "We should have reserved space for the default arguments before!")(static_cast<void> (0));
5868 }
5869
5870 // If too many are passed and not variadic, error on the extras and drop
5871 // them.
5872 if (Args.size() > NumParams) {
5873 if (!Proto->isVariadic()) {
5874 TypoCorrection TC;
5875 if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {
5876 unsigned diag_id =
5877 MinArgs == NumParams && !Proto->isVariadic()
5878 ? diag::err_typecheck_call_too_many_args_suggest
5879 : diag::err_typecheck_call_too_many_args_at_most_suggest;
5880 diagnoseTypo(TC, PDiag(diag_id) << FnKind << NumParams
5881 << static_cast<unsigned>(Args.size())
5882 << TC.getCorrectionRange());
5883 } else if (NumParams == 1 && FDecl &&
5884 FDecl->getParamDecl(0)->getDeclName())
5885 Diag(Args[NumParams]->getBeginLoc(),
5886 MinArgs == NumParams
5887 ? diag::err_typecheck_call_too_many_args_one
5888 : diag::err_typecheck_call_too_many_args_at_most_one)
5889 << FnKind << FDecl->getParamDecl(0)
5890 << static_cast<unsigned>(Args.size()) << Fn->getSourceRange()
5891 << SourceRange(Args[NumParams]->getBeginLoc(),
5892 Args.back()->getEndLoc());
5893 else
5894 Diag(Args[NumParams]->getBeginLoc(),
5895 MinArgs == NumParams
5896 ? diag::err_typecheck_call_too_many_args
5897 : diag::err_typecheck_call_too_many_args_at_most)
5898 << FnKind << NumParams << static_cast<unsigned>(Args.size())
5899 << Fn->getSourceRange()
5900 << SourceRange(Args[NumParams]->getBeginLoc(),
5901 Args.back()->getEndLoc());
5902
5903 // Emit the location of the prototype.
5904 if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig)
5905 Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;
5906
5907 // This deletes the extra arguments.
5908 Call->shrinkNumArgs(NumParams);
5909 return true;
5910 }
5911 }
5912 SmallVector<Expr *, 8> AllArgs;
5913 VariadicCallType CallType = getVariadicCallType(FDecl, Proto, Fn);
5914
5915 Invalid = GatherArgumentsForCall(Call->getBeginLoc(), FDecl, Proto, 0, Args,
5916 AllArgs, CallType);
5917 if (Invalid)
5918 return true;
5919 unsigned TotalNumArgs = AllArgs.size();
5920 for (unsigned i = 0; i < TotalNumArgs; ++i)
5921 Call->setArg(i, AllArgs[i]);
5922
5923 Call->computeDependence();
5924 return false;
5925}
5926
5927bool Sema::GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl,
5928 const FunctionProtoType *Proto,
5929 unsigned FirstParam, ArrayRef<Expr *> Args,
5930 SmallVectorImpl<Expr *> &AllArgs,
5931 VariadicCallType CallType, bool AllowExplicit,
5932 bool IsListInitialization) {
5933 unsigned NumParams = Proto->getNumParams();
5934 bool Invalid = false;
5935 size_t ArgIx = 0;
5936 // Continue to check argument types (even if we have too few/many args).
5937 for (unsigned i = FirstParam; i < NumParams; i++) {
5938 QualType ProtoArgType = Proto->getParamType(i);
5939
5940 Expr *Arg;
5941 ParmVarDecl *Param = FDecl ? FDecl->getParamDecl(i) : nullptr;
5942 if (ArgIx < Args.size()) {
5943 Arg = Args[ArgIx++];
5944
5945 if (RequireCompleteType(Arg->getBeginLoc(), ProtoArgType,
5946 diag::err_call_incomplete_argument, Arg))
5947 return true;
5948
5949 // Strip the unbridged-cast placeholder expression off, if applicable.
5950 bool CFAudited = false;
5951 if (Arg->getType() == Context.ARCUnbridgedCastTy &&
5952 FDecl && FDecl->hasAttr<CFAuditedTransferAttr>() &&
5953 (!Param || !Param->hasAttr<CFConsumedAttr>()))
5954 Arg = stripARCUnbridgedCast(Arg);
5955 else if (getLangOpts().ObjCAutoRefCount &&
5956 FDecl && FDecl->hasAttr<CFAuditedTransferAttr>() &&
5957 (!Param || !Param->hasAttr<CFConsumedAttr>()))
5958 CFAudited = true;
5959
5960 if (Proto->getExtParameterInfo(i).isNoEscape() &&
5961 ProtoArgType->isBlockPointerType())
5962 if (auto *BE = dyn_cast<BlockExpr>(Arg->IgnoreParenNoopCasts(Context)))
5963 BE->getBlockDecl()->setDoesNotEscape();
5964
5965 InitializedEntity Entity =
5966 Param ? InitializedEntity::InitializeParameter(Context, Param,
5967 ProtoArgType)
5968 : InitializedEntity::InitializeParameter(
5969 Context, ProtoArgType, Proto->isParamConsumed(i));
5970
5971 // Remember that parameter belongs to a CF audited API.
5972 if (CFAudited)
5973 Entity.setParameterCFAudited();
5974
5975 ExprResult ArgE = PerformCopyInitialization(
5976 Entity, SourceLocation(), Arg, IsListInitialization, AllowExplicit);
5977 if (ArgE.isInvalid())
5978 return true;
5979
5980 Arg = ArgE.getAs<Expr>();
5981 } else {
5982 assert(Param && "can't use default arguments without a known callee")(static_cast<void> (0));
5983
5984 ExprResult ArgExpr = BuildCXXDefaultArgExpr(CallLoc, FDecl, Param);
5985 if (ArgExpr.isInvalid())
5986 return true;
5987
5988 Arg = ArgExpr.getAs<Expr>();
5989 }
5990
5991 // Check for array bounds violations for each argument to the call. This
5992 // check only triggers warnings when the argument isn't a more complex Expr
5993 // with its own checking, such as a BinaryOperator.
5994 CheckArrayAccess(Arg);
5995
5996 // Check for violations of C99 static array rules (C99 6.7.5.3p7).
5997 CheckStaticArrayArgument(CallLoc, Param, Arg);
5998
5999 AllArgs.push_back(Arg);
6000 }
6001
6002 // If this is a variadic call, handle args passed through "...".
6003 if (CallType != VariadicDoesNotApply) {
6004 // Assume that extern "C" functions with variadic arguments that
6005 // return __unknown_anytype aren't *really* variadic.
6006 if (Proto->getReturnType() == Context.UnknownAnyTy && FDecl &&
6007 FDecl->isExternC()) {
6008 for (Expr *A : Args.slice(ArgIx)) {
6009 QualType paramType; // ignored
6010 ExprResult arg = checkUnknownAnyArg(CallLoc, A, paramType);
6011 Invalid |= arg.isInvalid();
6012 AllArgs.push_back(arg.get());
6013 }
6014
6015 // Otherwise do argument promotion, (C99 6.5.2.2p7).
6016 } else {
6017 for (Expr *A : Args.slice(ArgIx)) {
6018 ExprResult Arg = DefaultVariadicArgumentPromotion(A, CallType, FDecl);
6019 Invalid |= Arg.isInvalid();
6020 AllArgs.push_back(Arg.get());
6021 }
6022 }
6023
6024 // Check for array bounds violations.
6025 for (Expr *A : Args.slice(ArgIx))
6026 CheckArrayAccess(A);
6027 }
6028 return Invalid;
6029}
6030
6031static void DiagnoseCalleeStaticArrayParam(Sema &S, ParmVarDecl *PVD) {
6032 TypeLoc TL = PVD->getTypeSourceInfo()->getTypeLoc();
6033 if (DecayedTypeLoc DTL = TL.getAs<DecayedTypeLoc>())
6034 TL = DTL.getOriginalLoc();
6035 if (ArrayTypeLoc ATL = TL.getAs<ArrayTypeLoc>())
6036 S.Diag(PVD->getLocation(), diag::note_callee_static_array)
6037 << ATL.getLocalSourceRange();
6038}
6039
6040/// CheckStaticArrayArgument - If the given argument corresponds to a static
6041/// array parameter, check that it is non-null, and that if it is formed by
6042/// array-to-pointer decay, the underlying array is sufficiently large.
6043///
6044/// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of the
6045/// array type derivation, then for each call to the function, the value of the
6046/// corresponding actual argument shall provide access to the first element of
6047/// an array with at least as many elements as specified by the size expression.
6048void
6049Sema::CheckStaticArrayArgument(SourceLocation CallLoc,
6050 ParmVarDecl *Param,
6051 const Expr *ArgExpr) {
6052 // Static array parameters are not supported in C++.
6053 if (!Param || getLangOpts().CPlusPlus)
6054 return;
6055
6056 QualType OrigTy = Param->getOriginalType();
6057
6058 const ArrayType *AT = Context.getAsArrayType(OrigTy);
6059 if (!AT || AT->getSizeModifier() != ArrayType::Static)
6060 return;
6061
6062 if (ArgExpr->isNullPointerConstant(Context,
6063 Expr::NPC_NeverValueDependent)) {
6064 Diag(CallLoc, diag::warn_null_arg) << ArgExpr->getSourceRange();
6065 DiagnoseCalleeStaticArrayParam(*this, Param);
6066 return;
6067 }
6068
6069 const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT);
6070 if (!CAT)
6071 return;
6072
6073 const ConstantArrayType *ArgCAT =
6074 Context.getAsConstantArrayType(ArgExpr->IgnoreParenCasts()->getType());
6075 if (!ArgCAT)
6076 return;
6077
6078 if (getASTContext().hasSameUnqualifiedType(CAT->getElementType(),
6079 ArgCAT->getElementType())) {
6080 if (ArgCAT->getSize().ult(CAT->getSize())) {
6081 Diag(CallLoc, diag::warn_static_array_too_small)
6082 << ArgExpr->getSourceRange()
6083 << (unsigned)ArgCAT->getSize().getZExtValue()
6084 << (unsigned)CAT->getSize().getZExtValue() << 0;
6085 DiagnoseCalleeStaticArrayParam(*this, Param);
6086 }
6087 return;
6088 }
6089
6090 Optional<CharUnits> ArgSize =
6091 getASTContext().getTypeSizeInCharsIfKnown(ArgCAT);
6092 Optional<CharUnits> ParmSize = getASTContext().getTypeSizeInCharsIfKnown(CAT);
6093 if (ArgSize && ParmSize && *ArgSize < *ParmSize) {
6094 Diag(CallLoc, diag::warn_static_array_too_small)
6095 << ArgExpr->getSourceRange() << (unsigned)ArgSize->getQuantity()
6096 << (unsigned)ParmSize->getQuantity() << 1;
6097 DiagnoseCalleeStaticArrayParam(*this, Param);
6098 }
6099}
6100
6101/// Given a function expression of unknown-any type, try to rebuild it
6102/// to have a function type.
6103static ExprResult rebuildUnknownAnyFunction(Sema &S, Expr *fn);
6104
6105/// Is the given type a placeholder that we need to lower out
6106/// immediately during argument processing?
6107static bool isPlaceholderToRemoveAsArg(QualType type) {
6108 // Placeholders are never sugared.
6109 const BuiltinType *placeholder = dyn_cast<BuiltinType>(type);
6110 if (!placeholder) return false;
6111
6112 switch (placeholder->getKind()) {
6113 // Ignore all the non-placeholder types.
6114#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6115 case BuiltinType::Id:
6116#include "clang/Basic/OpenCLImageTypes.def"
6117#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6118 case BuiltinType::Id:
6119#include "clang/Basic/OpenCLExtensionTypes.def"
6120 // In practice we'll never use this, since all SVE types are sugared
6121 // via TypedefTypes rather than exposed directly as BuiltinTypes.
6122#define SVE_TYPE(Name, Id, SingletonId) \
6123 case BuiltinType::Id:
6124#include "clang/Basic/AArch64SVEACLETypes.def"
6125#define PPC_VECTOR_TYPE(Name, Id, Size) \
6126 case BuiltinType::Id:
6127#include "clang/Basic/PPCTypes.def"
6128#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
6129#include "clang/Basic/RISCVVTypes.def"
6130#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)
6131#define BUILTIN_TYPE(ID, SINGLETON_ID) case BuiltinType::ID:
6132#include "clang/AST/BuiltinTypes.def"
6133 return false;
6134
6135 // We cannot lower out overload sets; they might validly be resolved
6136 // by the call machinery.
6137 case BuiltinType::Overload:
6138 return false;
6139
6140 // Unbridged casts in ARC can be handled in some call positions and
6141 // should be left in place.
6142 case BuiltinType::ARCUnbridgedCast:
6143 return false;
6144
6145 // Pseudo-objects should be converted as soon as possible.
6146 case BuiltinType::PseudoObject:
6147 return true;
6148
6149 // The debugger mode could theoretically but currently does not try
6150 // to resolve unknown-typed arguments based on known parameter types.
6151 case BuiltinType::UnknownAny:
6152 return true;
6153
6154 // These are always invalid as call arguments and should be reported.
6155 case BuiltinType::BoundMember:
6156 case BuiltinType::BuiltinFn:
6157 case BuiltinType::IncompleteMatrixIdx:
6158 case BuiltinType::OMPArraySection:
6159 case BuiltinType::OMPArrayShaping:
6160 case BuiltinType::OMPIterator:
6161 return true;
6162
6163 }
6164 llvm_unreachable("bad builtin type kind")__builtin_unreachable();
6165}
6166
6167/// Check an argument list for placeholders that we won't try to
6168/// handle later.
6169static bool checkArgsForPlaceholders(Sema &S, MultiExprArg args) {
6170 // Apply this processing to all the arguments at once instead of
6171 // dying at the first failure.
6172 bool hasInvalid = false;
6173 for (size_t i = 0, e = args.size(); i != e; i++) {
6174 if (isPlaceholderToRemoveAsArg(args[i]->getType())) {
6175 ExprResult result = S.CheckPlaceholderExpr(args[i]);
6176 if (result.isInvalid()) hasInvalid = true;
6177 else args[i] = result.get();
6178 }
6179 }
6180 return hasInvalid;
6181}
6182
6183/// If a builtin function has a pointer argument with no explicit address
6184/// space, then it should be able to accept a pointer to any address
6185/// space as input. In order to do this, we need to replace the
6186/// standard builtin declaration with one that uses the same address space
6187/// as the call.
6188///
6189/// \returns nullptr If this builtin is not a candidate for a rewrite i.e.
6190/// it does not contain any pointer arguments without
6191/// an address space qualifer. Otherwise the rewritten
6192/// FunctionDecl is returned.
6193/// TODO: Handle pointer return types.
6194static FunctionDecl *rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context,
6195 FunctionDecl *FDecl,
6196 MultiExprArg ArgExprs) {
6197
6198 QualType DeclType = FDecl->getType();
6199 const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(DeclType);
6200
6201 if (!Context.BuiltinInfo.hasPtrArgsOrResult(FDecl->getBuiltinID()) || !FT ||
6202 ArgExprs.size() < FT->getNumParams())
6203 return nullptr;
6204
6205 bool NeedsNewDecl = false;
6206 unsigned i = 0;
6207 SmallVector<QualType, 8> OverloadParams;
6208
6209 for (QualType ParamType : FT->param_types()) {
6210
6211 // Convert array arguments to pointer to simplify type lookup.
6212 ExprResult ArgRes =
6213 Sema->DefaultFunctionArrayLvalueConversion(ArgExprs[i++]);
6214 if (ArgRes.isInvalid())
6215 return nullptr;
6216 Expr *Arg = ArgRes.get();
6217 QualType ArgType = Arg->getType();
6218 if (!ParamType->isPointerType() ||
6219 ParamType.hasAddressSpace() ||
6220 !ArgType->isPointerType() ||
6221 !ArgType->getPointeeType().hasAddressSpace()) {
6222 OverloadParams.push_back(ParamType);
6223 continue;
6224 }
6225
6226 QualType PointeeType = ParamType->getPointeeType();
6227 if (PointeeType.hasAddressSpace())
6228 continue;
6229
6230 NeedsNewDecl = true;
6231 LangAS AS = ArgType->getPointeeType().getAddressSpace();
6232
6233 PointeeType = Context.getAddrSpaceQualType(PointeeType, AS);
6234 OverloadParams.push_back(Context.getPointerType(PointeeType));
6235 }
6236
6237 if (!NeedsNewDecl)
6238 return nullptr;
6239
6240 FunctionProtoType::ExtProtoInfo EPI;
6241 EPI.Variadic = FT->isVariadic();
6242 QualType OverloadTy = Context.getFunctionType(FT->getReturnType(),
6243 OverloadParams, EPI);
6244 DeclContext *Parent = FDecl->getParent();
6245 FunctionDecl *OverloadDecl = FunctionDecl::Create(
6246 Context, Parent, FDecl->getLocation(), FDecl->getLocation(),
6247 FDecl->getIdentifier(), OverloadTy,
6248 /*TInfo=*/nullptr, SC_Extern, Sema->getCurFPFeatures().isFPConstrained(),
6249 false,
6250 /*hasPrototype=*/true);
6251 SmallVector<ParmVarDecl*, 16> Params;
6252 FT = cast<FunctionProtoType>(OverloadTy);
6253 for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
6254 QualType ParamType = FT->getParamType(i);
6255 ParmVarDecl *Parm =
6256 ParmVarDecl::Create(Context, OverloadDecl, SourceLocation(),
6257 SourceLocation(), nullptr, ParamType,
6258 /*TInfo=*/nullptr, SC_None, nullptr);
6259 Parm->setScopeInfo(0, i);
6260 Params.push_back(Parm);
6261 }
6262 OverloadDecl->setParams(Params);
6263 Sema->mergeDeclAttributes(OverloadDecl, FDecl);
6264 return OverloadDecl;
6265}
6266
6267static void checkDirectCallValidity(Sema &S, const Expr *Fn,
6268 FunctionDecl *Callee,
6269 MultiExprArg ArgExprs) {
6270 // `Callee` (when called with ArgExprs) may be ill-formed. enable_if (and
6271 // similar attributes) really don't like it when functions are called with an
6272 // invalid number of args.
6273 if (S.TooManyArguments(Callee->getNumParams(), ArgExprs.size(),
6274 /*PartialOverloading=*/false) &&
6275 !Callee->isVariadic())
6276 return;
6277 if (Callee->getMinRequiredArguments() > ArgExprs.size())
6278 return;
6279
6280 if (const EnableIfAttr *Attr =
6281 S.CheckEnableIf(Callee, Fn->getBeginLoc(), ArgExprs, true)) {
6282 S.Diag(Fn->getBeginLoc(),
6283 isa<CXXMethodDecl>(Callee)
6284 ? diag::err_ovl_no_viable_member_function_in_call
6285 : diag::err_ovl_no_viable_function_in_call)
6286 << Callee << Callee->getSourceRange();
6287 S.Diag(Callee->getLocation(),
6288 diag::note_ovl_candidate_disabled_by_function_cond_attr)
6289 << Attr->getCond()->getSourceRange() << Attr->getMessage();
6290 return;
6291 }
6292}
6293
6294static bool enclosingClassIsRelatedToClassInWhichMembersWereFound(
6295 const UnresolvedMemberExpr *const UME, Sema &S) {
6296
6297 const auto GetFunctionLevelDCIfCXXClass =
6298 [](Sema &S) -> const CXXRecordDecl * {
6299 const DeclContext *const DC = S.getFunctionLevelDeclContext();
6300 if (!DC || !DC->getParent())
6301 return nullptr;
6302
6303 // If the call to some member function was made from within a member
6304 // function body 'M' return return 'M's parent.
6305 if (const auto *MD = dyn_cast<CXXMethodDecl>(DC))
6306 return MD->getParent()->getCanonicalDecl();
6307 // else the call was made from within a default member initializer of a
6308 // class, so return the class.
6309 if (const auto *RD = dyn_cast<CXXRecordDecl>(DC))
6310 return RD->getCanonicalDecl();
6311 return nullptr;
6312 };
6313 // If our DeclContext is neither a member function nor a class (in the
6314 // case of a lambda in a default member initializer), we can't have an
6315 // enclosing 'this'.
6316
6317 const CXXRecordDecl *const CurParentClass = GetFunctionLevelDCIfCXXClass(S);
6318 if (!CurParentClass)
6319 return false;
6320
6321 // The naming class for implicit member functions call is the class in which
6322 // name lookup starts.
6323 const CXXRecordDecl *const NamingClass =
6324 UME->getNamingClass()->getCanonicalDecl();
6325 assert(NamingClass && "Must have naming class even for implicit access")(static_cast<void> (0));
6326
6327 // If the unresolved member functions were found in a 'naming class' that is
6328 // related (either the same or derived from) to the class that contains the
6329 // member function that itself contained the implicit member access.
6330
6331 return CurParentClass == NamingClass ||
6332 CurParentClass->isDerivedFrom(NamingClass);
6333}
6334
6335static void
6336tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs(
6337 Sema &S, const UnresolvedMemberExpr *const UME, SourceLocation CallLoc) {
6338
6339 if (!UME)
6340 return;
6341
6342 LambdaScopeInfo *const CurLSI = S.getCurLambda();
6343 // Only try and implicitly capture 'this' within a C++ Lambda if it hasn't
6344 // already been captured, or if this is an implicit member function call (if
6345 // it isn't, an attempt to capture 'this' should already have been made).
6346 if (!CurLSI || CurLSI->ImpCaptureStyle == CurLSI->ImpCap_None ||
6347 !UME->isImplicitAccess() || CurLSI->isCXXThisCaptured())
6348 return;
6349
6350 // Check if the naming class in which the unresolved members were found is
6351 // related (same as or is a base of) to the enclosing class.
6352
6353 if (!enclosingClassIsRelatedToClassInWhichMembersWereFound(UME, S))
6354 return;
6355
6356
6357 DeclContext *EnclosingFunctionCtx = S.CurContext->getParent()->getParent();
6358 // If the enclosing function is not dependent, then this lambda is
6359 // capture ready, so if we can capture this, do so.
6360 if (!EnclosingFunctionCtx->isDependentContext()) {
6361 // If the current lambda and all enclosing lambdas can capture 'this' -
6362 // then go ahead and capture 'this' (since our unresolved overload set
6363 // contains at least one non-static member function).
6364 if (!S.CheckCXXThisCapture(CallLoc, /*Explcit*/ false, /*Diagnose*/ false))
6365 S.CheckCXXThisCapture(CallLoc);
6366 } else if (S.CurContext->isDependentContext()) {
6367 // ... since this is an implicit member reference, that might potentially
6368 // involve a 'this' capture, mark 'this' for potential capture in
6369 // enclosing lambdas.
6370 if (CurLSI->ImpCaptureStyle != CurLSI->ImpCap_None)
6371 CurLSI->addPotentialThisCapture(CallLoc);
6372 }
6373}
6374
6375ExprResult Sema::ActOnCallExpr(Scope *Scope, Expr *Fn, SourceLocation LParenLoc,
6376 MultiExprArg ArgExprs, SourceLocation RParenLoc,
6377 Expr *ExecConfig) {
6378 ExprResult Call =
6379 BuildCallExpr(Scope, Fn, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6380 /*IsExecConfig=*/false, /*AllowRecovery=*/true);
6381 if (Call.isInvalid())
6382 return Call;
6383
6384 // Diagnose uses of the C++20 "ADL-only template-id call" feature in earlier
6385 // language modes.
6386 if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn)) {
6387 if (ULE->hasExplicitTemplateArgs() &&
6388 ULE->decls_begin() == ULE->decls_end()) {
6389 Diag(Fn->getExprLoc(), getLangOpts().CPlusPlus20
6390 ? diag::warn_cxx17_compat_adl_only_template_id
6391 : diag::ext_adl_only_template_id)
6392 << ULE->getName();
6393 }
6394 }
6395
6396 if (LangOpts.OpenMP)
6397 Call = ActOnOpenMPCall(Call, Scope, LParenLoc, ArgExprs, RParenLoc,
6398 ExecConfig);
6399
6400 return Call;
6401}
6402
6403/// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
6404/// This provides the location of the left/right parens and a list of comma
6405/// locations.
6406ExprResult Sema::BuildCallExpr(Scope *Scope, Expr *Fn, SourceLocation LParenLoc,
6407 MultiExprArg ArgExprs, SourceLocation RParenLoc,
6408 Expr *ExecConfig, bool IsExecConfig,
6409 bool AllowRecovery) {
6410 // Since this might be a postfix expression, get rid of ParenListExprs.
6411 ExprResult Result = MaybeConvertParenListExprToParenExpr(Scope, Fn);
6412 if (Result.isInvalid()) return ExprError();
6413 Fn = Result.get();
6414
6415 if (checkArgsForPlaceholders(*this, ArgExprs))
6416 return ExprError();
6417
6418 if (getLangOpts().CPlusPlus) {
6419 // If this is a pseudo-destructor expression, build the call immediately.
6420 if (isa<CXXPseudoDestructorExpr>(Fn)) {
6421 if (!ArgExprs.empty()) {
6422 // Pseudo-destructor calls should not have any arguments.
6423 Diag(Fn->getBeginLoc(), diag::err_pseudo_dtor_call_with_args)
6424 << FixItHint::CreateRemoval(
6425 SourceRange(ArgExprs.front()->getBeginLoc(),
6426 ArgExprs.back()->getEndLoc()));
6427 }
6428
6429 return CallExpr::Create(Context, Fn, /*Args=*/{}, Context.VoidTy,
6430 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
6431 }
6432 if (Fn->getType() == Context.PseudoObjectTy) {
6433 ExprResult result = CheckPlaceholderExpr(Fn);
6434 if (result.isInvalid()) return ExprError();
6435 Fn = result.get();
6436 }
6437
6438 // Determine whether this is a dependent call inside a C++ template,
6439 // in which case we won't do any semantic analysis now.
6440 if (Fn->isTypeDependent() || Expr::hasAnyTypeDependentArguments(ArgExprs)) {
6441 if (ExecConfig) {
6442 return CUDAKernelCallExpr::Create(Context, Fn,
6443 cast<CallExpr>(ExecConfig), ArgExprs,
6444 Context.DependentTy, VK_PRValue,
6445 RParenLoc, CurFPFeatureOverrides());
6446 } else {
6447
6448 tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs(
6449 *this, dyn_cast<UnresolvedMemberExpr>(Fn->IgnoreParens()),
6450 Fn->getBeginLoc());
6451
6452 return CallExpr::Create(Context, Fn, ArgExprs, Context.DependentTy,
6453 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
6454 }
6455 }
6456
6457 // Determine whether this is a call to an object (C++ [over.call.object]).
6458 if (Fn->getType()->isRecordType())
6459 return BuildCallToObjectOfClassType(Scope, Fn, LParenLoc, ArgExprs,
6460 RParenLoc);
6461
6462 if (Fn->getType() == Context.UnknownAnyTy) {
6463 ExprResult result = rebuildUnknownAnyFunction(*this, Fn);
6464 if (result.isInvalid()) return ExprError();
6465 Fn = result.get();
6466 }
6467
6468 if (Fn->getType() == Context.BoundMemberTy) {
6469 return BuildCallToMemberFunction(Scope, Fn, LParenLoc, ArgExprs,
6470 RParenLoc, AllowRecovery);
6471 }
6472 }
6473
6474 // Check for overloaded calls. This can happen even in C due to extensions.
6475 if (Fn->getType() == Context.OverloadTy) {
6476 OverloadExpr::FindResult find = OverloadExpr::find(Fn);
6477
6478 // We aren't supposed to apply this logic if there's an '&' involved.
6479 if (!find.HasFormOfMemberPointer) {
6480 if (Expr::hasAnyTypeDependentArguments(ArgExprs))
6481 return CallExpr::Create(Context, Fn, ArgExprs, Context.DependentTy,
6482 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
6483 OverloadExpr *ovl = find.Expression;
6484 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(ovl))
6485 return BuildOverloadedCallExpr(
6486 Scope, Fn, ULE, LParenLoc, ArgExprs, RParenLoc, ExecConfig,
6487 /*AllowTypoCorrection=*/true, find.IsAddressOfOperand);
6488 return BuildCallToMemberFunction(Scope, Fn, LParenLoc, ArgExprs,
6489 RParenLoc, AllowRecovery);
6490 }
6491 }
6492
6493 // If we're directly calling a function, get the appropriate declaration.
6494 if (Fn->getType() == Context.UnknownAnyTy) {
6495 ExprResult result = rebuildUnknownAnyFunction(*this, Fn);
6496 if (result.isInvalid()) return ExprError();
6497 Fn = result.get();
6498 }
6499
6500 Expr *NakedFn = Fn->IgnoreParens();
6501
6502 bool CallingNDeclIndirectly = false;
6503 NamedDecl *NDecl = nullptr;
6504 if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn)) {
6505 if (UnOp->getOpcode() == UO_AddrOf) {
6506 CallingNDeclIndirectly = true;
6507 NakedFn = UnOp->getSubExpr()->IgnoreParens();
6508 }
6509 }
6510
6511 if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
6512 NDecl = DRE->getDecl();
6513
6514 FunctionDecl *FDecl = dyn_cast<FunctionDecl>(NDecl);
6515 if (FDecl && FDecl->getBuiltinID()) {
6516 // Rewrite the function decl for this builtin by replacing parameters
6517 // with no explicit address space with the address space of the arguments
6518 // in ArgExprs.
6519 if ((FDecl =
6520 rewriteBuiltinFunctionDecl(this, Context, FDecl, ArgExprs))) {
6521 NDecl = FDecl;
6522 Fn = DeclRefExpr::Create(
6523 Context, FDecl->getQualifierLoc(), SourceLocation(), FDecl, false,
6524 SourceLocation(), FDecl->getType(), Fn->getValueKind(), FDecl,
6525 nullptr, DRE->isNonOdrUse());
6526 }
6527 }
6528 } else if (isa<MemberExpr>(NakedFn))
6529 NDecl = cast<MemberExpr>(NakedFn)->getMemberDecl();
6530
6531 if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(NDecl)) {
6532 if (CallingNDeclIndirectly && !checkAddressOfFunctionIsAvailable(
6533 FD, /*Complain=*/true, Fn->getBeginLoc()))
6534 return ExprError();
6535
6536 checkDirectCallValidity(*this, Fn, FD, ArgExprs);
6537
6538 // If this expression is a call to a builtin function in HIP device
6539 // compilation, allow a pointer-type argument to default address space to be
6540 // passed as a pointer-type parameter to a non-default address space.
6541 // If Arg is declared in the default address space and Param is declared
6542 // in a non-default address space, perform an implicit address space cast to
6543 // the parameter type.
6544 if (getLangOpts().HIP && getLangOpts().CUDAIsDevice && FD &&
6545 FD->getBuiltinID()) {
6546 for (unsigned Idx = 0; Idx < FD->param_size(); ++Idx) {
6547 ParmVarDecl *Param = FD->getParamDecl(Idx);
6548 if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
6549 !ArgExprs[Idx]->getType()->isPointerType())
6550 continue;
6551
6552 auto ParamAS = Param->getType()->getPointeeType().getAddressSpace();
6553 auto ArgTy = ArgExprs[Idx]->getType();
6554 auto ArgPtTy = ArgTy->getPointeeType();
6555 auto ArgAS = ArgPtTy.getAddressSpace();
6556
6557 // Only allow implicit casting from a non-default address space pointee
6558 // type to a default address space pointee type
6559 if (ArgAS != LangAS::Default || ParamAS == LangAS::Default)
6560 continue;
6561
6562 // First, ensure that the Arg is an RValue.
6563 if (ArgExprs[Idx]->isGLValue()) {
6564 ArgExprs[Idx] = ImplicitCastExpr::Create(
6565 Context, ArgExprs[Idx]->getType(), CK_NoOp, ArgExprs[Idx],
6566 nullptr, VK_PRValue, FPOptionsOverride());
6567 }
6568
6569 // Construct a new arg type with address space of Param
6570 Qualifiers ArgPtQuals = ArgPtTy.getQualifiers();
6571 ArgPtQuals.setAddressSpace(ParamAS);
6572 auto NewArgPtTy =
6573 Context.getQualifiedType(ArgPtTy.getUnqualifiedType(), ArgPtQuals);
6574 auto NewArgTy =
6575 Context.getQualifiedType(Context.getPointerType(NewArgPtTy),
6576 ArgTy.getQualifiers());
6577
6578 // Finally perform an implicit address space cast
6579 ArgExprs[Idx] = ImpCastExprToType(ArgExprs[Idx], NewArgTy,
6580 CK_AddressSpaceConversion)
6581 .get();
6582 }
6583 }
6584 }
6585
6586 if (Context.isDependenceAllowed() &&
6587 (Fn->isTypeDependent() || Expr::hasAnyTypeDependentArguments(ArgExprs))) {
6588 assert(!getLangOpts().CPlusPlus)(static_cast<void> (0));
6589 assert((Fn->containsErrors() ||(static_cast<void> (0))
6590 llvm::any_of(ArgExprs,(static_cast<void> (0))
6591 [](clang::Expr *E) { return E->containsErrors(); })) &&(static_cast<void> (0))
6592 "should only occur in error-recovery path.")(static_cast<void> (0));
6593 QualType ReturnType =
6594 llvm::isa_and_nonnull<FunctionDecl>(NDecl)
6595 ? cast<FunctionDecl>(NDecl)->getCallResultType()
6596 : Context.DependentTy;
6597 return CallExpr::Create(Context, Fn, ArgExprs, ReturnType,
6598 Expr::getValueKindForType(ReturnType), RParenLoc,
6599 CurFPFeatureOverrides());
6600 }
6601 return BuildResolvedCallExpr(Fn, NDecl, LParenLoc, ArgExprs, RParenLoc,
6602 ExecConfig, IsExecConfig);
6603}
6604
6605/// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
6606// with the specified CallArgs
6607Expr *Sema::BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
6608 MultiExprArg CallArgs) {
6609 StringRef Name = Context.BuiltinInfo.getName(Id);
6610 LookupResult R(*this, &Context.Idents.get(Name), Loc,
6611 Sema::LookupOrdinaryName);
6612 LookupName(R, TUScope, /*AllowBuiltinCreation=*/true);
6613
6614 auto *BuiltInDecl = R.getAsSingle<FunctionDecl>();
6615 assert(BuiltInDecl && "failed to find builtin declaration")(static_cast<void> (0));
6616
6617 ExprResult DeclRef =
6618 BuildDeclRefExpr(BuiltInDecl, BuiltInDecl->getType(), VK_LValue, Loc);
6619 assert(DeclRef.isUsable() && "Builtin reference cannot fail")(static_cast<void> (0));
6620
6621 ExprResult Call =
6622 BuildCallExpr(/*Scope=*/nullptr, DeclRef.get(), Loc, CallArgs, Loc);
6623
6624 assert(!Call.isInvalid() && "Call to builtin cannot fail!")(static_cast<void> (0));
6625 return Call.get();
6626}
6627
6628/// Parse a __builtin_astype expression.
6629///
6630/// __builtin_astype( value, dst type )
6631///
6632ExprResult Sema::ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
6633 SourceLocation BuiltinLoc,
6634 SourceLocation RParenLoc) {
6635 QualType DstTy = GetTypeFromParser(ParsedDestTy);
6636 return BuildAsTypeExpr(E, DstTy, BuiltinLoc, RParenLoc);
6637}
6638
6639/// Create a new AsTypeExpr node (bitcast) from the arguments.
6640ExprResult Sema::BuildAsTypeExpr(Expr *E, QualType DestTy,
6641 SourceLocation BuiltinLoc,
6642 SourceLocation RParenLoc) {
6643 ExprValueKind VK = VK_PRValue;
6644 ExprObjectKind OK = OK_Ordinary;
6645 QualType SrcTy = E->getType();
6646 if (!SrcTy->isDependentType() &&
6647 Context.getTypeSize(DestTy) != Context.getTypeSize(SrcTy))
6648 return ExprError(
6649 Diag(BuiltinLoc, diag::err_invalid_astype_of_different_size)
6650 << DestTy << SrcTy << E->getSourceRange());
6651 return new (Context) AsTypeExpr(E, DestTy, VK, OK, BuiltinLoc, RParenLoc);
6652}
6653
6654/// ActOnConvertVectorExpr - create a new convert-vector expression from the
6655/// provided arguments.
6656///
6657/// __builtin_convertvector( value, dst type )
6658///
6659ExprResult Sema::ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy,
6660 SourceLocation BuiltinLoc,
6661 SourceLocation RParenLoc) {
6662 TypeSourceInfo *TInfo;
6663 GetTypeFromParser(ParsedDestTy, &TInfo);
6664 return SemaConvertVectorExpr(E, TInfo, BuiltinLoc, RParenLoc);
6665}
6666
6667/// BuildResolvedCallExpr - Build a call to a resolved expression,
6668/// i.e. an expression not of \p OverloadTy. The expression should
6669/// unary-convert to an expression of function-pointer or
6670/// block-pointer type.
6671///
6672/// \param NDecl the declaration being called, if available
6673ExprResult Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl,
6674 SourceLocation LParenLoc,
6675 ArrayRef<Expr *> Args,
6676 SourceLocation RParenLoc, Expr *Config,
6677 bool IsExecConfig, ADLCallKind UsesADL) {
6678 FunctionDecl *FDecl = dyn_cast_or_null<FunctionDecl>(NDecl);
6679 unsigned BuiltinID = (FDecl ? FDecl->getBuiltinID() : 0);
6680
6681 // Functions with 'interrupt' attribute cannot be called directly.
6682 if (FDecl && FDecl->hasAttr<AnyX86InterruptAttr>()) {
6683 Diag(Fn->getExprLoc(), diag::err_anyx86_interrupt_called);
6684 return ExprError();
6685 }
6686
6687 // Interrupt handlers don't save off the VFP regs automatically on ARM,
6688 // so there's some risk when calling out to non-interrupt handler functions
6689 // that the callee might not preserve them. This is easy to diagnose here,
6690 // but can be very challenging to debug.
6691 // Likewise, X86 interrupt handlers may only call routines with attribute
6692 // no_caller_saved_registers since there is no efficient way to
6693 // save and restore the non-GPR state.
6694 if (auto *Caller = getCurFunctionDecl()) {
6695 if (Caller->hasAttr<ARMInterruptAttr>()) {
6696 bool VFP = Context.getTargetInfo().hasFeature("vfp");
6697 if (VFP && (!FDecl || !FDecl->hasAttr<ARMInterruptAttr>())) {
6698 Diag(Fn->getExprLoc(), diag::warn_arm_interrupt_calling_convention);
6699 if (FDecl)
6700 Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;
6701 }
6702 }
6703 if (Caller->hasAttr<AnyX86InterruptAttr>() &&
6704 ((!FDecl || !FDecl->hasAttr<AnyX86NoCallerSavedRegistersAttr>()))) {
6705 Diag(Fn->getExprLoc(), diag::warn_anyx86_interrupt_regsave);
6706 if (FDecl)
6707 Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;
6708 }
6709 }
6710
6711 // Promote the function operand.
6712 // We special-case function promotion here because we only allow promoting
6713 // builtin functions to function pointers in the callee of a call.
6714 ExprResult Result;
6715 QualType ResultTy;
6716 if (BuiltinID &&
6717 Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) {
6718 // Extract the return type from the (builtin) function pointer type.
6719 // FIXME Several builtins still have setType in
6720 // Sema::CheckBuiltinFunctionCall. One should review their definitions in
6721 // Builtins.def to ensure they are correct before removing setType calls.
6722 QualType FnPtrTy = Context.getPointerType(FDecl->getType());
6723 Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get();
6724 ResultTy = FDecl->getCallResultType();
6725 } else {
6726 Result = CallExprUnaryConversions(Fn);
6727 ResultTy = Context.BoolTy;
6728 }
6729 if (Result.isInvalid())
6730 return ExprError();
6731 Fn = Result.get();
6732
6733 // Check for a valid function type, but only if it is not a builtin which
6734 // requires custom type checking. These will be handled by
6735 // CheckBuiltinFunctionCall below just after creation of the call expression.
6736 const FunctionType *FuncT = nullptr;
6737 if (!BuiltinID || !Context.BuiltinInfo.hasCustomTypechecking(BuiltinID)) {
6738 retry:
6739 if (const PointerType *PT = Fn->getType()->getAs<PointerType>()) {
6740 // C99 6.5.2.2p1 - "The expression that denotes the called function shall
6741 // have type pointer to function".
6742 FuncT = PT->getPointeeType()->getAs<FunctionType>();
6743 if (!FuncT)
6744 return ExprError(Diag(LParenLoc, diag::err_typecheck_call_not_function)
6745 << Fn->getType() << Fn->getSourceRange());
6746 } else if (const BlockPointerType *BPT =
6747 Fn->getType()->getAs<BlockPointerType>()) {
6748 FuncT = BPT->getPointeeType()->castAs<FunctionType>();
6749 } else {
6750 // Handle calls to expressions of unknown-any type.
6751 if (Fn->getType() == Context.UnknownAnyTy) {
6752 ExprResult rewrite = rebuildUnknownAnyFunction(*this, Fn);
6753 if (rewrite.isInvalid())
6754 return ExprError();
6755 Fn = rewrite.get();
6756 goto retry;
6757 }
6758
6759 return ExprError(Diag(LParenLoc, diag::err_typecheck_call_not_function)
6760 << Fn->getType() << Fn->getSourceRange());
6761 }
6762 }
6763
6764 // Get the number of parameters in the function prototype, if any.
6765 // We will allocate space for max(Args.size(), NumParams) arguments
6766 // in the call expression.
6767 const auto *Proto = dyn_cast_or_null<FunctionProtoType>(FuncT);
6768 unsigned NumParams = Proto ? Proto->getNumParams() : 0;
6769
6770 CallExpr *TheCall;
6771 if (Config) {
6772 assert(UsesADL == ADLCallKind::NotADL &&(static_cast<void> (0))
6773 "CUDAKernelCallExpr should not use ADL")(static_cast<void> (0));
6774 TheCall = CUDAKernelCallExpr::Create(Context, Fn, cast<CallExpr>(Config),
6775 Args, ResultTy, VK_PRValue, RParenLoc,
6776 CurFPFeatureOverrides(), NumParams);
6777 } else {
6778 TheCall =
6779 CallExpr::Create(Context, Fn, Args, ResultTy, VK_PRValue, RParenLoc,
6780 CurFPFeatureOverrides(), NumParams, UsesADL);
6781 }
6782
6783 if (!Context.isDependenceAllowed()) {
6784 // Forget about the nulled arguments since typo correction
6785 // do not handle them well.
6786 TheCall->shrinkNumArgs(Args.size());
6787 // C cannot always handle TypoExpr nodes in builtin calls and direct
6788 // function calls as their argument checking don't necessarily handle
6789 // dependent types properly, so make sure any TypoExprs have been
6790 // dealt with.
6791 ExprResult Result = CorrectDelayedTyposInExpr(TheCall);
6792 if (!Result.isUsable()) return ExprError();
6793 CallExpr *TheOldCall = TheCall;
6794 TheCall = dyn_cast<CallExpr>(Result.get());
6795 bool CorrectedTypos = TheCall != TheOldCall;
6796 if (!TheCall) return Result;
6797 Args = llvm::makeArrayRef(TheCall->getArgs(), TheCall->getNumArgs());
6798
6799 // A new call expression node was created if some typos were corrected.
6800 // However it may not have been constructed with enough storage. In this
6801 // case, rebuild the node with enough storage. The waste of space is
6802 // immaterial since this only happens when some typos were corrected.
6803 if (CorrectedTypos && Args.size() < NumParams) {
6804 if (Config)
6805 TheCall = CUDAKernelCallExpr::Create(
6806 Context, Fn, cast<CallExpr>(Config), Args, ResultTy, VK_PRValue,
6807 RParenLoc, CurFPFeatureOverrides(), NumParams);
6808 else
6809 TheCall =
6810 CallExpr::Create(Context, Fn, Args, ResultTy, VK_PRValue, RParenLoc,
6811 CurFPFeatureOverrides(), NumParams, UsesADL);
6812 }
6813 // We can now handle the nulled arguments for the default arguments.
6814 TheCall->setNumArgsUnsafe(std::max<unsigned>(Args.size(), NumParams));
6815 }
6816
6817 // Bail out early if calling a builtin with custom type checking.
6818 if (BuiltinID && Context.BuiltinInfo.hasCustomTypechecking(BuiltinID))
6819 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6820
6821 if (getLangOpts().CUDA) {
6822 if (Config) {
6823 // CUDA: Kernel calls must be to global functions
6824 if (FDecl && !FDecl->hasAttr<CUDAGlobalAttr>())
6825 return ExprError(Diag(LParenLoc,diag::err_kern_call_not_global_function)
6826 << FDecl << Fn->getSourceRange());
6827
6828 // CUDA: Kernel function must have 'void' return type
6829 if (!FuncT->getReturnType()->isVoidType() &&
6830 !FuncT->getReturnType()->getAs<AutoType>() &&
6831 !FuncT->getReturnType()->isInstantiationDependentType())
6832 return ExprError(Diag(LParenLoc, diag::err_kern_type_not_void_return)
6833 << Fn->getType() << Fn->getSourceRange());
6834 } else {
6835 // CUDA: Calls to global functions must be configured
6836 if (FDecl && FDecl->hasAttr<CUDAGlobalAttr>())
6837 return ExprError(Diag(LParenLoc, diag::err_global_call_not_config)
6838 << FDecl << Fn->getSourceRange());
6839 }
6840 }
6841
6842 // Check for a valid return type
6843 if (CheckCallReturnType(FuncT->getReturnType(), Fn->getBeginLoc(), TheCall,
6844 FDecl))
6845 return ExprError();
6846
6847 // We know the result type of the call, set it.
6848 TheCall->setType(FuncT->getCallResultType(Context));
6849 TheCall->setValueKind(Expr::getValueKindForType(FuncT->getReturnType()));
6850
6851 if (Proto) {
6852 if (ConvertArgumentsForCall(TheCall, Fn, FDecl, Proto, Args, RParenLoc,
6853 IsExecConfig))
6854 return ExprError();
6855 } else {
6856 assert(isa<FunctionNoProtoType>(FuncT) && "Unknown FunctionType!")(static_cast<void> (0));
6857
6858 if (FDecl) {
6859 // Check if we have too few/too many template arguments, based
6860 // on our knowledge of the function definition.
6861 const FunctionDecl *Def = nullptr;
6862 if (FDecl->hasBody(Def) && Args.size() != Def->param_size()) {
6863 Proto = Def->getType()->getAs<FunctionProtoType>();
6864 if (!Proto || !(Proto->isVariadic() && Args.size() >= Def->param_size()))
6865 Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
6866 << (Args.size() > Def->param_size()) << FDecl << Fn->getSourceRange();
6867 }
6868
6869 // If the function we're calling isn't a function prototype, but we have
6870 // a function prototype from a prior declaratiom, use that prototype.
6871 if (!FDecl->hasPrototype())
6872 Proto = FDecl->getType()->getAs<FunctionProtoType>();
6873 }
6874
6875 // Promote the arguments (C99 6.5.2.2p6).
6876 for (unsigned i = 0, e = Args.size(); i != e; i++) {
6877 Expr *Arg = Args[i];
6878
6879 if (Proto && i < Proto->getNumParams()) {
6880 InitializedEntity Entity = InitializedEntity::InitializeParameter(
6881 Context, Proto->getParamType(i), Proto->isParamConsumed(i));
6882 ExprResult ArgE =
6883 PerformCopyInitialization(Entity, SourceLocation(), Arg);
6884 if (ArgE.isInvalid())
6885 return true;
6886
6887 Arg = ArgE.getAs<Expr>();
6888
6889 } else {
6890 ExprResult ArgE = DefaultArgumentPromotion(Arg);
6891
6892 if (ArgE.isInvalid())
6893 return true;
6894
6895 Arg = ArgE.getAs<Expr>();
6896 }
6897
6898 if (RequireCompleteType(Arg->getBeginLoc(), Arg->getType(),
6899 diag::err_call_incomplete_argument, Arg))
6900 return ExprError();
6901
6902 TheCall->setArg(i, Arg);
6903 }
6904 TheCall->computeDependence();
6905 }
6906
6907 if (CXXMethodDecl *Method = dyn_cast_or_null<CXXMethodDecl>(FDecl))
6908 if (!Method->isStatic())
6909 return ExprError(Diag(LParenLoc, diag::err_member_call_without_object)
6910 << Fn->getSourceRange());
6911
6912 // Check for sentinels
6913 if (NDecl)
6914 DiagnoseSentinelCalls(NDecl, LParenLoc, Args);
6915
6916 // Warn for unions passing across security boundary (CMSE).
6917 if (FuncT != nullptr && FuncT->getCmseNSCallAttr()) {
6918 for (unsigned i = 0, e = Args.size(); i != e; i++) {
6919 if (const auto *RT =
6920 dyn_cast<RecordType>(Args[i]->getType().getCanonicalType())) {
6921 if (RT->getDecl()->isOrContainsUnion())
6922 Diag(Args[i]->getBeginLoc(), diag::warn_cmse_nonsecure_union)
6923 << 0 << i;
6924 }
6925 }
6926 }
6927
6928 // Do special checking on direct calls to functions.
6929 if (FDecl) {
6930 if (CheckFunctionCall(FDecl, TheCall, Proto))
6931 return ExprError();
6932
6933 checkFortifiedBuiltinMemoryFunction(FDecl, TheCall);
6934
6935 if (BuiltinID)
6936 return CheckBuiltinFunctionCall(FDecl, BuiltinID, TheCall);
6937 } else if (NDecl) {
6938 if (CheckPointerCall(NDecl, TheCall, Proto))
6939 return ExprError();
6940 } else {
6941 if (CheckOtherCall(TheCall, Proto))
6942 return ExprError();
6943 }
6944
6945 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), FDecl);
6946}
6947
6948ExprResult
6949Sema::ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty,
6950 SourceLocation RParenLoc, Expr *InitExpr) {
6951 assert(Ty && "ActOnCompoundLiteral(): missing type")(static_cast<void> (0));
6952 assert(InitExpr && "ActOnCompoundLiteral(): missing expression")(static_cast<void> (0));
6953
6954 TypeSourceInfo *TInfo;
6955 QualType literalType = GetTypeFromParser(Ty, &TInfo);
6956 if (!TInfo)
6957 TInfo = Context.getTrivialTypeSourceInfo(literalType);
6958
6959 return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, InitExpr);
6960}
6961
6962ExprResult
6963Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
6964 SourceLocation RParenLoc, Expr *LiteralExpr) {
6965 QualType literalType = TInfo->getType();
6966
6967 if (literalType->isArrayType()) {
6968 if (RequireCompleteSizedType(
6969 LParenLoc, Context.getBaseElementType(literalType),
6970 diag::err_array_incomplete_or_sizeless_type,
6971 SourceRange(LParenLoc, LiteralExpr->getSourceRange().getEnd())))
6972 return ExprError();
6973 if (literalType->isVariableArrayType()) {
6974 if (!tryToFixVariablyModifiedVarType(TInfo, literalType, LParenLoc,
6975 diag::err_variable_object_no_init)) {
6976 return ExprError();
6977 }
6978 }
6979 } else if (!literalType->isDependentType() &&
6980 RequireCompleteType(LParenLoc, literalType,
6981 diag::err_typecheck_decl_incomplete_type,
6982 SourceRange(LParenLoc, LiteralExpr->getSourceRange().getEnd())))
6983 return ExprError();
6984
6985 InitializedEntity Entity
6986 = InitializedEntity::InitializeCompoundLiteralInit(TInfo);
6987 InitializationKind Kind
6988 = InitializationKind::CreateCStyleCast(LParenLoc,
6989 SourceRange(LParenLoc, RParenLoc),
6990 /*InitList=*/true);
6991 InitializationSequence InitSeq(*this, Entity, Kind, LiteralExpr);
6992 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, LiteralExpr,
6993 &literalType);
6994 if (Result.isInvalid())
6995 return ExprError();
6996 LiteralExpr = Result.get();
6997
6998 bool isFileScope = !CurContext->isFunctionOrMethod();
6999
7000 // In C, compound literals are l-values for some reason.
7001 // For GCC compatibility, in C++, file-scope array compound literals with
7002 // constant initializers are also l-values, and compound literals are
7003 // otherwise prvalues.
7004 //
7005 // (GCC also treats C++ list-initialized file-scope array prvalues with
7006 // constant initializers as l-values, but that's non-conforming, so we don't
7007 // follow it there.)
7008 //
7009 // FIXME: It would be better to handle the lvalue cases as materializing and
7010 // lifetime-extending a temporary object, but our materialized temporaries
7011 // representation only supports lifetime extension from a variable, not "out
7012 // of thin air".
7013 // FIXME: For C++, we might want to instead lifetime-extend only if a pointer
7014 // is bound to the result of applying array-to-pointer decay to the compound
7015 // literal.
7016 // FIXME: GCC supports compound literals of reference type, which should
7017 // obviously have a value kind derived from the kind of reference involved.
7018 ExprValueKind VK =
7019 (getLangOpts().CPlusPlus && !(isFileScope && literalType->isArrayType()))
7020 ? VK_PRValue
7021 : VK_LValue;
7022
7023 if (isFileScope)
7024 if (auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
7025 for (unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
7026 Expr *Init = ILE->getInit(i);
7027 ILE->setInit(i, ConstantExpr::Create(Context, Init));
7028 }
7029
7030 auto *E = new (Context) CompoundLiteralExpr(LParenLoc, TInfo, literalType,
7031 VK, LiteralExpr, isFileScope);
7032 if (isFileScope) {
7033 if (!LiteralExpr->isTypeDependent() &&
7034 !LiteralExpr->isValueDependent() &&
7035 !literalType->isDependentType()) // C99 6.5.2.5p3
7036 if (CheckForConstantInitializer(LiteralExpr, literalType))
7037 return ExprError();
7038 } else if (literalType.getAddressSpace() != LangAS::opencl_private &&
7039 literalType.getAddressSpace() != LangAS::Default) {
7040 // Embedded-C extensions to C99 6.5.2.5:
7041 // "If the compound literal occurs inside the body of a function, the
7042 // type name shall not be qualified by an address-space qualifier."
7043 Diag(LParenLoc, diag::err_compound_literal_with_address_space)
7044 << SourceRange(LParenLoc, LiteralExpr->getSourceRange().getEnd());
7045 return ExprError();
7046 }
7047
7048 if (!isFileScope && !getLangOpts().CPlusPlus) {
7049 // Compound literals that have automatic storage duration are destroyed at
7050 // the end of the scope in C; in C++, they're just temporaries.
7051
7052 // Emit diagnostics if it is or contains a C union type that is non-trivial
7053 // to destruct.
7054 if (E->getType().hasNonTrivialToPrimitiveDestructCUnion())
7055 checkNonTrivialCUnion(E->getType(), E->getExprLoc(),
7056 NTCUC_CompoundLiteral, NTCUK_Destruct);
7057
7058 // Diagnose jumps that enter or exit the lifetime of the compound literal.
7059 if (literalType.isDestructedType()) {
7060 Cleanup.setExprNeedsCleanups(true);
7061 ExprCleanupObjects.push_back(E);
7062 getCurFunction()->setHasBranchProtectedScope();
7063 }
7064 }
7065
7066 if (E->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() ||
7067 E->getType().hasNonTrivialToPrimitiveCopyCUnion())
7068 checkNonTrivialCUnionInInitializer(E->getInitializer(),
7069 E->getInitializer()->getExprLoc());
7070
7071 return MaybeBindToTemporary(E);
7072}
7073
7074ExprResult
7075Sema::ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7076 SourceLocation RBraceLoc) {
7077 // Only produce each kind of designated initialization diagnostic once.
7078 SourceLocation FirstDesignator;
7079 bool DiagnosedArrayDesignator = false;
7080 bool DiagnosedNestedDesignator = false;
7081 bool DiagnosedMixedDesignator = false;
7082
7083 // Check that any designated initializers are syntactically valid in the
7084 // current language mode.
7085 for (unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7086 if (auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {
7087 if (FirstDesignator.isInvalid())
7088 FirstDesignator = DIE->getBeginLoc();
7089
7090 if (!getLangOpts().CPlusPlus)
7091 break;
7092
7093 if (!DiagnosedNestedDesignator && DIE->size() > 1) {
7094 DiagnosedNestedDesignator = true;
7095 Diag(DIE->getBeginLoc(), diag::ext_designated_init_nested)
7096 << DIE->getDesignatorsSourceRange();
7097 }
7098
7099 for (auto &Desig : DIE->designators()) {
7100 if (!Desig.isFieldDesignator() && !DiagnosedArrayDesignator) {
7101 DiagnosedArrayDesignator = true;
7102 Diag(Desig.getBeginLoc(), diag::ext_designated_init_array)
7103 << Desig.getSourceRange();
7104 }
7105 }
7106
7107 if (!DiagnosedMixedDesignator &&
7108 !isa<DesignatedInitExpr>(InitArgList[0])) {
7109 DiagnosedMixedDesignator = true;
7110 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7111 << DIE->getSourceRange();
7112 Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed)
7113 << InitArgList[0]->getSourceRange();
7114 }
7115 } else if (getLangOpts().CPlusPlus && !DiagnosedMixedDesignator &&
7116 isa<DesignatedInitExpr>(InitArgList[0])) {
7117 DiagnosedMixedDesignator = true;
7118 auto *DIE = cast<DesignatedInitExpr>(InitArgList[0]);
7119 Diag(DIE->getBeginLoc(), diag::ext_designated_init_mixed)
7120 << DIE->getSourceRange();
7121 Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed)
7122 << InitArgList[I]->getSourceRange();
7123 }
7124 }
7125
7126 if (FirstDesignator.isValid()) {
7127 // Only diagnose designated initiaization as a C++20 extension if we didn't
7128 // already diagnose use of (non-C++20) C99 designator syntax.
7129 if (getLangOpts().CPlusPlus && !DiagnosedArrayDesignator &&
7130 !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {
7131 Diag(FirstDesignator, getLangOpts().CPlusPlus20
7132 ? diag::warn_cxx17_compat_designated_init
7133 : diag::ext_cxx_designated_init);
7134 } else if (!getLangOpts().CPlusPlus && !getLangOpts().C99) {
7135 Diag(FirstDesignator, diag::ext_designated_init);
7136 }
7137 }
7138
7139 return BuildInitList(LBraceLoc, InitArgList, RBraceLoc);
7140}
7141
7142ExprResult
7143Sema::BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7144 SourceLocation RBraceLoc) {
7145 // Semantic analysis for initializers is done by ActOnDeclarator() and
7146 // CheckInitializer() - it requires knowledge of the object being initialized.
7147
7148 // Immediately handle non-overload placeholders. Overloads can be
7149 // resolved contextually, but everything else here can't.
7150 for (unsigned I = 0, E = InitArgList.size(); I != E; ++I) {
7151 if (InitArgList[I]->getType()->isNonOverloadPlaceholderType()) {
7152 ExprResult result = CheckPlaceholderExpr(InitArgList[I]);
7153
7154 // Ignore failures; dropping the entire initializer list because
7155 // of one failure would be terrible for indexing/etc.
7156 if (result.isInvalid()) continue;
7157
7158 InitArgList[I] = result.get();
7159 }
7160 }
7161
7162 InitListExpr *E = new (Context) InitListExpr(Context, LBraceLoc, InitArgList,
7163 RBraceLoc);
7164 E->setType(Context.VoidTy); // FIXME: just a place holder for now.
7165 return E;
7166}
7167
7168/// Do an explicit extend of the given block pointer if we're in ARC.
7169void Sema::maybeExtendBlockObject(ExprResult &E) {
7170 assert(E.get()->getType()->isBlockPointerType())(static_cast<void> (0));
7171 assert(E.get()->isPRValue())(static_cast<void> (0));
7172
7173 // Only do this in an r-value context.
7174 if (!getLangOpts().ObjCAutoRefCount) return;
7175
7176 E = ImplicitCastExpr::Create(
7177 Context, E.get()->getType(), CK_ARCExtendBlockObject, E.get(),
7178 /*base path*/ nullptr, VK_PRValue, FPOptionsOverride());
7179 Cleanup.setExprNeedsCleanups(true);
7180}
7181
7182/// Prepare a conversion of the given expression to an ObjC object
7183/// pointer type.
7184CastKind Sema::PrepareCastToObjCObjectPointer(ExprResult &E) {
7185 QualType type = E.get()->getType();
7186 if (type->isObjCObjectPointerType()) {
7187 return CK_BitCast;
7188 } else if (type->isBlockPointerType()) {
7189 maybeExtendBlockObject(E);
7190 return CK_BlockPointerToObjCPointerCast;
7191 } else {
7192 assert(type->isPointerType())(static_cast<void> (0));
7193 return CK_CPointerToObjCPointerCast;
7194 }
7195}
7196
7197/// Prepares for a scalar cast, performing all the necessary stages
7198/// except the final cast and returning the kind required.
7199CastKind Sema::PrepareScalarCast(ExprResult &Src, QualType DestTy) {
7200 // Both Src and Dest are scalar types, i.e. arithmetic or pointer.
7201 // Also, callers should have filtered out the invalid cases with
7202 // pointers. Everything else should be possible.
7203
7204 QualType SrcTy = Src.get()->getType();
7205 if (Context.hasSameUnqualifiedType(SrcTy, DestTy))
7206 return CK_NoOp;
7207
7208 switch (Type::ScalarTypeKind SrcKind = SrcTy->getScalarTypeKind()) {
7209 case Type::STK_MemberPointer:
7210 llvm_unreachable("member pointer type in C")__builtin_unreachable();
7211
7212 case Type::STK_CPointer:
7213 case Type::STK_BlockPointer:
7214 case Type::STK_ObjCObjectPointer:
7215 switch (DestTy->getScalarTypeKind()) {
7216 case Type::STK_CPointer: {
7217 LangAS SrcAS = SrcTy->getPointeeType().getAddressSpace();
7218 LangAS DestAS = DestTy->getPointeeType().getAddressSpace();
7219 if (SrcAS != DestAS)
7220 return CK_AddressSpaceConversion;
7221 if (Context.hasCvrSimilarType(SrcTy, DestTy))
7222 return CK_NoOp;
7223 return CK_BitCast;
7224 }
7225 case Type::STK_BlockPointer:
7226 return (SrcKind == Type::STK_BlockPointer
7227 ? CK_BitCast : CK_AnyPointerToBlockPointerCast);
7228 case Type::STK_ObjCObjectPointer:
7229 if (SrcKind == Type::STK_ObjCObjectPointer)
7230 return CK_BitCast;
7231 if (SrcKind == Type::STK_CPointer)
7232 return CK_CPointerToObjCPointerCast;
7233 maybeExtendBlockObject(Src);
7234 return CK_BlockPointerToObjCPointerCast;
7235 case Type::STK_Bool:
7236 return CK_PointerToBoolean;
7237 case Type::STK_Integral:
7238 return CK_PointerToIntegral;
7239 case Type::STK_Floating:
7240 case Type::STK_FloatingComplex:
7241 case Type::STK_IntegralComplex:
7242 case Type::STK_MemberPointer:
7243 case Type::STK_FixedPoint:
7244 llvm_unreachable("illegal cast from pointer")__builtin_unreachable();
7245 }
7246 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7247
7248 case Type::STK_FixedPoint:
7249 switch (DestTy->getScalarTypeKind()) {
7250 case Type::STK_FixedPoint:
7251 return CK_FixedPointCast;
7252 case Type::STK_Bool:
7253 return CK_FixedPointToBoolean;
7254 case Type::STK_Integral:
7255 return CK_FixedPointToIntegral;
7256 case Type::STK_Floating:
7257 return CK_FixedPointToFloating;
7258 case Type::STK_IntegralComplex:
7259 case Type::STK_FloatingComplex:
7260 Diag(Src.get()->getExprLoc(),
7261 diag::err_unimplemented_conversion_with_fixed_point_type)
7262 << DestTy;
7263 return CK_IntegralCast;
7264 case Type::STK_CPointer:
7265 case Type::STK_ObjCObjectPointer:
7266 case Type::STK_BlockPointer:
7267 case Type::STK_MemberPointer:
7268 llvm_unreachable("illegal cast to pointer type")__builtin_unreachable();
7269 }
7270 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7271
7272 case Type::STK_Bool: // casting from bool is like casting from an integer
7273 case Type::STK_Integral:
7274 switch (DestTy->getScalarTypeKind()) {
7275 case Type::STK_CPointer:
7276 case Type::STK_ObjCObjectPointer:
7277 case Type::STK_BlockPointer:
7278 if (Src.get()->isNullPointerConstant(Context,
7279 Expr::NPC_ValueDependentIsNull))
7280 return CK_NullToPointer;
7281 return CK_IntegralToPointer;
7282 case Type::STK_Bool:
7283 return CK_IntegralToBoolean;
7284 case Type::STK_Integral:
7285 return CK_IntegralCast;
7286 case Type::STK_Floating:
7287 return CK_IntegralToFloating;
7288 case Type::STK_IntegralComplex:
7289 Src = ImpCastExprToType(Src.get(),
7290 DestTy->castAs<ComplexType>()->getElementType(),
7291 CK_IntegralCast);
7292 return CK_IntegralRealToComplex;
7293 case Type::STK_FloatingComplex:
7294 Src = ImpCastExprToType(Src.get(),
7295 DestTy->castAs<ComplexType>()->getElementType(),
7296 CK_IntegralToFloating);
7297 return CK_FloatingRealToComplex;
7298 case Type::STK_MemberPointer:
7299 llvm_unreachable("member pointer type in C")__builtin_unreachable();
7300 case Type::STK_FixedPoint:
7301 return CK_IntegralToFixedPoint;
7302 }
7303 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7304
7305 case Type::STK_Floating:
7306 switch (DestTy->getScalarTypeKind()) {
7307 case Type::STK_Floating:
7308 return CK_FloatingCast;
7309 case Type::STK_Bool:
7310 return CK_FloatingToBoolean;
7311 case Type::STK_Integral:
7312 return CK_FloatingToIntegral;
7313 case Type::STK_FloatingComplex:
7314 Src = ImpCastExprToType(Src.get(),
7315 DestTy->castAs<ComplexType>()->getElementType(),
7316 CK_FloatingCast);
7317 return CK_FloatingRealToComplex;
7318 case Type::STK_IntegralComplex:
7319 Src = ImpCastExprToType(Src.get(),
7320 DestTy->castAs<ComplexType>()->getElementType(),
7321 CK_FloatingToIntegral);
7322 return CK_IntegralRealToComplex;
7323 case Type::STK_CPointer:
7324 case Type::STK_ObjCObjectPointer:
7325 case Type::STK_BlockPointer:
7326 llvm_unreachable("valid float->pointer cast?")__builtin_unreachable();
7327 case Type::STK_MemberPointer:
7328 llvm_unreachable("member pointer type in C")__builtin_unreachable();
7329 case Type::STK_FixedPoint:
7330 return CK_FloatingToFixedPoint;
7331 }
7332 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7333
7334 case Type::STK_FloatingComplex:
7335 switch (DestTy->getScalarTypeKind()) {
7336 case Type::STK_FloatingComplex:
7337 return CK_FloatingComplexCast;
7338 case Type::STK_IntegralComplex:
7339 return CK_FloatingComplexToIntegralComplex;
7340 case Type::STK_Floating: {
7341 QualType ET = SrcTy->castAs<ComplexType>()->getElementType();
7342 if (Context.hasSameType(ET, DestTy))
7343 return CK_FloatingComplexToReal;
7344 Src = ImpCastExprToType(Src.get(), ET, CK_FloatingComplexToReal);
7345 return CK_FloatingCast;
7346 }
7347 case Type::STK_Bool:
7348 return CK_FloatingComplexToBoolean;
7349 case Type::STK_Integral:
7350 Src = ImpCastExprToType(Src.get(),
7351 SrcTy->castAs<ComplexType>()->getElementType(),
7352 CK_FloatingComplexToReal);
7353 return CK_FloatingToIntegral;
7354 case Type::STK_CPointer:
7355 case Type::STK_ObjCObjectPointer:
7356 case Type::STK_BlockPointer:
7357 llvm_unreachable("valid complex float->pointer cast?")__builtin_unreachable();
7358 case Type::STK_MemberPointer:
7359 llvm_unreachable("member pointer type in C")__builtin_unreachable();
7360 case Type::STK_FixedPoint:
7361 Diag(Src.get()->getExprLoc(),
7362 diag::err_unimplemented_conversion_with_fixed_point_type)
7363 << SrcTy;
7364 return CK_IntegralCast;
7365 }
7366 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7367
7368 case Type::STK_IntegralComplex:
7369 switch (DestTy->getScalarTypeKind()) {
7370 case Type::STK_FloatingComplex:
7371 return CK_IntegralComplexToFloatingComplex;
7372 case Type::STK_IntegralComplex:
7373 return CK_IntegralComplexCast;
7374 case Type::STK_Integral: {
7375 QualType ET = SrcTy->castAs<ComplexType>()->getElementType();
7376 if (Context.hasSameType(ET, DestTy))
7377 return CK_IntegralComplexToReal;
7378 Src = ImpCastExprToType(Src.get(), ET, CK_IntegralComplexToReal);
7379 return CK_IntegralCast;
7380 }
7381 case Type::STK_Bool:
7382 return CK_IntegralComplexToBoolean;
7383 case Type::STK_Floating:
7384 Src = ImpCastExprToType(Src.get(),
7385 SrcTy->castAs<ComplexType>()->getElementType(),
7386 CK_IntegralComplexToReal);
7387 return CK_IntegralToFloating;
7388 case Type::STK_CPointer:
7389 case Type::STK_ObjCObjectPointer:
7390 case Type::STK_BlockPointer:
7391 llvm_unreachable("valid complex int->pointer cast?")__builtin_unreachable();
7392 case Type::STK_MemberPointer:
7393 llvm_unreachable("member pointer type in C")__builtin_unreachable();
7394 case Type::STK_FixedPoint:
7395 Diag(Src.get()->getExprLoc(),
7396 diag::err_unimplemented_conversion_with_fixed_point_type)
7397 << SrcTy;
7398 return CK_IntegralCast;
7399 }
7400 llvm_unreachable("Should have returned before this")__builtin_unreachable();
7401 }
7402
7403 llvm_unreachable("Unhandled scalar cast")__builtin_unreachable();
7404}
7405
7406static bool breakDownVectorType(QualType type, uint64_t &len,
7407 QualType &eltType) {
7408 // Vectors are simple.
7409 if (const VectorType *vecType = type->getAs<VectorType>()) {
96
Assuming the object is a 'VectorType'
97
Assuming 'vecType' is non-null
98
Taking true branch
103
Assuming the object is a 'VectorType'
104
Assuming 'vecType' is non-null
105
Taking true branch
7410 len = vecType->getNumElements();
7411 eltType = vecType->getElementType();
7412 assert(eltType->isScalarType())(static_cast<void> (0));
7413 return true;
99
Returning the value 1, which participates in a condition later
106
Returning the value 1, which participates in a condition later
7414 }
7415
7416 // We allow lax conversion to and from non-vector types, but only if
7417 // they're real types (i.e. non-complex, non-pointer scalar types).
7418 if (!type->isRealType()) return false;
7419
7420 len = 1;
7421 eltType = type;
7422 return true;
7423}
7424
7425/// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from the
7426/// first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE VLST)
7427/// allowed?
7428///
7429/// This will also return false if the two given types do not make sense from
7430/// the perspective of SVE bitcasts.
7431bool Sema::isValidSveBitcast(QualType srcTy, QualType destTy) {
7432 assert(srcTy->isVectorType() || destTy->isVectorType())(static_cast<void> (0));
7433
7434 auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {
7435 if (!FirstType->isSizelessBuiltinType())
7436 return false;
7437
7438 const auto *VecTy = SecondType->getAs<VectorType>();
7439 return VecTy &&
7440 VecTy->getVectorKind() == VectorType::SveFixedLengthDataVector;
7441 };
7442
7443 return ValidScalableConversion(srcTy, destTy) ||
7444 ValidScalableConversion(destTy, srcTy);
7445}
7446
7447/// Are the two types matrix types and do they have the same dimensions i.e.
7448/// do they have the same number of rows and the same number of columns?
7449bool Sema::areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy) {
7450 if (!destTy->isMatrixType() || !srcTy->isMatrixType())
7451 return false;
7452
7453 const ConstantMatrixType *matSrcType = srcTy->getAs<ConstantMatrixType>();
7454 const ConstantMatrixType *matDestType = destTy->getAs<ConstantMatrixType>();
7455
7456 return matSrcType->getNumRows() == matDestType->getNumRows() &&
7457 matSrcType->getNumColumns() == matDestType->getNumColumns();
7458}
7459
7460bool Sema::areVectorTypesSameSize(QualType SrcTy, QualType DestTy) {
7461 assert(DestTy->isVectorType() || SrcTy->isVectorType())(static_cast<void> (0));
7462
7463 uint64_t SrcLen, DestLen;
7464 QualType SrcEltTy, DestEltTy;
7465 if (!breakDownVectorType(SrcTy, SrcLen, SrcEltTy))
95
Calling 'breakDownVectorType'
100
Returning from 'breakDownVectorType'
101
Taking false branch
7466 return false;
7467 if (!breakDownVectorType(DestTy, DestLen, DestEltTy))
102
Calling 'breakDownVectorType'
107
Returning from 'breakDownVectorType'
108
Taking false branch
7468 return false;
7469
7470 // ASTContext::getTypeSize will return the size rounded up to a
7471 // power of 2, so instead of using that, we need to use the raw
7472 // element size multiplied by the element count.
7473 uint64_t SrcEltSize = Context.getTypeSize(SrcEltTy);
7474 uint64_t DestEltSize = Context.getTypeSize(DestEltTy);
7475
7476 return (SrcLen * SrcEltSize == DestLen * DestEltSize);
109
Assuming the condition is true
110
Returning the value 1, which participates in a condition later
7477}
7478
7479/// Are the two types lax-compatible vector types? That is, given
7480/// that one of them is a vector, do they have equal storage sizes,
7481/// where the storage size is the number of elements times the element
7482/// size?
7483///
7484/// This will also return false if either of the types is neither a
7485/// vector nor a real type.
7486bool Sema::areLaxCompatibleVectorTypes(QualType srcTy, QualType destTy) {
7487 assert(destTy->isVectorType() || srcTy->isVectorType())(static_cast<void> (0));
7488
7489 // Disallow lax conversions between scalars and ExtVectors (these
7490 // conversions are allowed for other vector types because common headers
7491 // depend on them). Most scalar OP ExtVector cases are handled by the
7492 // splat path anyway, which does what we want (convert, not bitcast).
7493 // What this rules out for ExtVectors is crazy things like char4*float.
7494 if (srcTy->isScalarType() && destTy->isExtVectorType()) return false;
92
Assuming the condition is false
7495 if (destTy->isScalarType() && srcTy->isExtVectorType()) return false;
93
Assuming the condition is false
7496
7497 return areVectorTypesSameSize(srcTy, destTy);
94
Calling 'Sema::areVectorTypesSameSize'
111
Returning from 'Sema::areVectorTypesSameSize'
112
Returning the value 1, which participates in a condition later
7498}
7499
7500/// Is this a legal conversion between two types, one of which is
7501/// known to be a vector type?
7502bool Sema::isLaxVectorConversion(QualType srcTy, QualType destTy) {
7503 assert(destTy->isVectorType() || srcTy->isVectorType())(static_cast<void> (0));
7504
7505 switch (Context.getLangOpts().getLaxVectorConversions()) {
89
Control jumps to 'case All:' at line 7523
7506 case LangOptions::LaxVectorConversionKind::None:
7507 return false;
7508
7509 case LangOptions::LaxVectorConversionKind::Integer:
7510 if (!srcTy->isIntegralOrEnumerationType()) {
7511 auto *Vec = srcTy->getAs<VectorType>();
7512 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7513 return false;
7514 }
7515 if (!destTy->isIntegralOrEnumerationType()) {
7516 auto *Vec = destTy->getAs<VectorType>();
7517 if (!Vec || !Vec->getElementType()->isIntegralOrEnumerationType())
7518 return false;
7519 }
7520 // OK, integer (vector) -> integer (vector) bitcast.
7521 break;
7522
7523 case LangOptions::LaxVectorConversionKind::All:
7524 break;
7525 }
7526
7527 return areLaxCompatibleVectorTypes(srcTy, destTy);
90
Execution continues on line 7527
91
Calling 'Sema::areLaxCompatibleVectorTypes'
113
Returning from 'Sema::areLaxCompatibleVectorTypes'
114
Returning the value 1, which participates in a condition later
7528}
7529
7530bool Sema::CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7531 CastKind &Kind) {
7532 if (SrcTy->isMatrixType() && DestTy->isMatrixType()) {
7533 if (!areMatrixTypesOfTheSameDimension(SrcTy, DestTy)) {
7534 return Diag(R.getBegin(), diag::err_invalid_conversion_between_matrixes)
7535 << DestTy << SrcTy << R;
7536 }
7537 } else if (SrcTy->isMatrixType()) {
7538 return Diag(R.getBegin(),
7539 diag::err_invalid_conversion_between_matrix_and_type)
7540 << SrcTy << DestTy << R;
7541 } else if (DestTy->isMatrixType()) {
7542 return Diag(R.getBegin(),
7543 diag::err_invalid_conversion_between_matrix_and_type)
7544 << DestTy << SrcTy << R;
7545 }
7546
7547 Kind = CK_MatrixCast;
7548 return false;
7549}
7550
7551bool Sema::CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7552 CastKind &Kind) {
7553 assert(VectorTy->isVectorType() && "Not a vector type!")(static_cast<void> (0));
7554
7555 if (Ty->isVectorType() || Ty->isIntegralType(Context)) {
7556 if (!areLaxCompatibleVectorTypes(Ty, VectorTy))
7557 return Diag(R.getBegin(),
7558 Ty->isVectorType() ?
7559 diag::err_invalid_conversion_between_vectors :
7560 diag::err_invalid_conversion_between_vector_and_integer)
7561 << VectorTy << Ty << R;
7562 } else
7563 return Diag(R.getBegin(),
7564 diag::err_invalid_conversion_between_vector_and_scalar)
7565 << VectorTy << Ty << R;
7566
7567 Kind = CK_BitCast;
7568 return false;
7569}
7570
7571ExprResult Sema::prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr) {
7572 QualType DestElemTy = VectorTy->castAs<VectorType>()->getElementType();
7573
7574 if (DestElemTy == SplattedExpr->getType())
7575 return SplattedExpr;
7576
7577 assert(DestElemTy->isFloatingType() ||(static_cast<void> (0))
7578 DestElemTy->isIntegralOrEnumerationType())(static_cast<void> (0));
7579
7580 CastKind CK;
7581 if (VectorTy->isExtVectorType() && SplattedExpr->getType()->isBooleanType()) {
7582 // OpenCL requires that we convert `true` boolean expressions to -1, but
7583 // only when splatting vectors.
7584 if (DestElemTy->isFloatingType()) {
7585 // To avoid having to have a CK_BooleanToSignedFloating cast kind, we cast
7586 // in two steps: boolean to signed integral, then to floating.
7587 ExprResult CastExprRes = ImpCastExprToType(SplattedExpr, Context.IntTy,
7588 CK_BooleanToSignedIntegral);
7589 SplattedExpr = CastExprRes.get();
7590 CK = CK_IntegralToFloating;
7591 } else {
7592 CK = CK_BooleanToSignedIntegral;
7593 }
7594 } else {
7595 ExprResult CastExprRes = SplattedExpr;
7596 CK = PrepareScalarCast(CastExprRes, DestElemTy);
7597 if (CastExprRes.isInvalid())
7598 return ExprError();
7599 SplattedExpr = CastExprRes.get();
7600 }
7601 return ImpCastExprToType(SplattedExpr, DestElemTy, CK);
7602}
7603
7604ExprResult Sema::CheckExtVectorCast(SourceRange R, QualType DestTy,
7605 Expr *CastExpr, CastKind &Kind) {
7606 assert(DestTy->isExtVectorType() && "Not an extended vector type!")(static_cast<void> (0));
7607
7608 QualType SrcTy = CastExpr->getType();
7609
7610 // If SrcTy is a VectorType, the total size must match to explicitly cast to
7611 // an ExtVectorType.
7612 // In OpenCL, casts between vectors of different types are not allowed.
7613 // (See OpenCL 6.2).
7614 if (SrcTy->isVectorType()) {
7615 if (!areLaxCompatibleVectorTypes(SrcTy, DestTy) ||
7616 (getLangOpts().OpenCL &&
7617 !Context.hasSameUnqualifiedType(DestTy, SrcTy))) {
7618 Diag(R.getBegin(),diag::err_invalid_conversion_between_ext_vectors)
7619 << DestTy << SrcTy << R;
7620 return ExprError();
7621 }
7622 Kind = CK_BitCast;
7623 return CastExpr;
7624 }
7625
7626 // All non-pointer scalars can be cast to ExtVector type. The appropriate
7627 // conversion will take place first from scalar to elt type, and then
7628 // splat from elt type to vector.
7629 if (SrcTy->isPointerType())
7630 return Diag(R.getBegin(),
7631 diag::err_invalid_conversion_between_vector_and_scalar)
7632 << DestTy << SrcTy << R;
7633
7634 Kind = CK_VectorSplat;
7635 return prepareVectorSplat(DestTy, CastExpr);
7636}
7637
7638ExprResult
7639Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
7640 Declarator &D, ParsedType &Ty,
7641 SourceLocation RParenLoc, Expr *CastExpr) {
7642 assert(!D.isInvalidType() && (CastExpr != nullptr) &&(static_cast<void> (0))
7643 "ActOnCastExpr(): missing type or expr")(static_cast<void> (0));
7644
7645 TypeSourceInfo *castTInfo = GetTypeForDeclaratorCast(D, CastExpr->getType());
7646 if (D.isInvalidType())
7647 return ExprError();
7648
7649 if (getLangOpts().CPlusPlus) {
7650 // Check that there are no default arguments (C++ only).
7651 CheckExtraCXXDefaultArguments(D);
7652 } else {
7653 // Make sure any TypoExprs have been dealt with.
7654 ExprResult Res = CorrectDelayedTyposInExpr(CastExpr);
7655 if (!Res.isUsable())
7656 return ExprError();
7657 CastExpr = Res.get();
7658 }
7659
7660 checkUnusedDeclAttributes(D);
7661
7662 QualType castType = castTInfo->getType();
7663 Ty = CreateParsedType(castType, castTInfo);
7664
7665 bool isVectorLiteral = false;
7666
7667 // Check for an altivec or OpenCL literal,
7668 // i.e. all the elements are integer constants.
7669 ParenExpr *PE = dyn_cast<ParenExpr>(CastExpr);
7670 ParenListExpr *PLE = dyn_cast<ParenListExpr>(CastExpr);
7671 if ((getLangOpts().AltiVec || getLangOpts().ZVector || getLangOpts().OpenCL)
7672 && castType->isVectorType() && (PE || PLE)) {
7673 if (PLE && PLE->getNumExprs() == 0) {
7674 Diag(PLE->getExprLoc(), diag::err_altivec_empty_initializer);
7675 return ExprError();
7676 }
7677 if (PE || PLE->getNumExprs() == 1) {
7678 Expr *E = (PE ? PE->getSubExpr() : PLE->getExpr(0));
7679 if (!E->isTypeDependent() && !E->getType()->isVectorType())
7680 isVectorLiteral = true;
7681 }
7682 else
7683 isVectorLiteral = true;
7684 }
7685
7686 // If this is a vector initializer, '(' type ')' '(' init, ..., init ')'
7687 // then handle it as such.
7688 if (isVectorLiteral)
7689 return BuildVectorLiteral(LParenLoc, RParenLoc, CastExpr, castTInfo);
7690
7691 // If the Expr being casted is a ParenListExpr, handle it specially.
7692 // This is not an AltiVec-style cast, so turn the ParenListExpr into a
7693 // sequence of BinOp comma operators.
7694 if (isa<ParenListExpr>(CastExpr)) {
7695 ExprResult Result = MaybeConvertParenListExprToParenExpr(S, CastExpr);
7696 if (Result.isInvalid()) return ExprError();
7697 CastExpr = Result.get();
7698 }
7699
7700 if (getLangOpts().CPlusPlus && !castType->isVoidType() &&
7701 !getSourceManager().isInSystemMacro(LParenLoc))
7702 Diag(LParenLoc, diag::warn_old_style_cast) << CastExpr->getSourceRange();
7703
7704 CheckTollFreeBridgeCast(castType, CastExpr);
7705
7706 CheckObjCBridgeRelatedCast(castType, CastExpr);
7707
7708 DiscardMisalignedMemberAddress(castType.getTypePtr(), CastExpr);
7709
7710 return BuildCStyleCastExpr(LParenLoc, castTInfo, RParenLoc, CastExpr);
7711}
7712
7713ExprResult Sema::BuildVectorLiteral(SourceLocation LParenLoc,
7714 SourceLocation RParenLoc, Expr *E,
7715 TypeSourceInfo *TInfo) {
7716 assert((isa<ParenListExpr>(E) || isa<ParenExpr>(E)) &&(static_cast<void> (0))
7717 "Expected paren or paren list expression")(static_cast<void> (0));
7718
7719 Expr **exprs;
7720 unsigned numExprs;
7721 Expr *subExpr;
7722 SourceLocation LiteralLParenLoc, LiteralRParenLoc;
7723 if (ParenListExpr *PE = dyn_cast<ParenListExpr>(E)) {
7724 LiteralLParenLoc = PE->getLParenLoc();
7725 LiteralRParenLoc = PE->getRParenLoc();
7726 exprs = PE->getExprs();
7727 numExprs = PE->getNumExprs();
7728 } else { // isa<ParenExpr> by assertion at function entrance
7729 LiteralLParenLoc = cast<ParenExpr>(E)->getLParen();
7730 LiteralRParenLoc = cast<ParenExpr>(E)->getRParen();
7731 subExpr = cast<ParenExpr>(E)->getSubExpr();
7732 exprs = &subExpr;
7733 numExprs = 1;
7734 }
7735
7736 QualType Ty = TInfo->getType();
7737 assert(Ty->isVectorType() && "Expected vector type")(static_cast<void> (0));
7738
7739 SmallVector<Expr *, 8> initExprs;
7740 const VectorType *VTy = Ty->castAs<VectorType>();
7741 unsigned numElems = VTy->getNumElements();
7742
7743 // '(...)' form of vector initialization in AltiVec: the number of
7744 // initializers must be one or must match the size of the vector.
7745 // If a single value is specified in the initializer then it will be
7746 // replicated to all the components of the vector
7747 if (CheckAltivecInitFromScalar(E->getSourceRange(), Ty,
7748 VTy->getElementType()))
7749 return ExprError();
7750 if (ShouldSplatAltivecScalarInCast(VTy)) {
7751 // The number of initializers must be one or must match the size of the
7752 // vector. If a single value is specified in the initializer then it will
7753 // be replicated to all the components of the vector
7754 if (numExprs == 1) {
7755 QualType ElemTy = VTy->getElementType();
7756 ExprResult Literal = DefaultLvalueConversion(exprs[0]);
7757 if (Literal.isInvalid())
7758 return ExprError();
7759 Literal = ImpCastExprToType(Literal.get(), ElemTy,
7760 PrepareScalarCast(Literal, ElemTy));
7761 return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Literal.get());
7762 }
7763 else if (numExprs < numElems) {
7764 Diag(E->getExprLoc(),
7765 diag::err_incorrect_number_of_vector_initializers);
7766 return ExprError();
7767 }
7768 else
7769 initExprs.append(exprs, exprs + numExprs);
7770 }
7771 else {
7772 // For OpenCL, when the number of initializers is a single value,
7773 // it will be replicated to all components of the vector.
7774 if (getLangOpts().OpenCL &&
7775 VTy->getVectorKind() == VectorType::GenericVector &&
7776 numExprs == 1) {
7777 QualType ElemTy = VTy->getElementType();
7778 ExprResult Literal = DefaultLvalueConversion(exprs[0]);
7779 if (Literal.isInvalid())
7780 return ExprError();
7781 Literal = ImpCastExprToType(Literal.get(), ElemTy,
7782 PrepareScalarCast(Literal, ElemTy));
7783 return BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, Literal.get());
7784 }
7785
7786 initExprs.append(exprs, exprs + numExprs);
7787 }
7788 // FIXME: This means that pretty-printing the final AST will produce curly
7789 // braces instead of the original commas.
7790 InitListExpr *initE = new (Context) InitListExpr(Context, LiteralLParenLoc,
7791 initExprs, LiteralRParenLoc);
7792 initE->setType(Ty);
7793 return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, initE);
7794}
7795
7796/// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7797/// the ParenListExpr into a sequence of comma binary operators.
7798ExprResult
7799Sema::MaybeConvertParenListExprToParenExpr(Scope *S, Expr *OrigExpr) {
7800 ParenListExpr *E = dyn_cast<ParenListExpr>(OrigExpr);
7801 if (!E)
7802 return OrigExpr;
7803
7804 ExprResult Result(E->getExpr(0));
7805
7806 for (unsigned i = 1, e = E->getNumExprs(); i != e && !Result.isInvalid(); ++i)
7807 Result = ActOnBinOp(S, E->getExprLoc(), tok::comma, Result.get(),
7808 E->getExpr(i));
7809
7810 if (Result.isInvalid()) return ExprError();
7811
7812 return ActOnParenExpr(E->getLParenLoc(), E->getRParenLoc(), Result.get());
7813}
7814
7815ExprResult Sema::ActOnParenListExpr(SourceLocation L,
7816 SourceLocation R,
7817 MultiExprArg Val) {
7818 return ParenListExpr::Create(Context, L, Val, R);
7819}
7820
7821/// Emit a specialized diagnostic when one expression is a null pointer
7822/// constant and the other is not a pointer. Returns true if a diagnostic is
7823/// emitted.
7824bool Sema::DiagnoseConditionalForNull(Expr *LHSExpr, Expr *RHSExpr,
7825 SourceLocation QuestionLoc) {
7826 Expr *NullExpr = LHSExpr;
7827 Expr *NonPointerExpr = RHSExpr;
7828 Expr::NullPointerConstantKind NullKind =
7829 NullExpr->isNullPointerConstant(Context,
7830 Expr::NPC_ValueDependentIsNotNull);
7831
7832 if (NullKind == Expr::NPCK_NotNull) {
7833 NullExpr = RHSExpr;
7834 NonPointerExpr = LHSExpr;
7835 NullKind =
7836 NullExpr->isNullPointerConstant(Context,
7837 Expr::NPC_ValueDependentIsNotNull);
7838 }
7839
7840 if (NullKind == Expr::NPCK_NotNull)
7841 return false;
7842
7843 if (NullKind == Expr::NPCK_ZeroExpression)
7844 return false;
7845
7846 if (NullKind == Expr::NPCK_ZeroLiteral) {
7847 // In this case, check to make sure that we got here from a "NULL"
7848 // string in the source code.
7849 NullExpr = NullExpr->IgnoreParenImpCasts();
7850 SourceLocation loc = NullExpr->getExprLoc();
7851 if (!findMacroSpelling(loc, "NULL"))
7852 return false;
7853 }
7854
7855 int DiagType = (NullKind == Expr::NPCK_CXX11_nullptr);
7856 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null)
7857 << NonPointerExpr->getType() << DiagType
7858 << NonPointerExpr->getSourceRange();
7859 return true;
7860}
7861
7862/// Return false if the condition expression is valid, true otherwise.
7863static bool checkCondition(Sema &S, Expr *Cond, SourceLocation QuestionLoc) {
7864 QualType CondTy = Cond->getType();
7865
7866 // OpenCL v1.1 s6.3.i says the condition cannot be a floating point type.
7867 if (S.getLangOpts().OpenCL && CondTy->isFloatingType()) {
7868 S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
7869 << CondTy << Cond->getSourceRange();
7870 return true;
7871 }
7872
7873 // C99 6.5.15p2
7874 if (CondTy->isScalarType()) return false;
7875
7876 S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar)
7877 << CondTy << Cond->getSourceRange();
7878 return true;
7879}
7880
7881/// Handle when one or both operands are void type.
7882static QualType checkConditionalVoidType(Sema &S, ExprResult &LHS,
7883 ExprResult &RHS) {
7884 Expr *LHSExpr = LHS.get();
7885 Expr *RHSExpr = RHS.get();
7886
7887 if (!LHSExpr->getType()->isVoidType())
7888 S.Diag(RHSExpr->getBeginLoc(), diag::ext_typecheck_cond_one_void)
7889 << RHSExpr->getSourceRange();
7890 if (!RHSExpr->getType()->isVoidType())
7891 S.Diag(LHSExpr->getBeginLoc(), diag::ext_typecheck_cond_one_void)
7892 << LHSExpr->getSourceRange();
7893 LHS = S.ImpCastExprToType(LHS.get(), S.Context.VoidTy, CK_ToVoid);
7894 RHS = S.ImpCastExprToType(RHS.get(), S.Context.VoidTy, CK_ToVoid);
7895 return S.Context.VoidTy;
7896}
7897
7898/// Return false if the NullExpr can be promoted to PointerTy,
7899/// true otherwise.
7900static bool checkConditionalNullPointer(Sema &S, ExprResult &NullExpr,
7901 QualType PointerTy) {
7902 if ((!PointerTy->isAnyPointerType() && !PointerTy->isBlockPointerType()) ||
7903 !NullExpr.get()->isNullPointerConstant(S.Context,
7904 Expr::NPC_ValueDependentIsNull))
7905 return true;
7906
7907 NullExpr = S.ImpCastExprToType(NullExpr.get(), PointerTy, CK_NullToPointer);
7908 return false;
7909}
7910
7911/// Checks compatibility between two pointers and return the resulting
7912/// type.
7913static QualType checkConditionalPointerCompatibility(Sema &S, ExprResult &LHS,
7914 ExprResult &RHS,
7915 SourceLocation Loc) {
7916 QualType LHSTy = LHS.get()->getType();
7917 QualType RHSTy = RHS.get()->getType();
7918
7919 if (S.Context.hasSameType(LHSTy, RHSTy)) {
7920 // Two identical pointers types are always compatible.
7921 return LHSTy;
7922 }
7923
7924 QualType lhptee, rhptee;
7925
7926 // Get the pointee types.
7927 bool IsBlockPointer = false;
7928 if (const BlockPointerType *LHSBTy = LHSTy->getAs<BlockPointerType>()) {
7929 lhptee = LHSBTy->getPointeeType();
7930 rhptee = RHSTy->castAs<BlockPointerType>()->getPointeeType();
7931 IsBlockPointer = true;
7932 } else {
7933 lhptee = LHSTy->castAs<PointerType>()->getPointeeType();
7934 rhptee = RHSTy->castAs<PointerType>()->getPointeeType();
7935 }
7936
7937 // C99 6.5.15p6: If both operands are pointers to compatible types or to
7938 // differently qualified versions of compatible types, the result type is
7939 // a pointer to an appropriately qualified version of the composite
7940 // type.
7941
7942 // Only CVR-qualifiers exist in the standard, and the differently-qualified
7943 // clause doesn't make sense for our extensions. E.g. address space 2 should
7944 // be incompatible with address space 3: they may live on different devices or
7945 // anything.
7946 Qualifiers lhQual = lhptee.getQualifiers();
7947 Qualifiers rhQual = rhptee.getQualifiers();
7948
7949 LangAS ResultAddrSpace = LangAS::Default;
7950 LangAS LAddrSpace = lhQual.getAddressSpace();
7951 LangAS RAddrSpace = rhQual.getAddressSpace();
7952
7953 // OpenCL v1.1 s6.5 - Conversion between pointers to distinct address
7954 // spaces is disallowed.
7955 if (lhQual.isAddressSpaceSupersetOf(rhQual))
7956 ResultAddrSpace = LAddrSpace;
7957 else if (rhQual.isAddressSpaceSupersetOf(lhQual))
7958 ResultAddrSpace = RAddrSpace;
7959 else {
7960 S.Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
7961 << LHSTy << RHSTy << 2 << LHS.get()->getSourceRange()
7962 << RHS.get()->getSourceRange();
7963 return QualType();
7964 }
7965
7966 unsigned MergedCVRQual = lhQual.getCVRQualifiers() | rhQual.getCVRQualifiers();
7967 auto LHSCastKind = CK_BitCast, RHSCastKind = CK_BitCast;
7968 lhQual.removeCVRQualifiers();
7969 rhQual.removeCVRQualifiers();
7970
7971 // OpenCL v2.0 specification doesn't extend compatibility of type qualifiers
7972 // (C99 6.7.3) for address spaces. We assume that the check should behave in
7973 // the same manner as it's defined for CVR qualifiers, so for OpenCL two
7974 // qual types are compatible iff
7975 // * corresponded types are compatible
7976 // * CVR qualifiers are equal
7977 // * address spaces are equal
7978 // Thus for conditional operator we merge CVR and address space unqualified
7979 // pointees and if there is a composite type we return a pointer to it with
7980 // merged qualifiers.
7981 LHSCastKind =
7982 LAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7983 RHSCastKind =
7984 RAddrSpace == ResultAddrSpace ? CK_BitCast : CK_AddressSpaceConversion;
7985 lhQual.removeAddressSpace();
7986 rhQual.removeAddressSpace();
7987
7988 lhptee = S.Context.getQualifiedType(lhptee.getUnqualifiedType(), lhQual);
7989 rhptee = S.Context.getQualifiedType(rhptee.getUnqualifiedType(), rhQual);
7990
7991 QualType CompositeTy = S.Context.mergeTypes(lhptee, rhptee);
7992
7993 if (CompositeTy.isNull()) {
7994 // In this situation, we assume void* type. No especially good
7995 // reason, but this is what gcc does, and we do have to pick
7996 // to get a consistent AST.
7997 QualType incompatTy;
7998 incompatTy = S.Context.getPointerType(
7999 S.Context.getAddrSpaceQualType(S.Context.VoidTy, ResultAddrSpace));
8000 LHS = S.ImpCastExprToType(LHS.get(), incompatTy, LHSCastKind);
8001 RHS = S.ImpCastExprToType(RHS.get(), incompatTy, RHSCastKind);
8002
8003 // FIXME: For OpenCL the warning emission and cast to void* leaves a room
8004 // for casts between types with incompatible address space qualifiers.
8005 // For the following code the compiler produces casts between global and
8006 // local address spaces of the corresponded innermost pointees:
8007 // local int *global *a;
8008 // global int *global *b;
8009 // a = (0 ? a : b); // see C99 6.5.16.1.p1.
8010 S.Diag(Loc, diag::ext_typecheck_cond_incompatible_pointers)
8011 << LHSTy << RHSTy << LHS.get()->getSourceRange()
8012 << RHS.get()->getSourceRange();
8013
8014 return incompatTy;
8015 }
8016
8017 // The pointer types are compatible.
8018 // In case of OpenCL ResultTy should have the address space qualifier
8019 // which is a superset of address spaces of both the 2nd and the 3rd
8020 // operands of the conditional operator.
8021 QualType ResultTy = [&, ResultAddrSpace]() {
8022 if (S.getLangOpts().OpenCL) {
8023 Qualifiers CompositeQuals = CompositeTy.getQualifiers();
8024 CompositeQuals.setAddressSpace(ResultAddrSpace);
8025 return S.Context
8026 .getQualifiedType(CompositeTy.getUnqualifiedType(), CompositeQuals)
8027 .withCVRQualifiers(MergedCVRQual);
8028 }
8029 return CompositeTy.withCVRQualifiers(MergedCVRQual);
8030 }();
8031 if (IsBlockPointer)
8032 ResultTy = S.Context.getBlockPointerType(ResultTy);
8033 else
8034 ResultTy = S.Context.getPointerType(ResultTy);
8035
8036 LHS = S.ImpCastExprToType(LHS.get(), ResultTy, LHSCastKind);
8037 RHS = S.ImpCastExprToType(RHS.get(), ResultTy, RHSCastKind);
8038 return ResultTy;
8039}
8040
8041/// Return the resulting type when the operands are both block pointers.
8042static QualType checkConditionalBlockPointerCompatibility(Sema &S,
8043 ExprResult &LHS,
8044 ExprResult &RHS,
8045 SourceLocation Loc) {
8046 QualType LHSTy = LHS.get()->getType();
8047 QualType RHSTy = RHS.get()->getType();
8048
8049 if (!LHSTy->isBlockPointerType() || !RHSTy->isBlockPointerType()) {
8050 if (LHSTy->isVoidPointerType() || RHSTy->isVoidPointerType()) {
8051 QualType destType = S.Context.getPointerType(S.Context.VoidTy);
8052 LHS = S.ImpCastExprToType(LHS.get(), destType, CK_BitCast);
8053 RHS = S.ImpCastExprToType(RHS.get(), destType, CK_BitCast);
8054 return destType;
8055 }
8056 S.Diag(Loc, diag::err_typecheck_cond_incompatible_operands)
8057 << LHSTy << RHSTy << LHS.get()->getSourceRange()
8058 << RHS.get()->getSourceRange();
8059 return QualType();
8060 }
8061
8062 // We have 2 block pointer types.
8063 return checkConditionalPointerCompatibility(S, LHS, RHS, Loc);
8064}
8065
8066/// Return the resulting type when the operands are both pointers.
8067static QualType
8068checkConditionalObjectPointersCompatibility(Sema &S, ExprResult &LHS,
8069 ExprResult &RHS,
8070 SourceLocation Loc) {
8071 // get the pointer types
8072 QualType LHSTy = LHS.get()->getType();
8073 QualType RHSTy = RHS.get()->getType();
8074
8075 // get the "pointed to" types
8076 QualType lhptee = LHSTy->castAs<PointerType>()->getPointeeType();
8077 QualType rhptee = RHSTy->castAs<PointerType>()->getPointeeType();
8078
8079 // ignore qualifiers on void (C99 6.5.15p3, clause 6)
8080 if (lhptee->isVoidType() && rhptee->isIncompleteOrObjectType()) {
8081 // Figure out necessary qualifiers (C99 6.5.15p6)
8082 QualType destPointee
8083 = S.Context.getQualifiedType(lhptee, rhptee.getQualifiers());
8084 QualType destType = S.Context.getPointerType(destPointee);
8085 // Add qualifiers if necessary.
8086 LHS = S.ImpCastExprToType(LHS.get(), destType, CK_NoOp);
8087 // Promote to void*.
8088 RHS = S.ImpCastExprToType(RHS.get(), destType, CK_BitCast);
8089 return destType;
8090 }
8091 if (rhptee->isVoidType() && lhptee->isIncompleteOrObjectType()) {
8092 QualType destPointee
8093 = S.Context.getQualifiedType(rhptee, lhptee.getQualifiers());
8094 QualType destType = S.Context.getPointerType(destPointee);
8095 // Add qualifiers if necessary.
8096 RHS = S.ImpCastExprToType(RHS.get(), destType, CK_NoOp);
8097 // Promote to void*.
8098 LHS = S.ImpCastExprToType(LHS.get(), destType, CK_BitCast);
8099 return destType;
8100 }
8101
8102 return checkConditionalPointerCompatibility(S, LHS, RHS, Loc);
8103}
8104
8105/// Return false if the first expression is not an integer and the second
8106/// expression is not a pointer, true otherwise.
8107static bool checkPointerIntegerMismatch(Sema &S, ExprResult &Int,
8108 Expr* PointerExpr, SourceLocation Loc,
8109 bool IsIntFirstExpr) {
8110 if (!PointerExpr->getType()->isPointerType() ||
8111 !Int.get()->getType()->isIntegerType())
8112 return false;
8113
8114 Expr *Expr1 = IsIntFirstExpr ? Int.get() : PointerExpr;
8115 Expr *Expr2 = IsIntFirstExpr ? PointerExpr : Int.get();
8116
8117 S.Diag(Loc, diag::ext_typecheck_cond_pointer_integer_mismatch)
8118 << Expr1->getType() << Expr2->getType()
8119 << Expr1->getSourceRange() << Expr2->getSourceRange();
8120 Int = S.ImpCastExprToType(Int.get(), PointerExpr->getType(),
8121 CK_IntegralToPointer);
8122 return true;
8123}
8124
8125/// Simple conversion between integer and floating point types.
8126///
8127/// Used when handling the OpenCL conditional operator where the
8128/// condition is a vector while the other operands are scalar.
8129///
8130/// OpenCL v1.1 s6.3.i and s6.11.6 together require that the scalar
8131/// types are either integer or floating type. Between the two
8132/// operands, the type with the higher rank is defined as the "result
8133/// type". The other operand needs to be promoted to the same type. No
8134/// other type promotion is allowed. We cannot use
8135/// UsualArithmeticConversions() for this purpose, since it always
8136/// promotes promotable types.
8137static QualType OpenCLArithmeticConversions(Sema &S, ExprResult &LHS,
8138 ExprResult &RHS,
8139 SourceLocation QuestionLoc) {
8140 LHS = S.DefaultFunctionArrayLvalueConversion(LHS.get());
8141 if (LHS.isInvalid())
8142 return QualType();
8143 RHS = S.DefaultFunctionArrayLvalueConversion(RHS.get());
8144 if (RHS.isInvalid())
8145 return QualType();
8146
8147 // For conversion purposes, we ignore any qualifiers.
8148 // For example, "const float" and "float" are equivalent.
8149 QualType LHSType =
8150 S.Context.getCanonicalType(LHS.get()->getType()).getUnqualifiedType();
8151 QualType RHSType =
8152 S.Context.getCanonicalType(RHS.get()->getType()).getUnqualifiedType();
8153
8154 if (!LHSType->isIntegerType() && !LHSType->isRealFloatingType()) {
8155 S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8156 << LHSType << LHS.get()->getSourceRange();
8157 return QualType();
8158 }
8159
8160 if (!RHSType->isIntegerType() && !RHSType->isRealFloatingType()) {
8161 S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float)
8162 << RHSType << RHS.get()->getSourceRange();
8163 return QualType();
8164 }
8165
8166 // If both types are identical, no conversion is needed.
8167 if (LHSType == RHSType)
8168 return LHSType;
8169
8170 // Now handle "real" floating types (i.e. float, double, long double).
8171 if (LHSType->isRealFloatingType() || RHSType->isRealFloatingType())
8172 return handleFloatConversion(S, LHS, RHS, LHSType, RHSType,
8173 /*IsCompAssign = */ false);
8174
8175 // Finally, we have two differing integer types.
8176 return handleIntegerConversion<doIntegralCast, doIntegralCast>
8177 (S, LHS, RHS, LHSType, RHSType, /*IsCompAssign = */ false);
8178}
8179
8180/// Convert scalar operands to a vector that matches the
8181/// condition in length.
8182///
8183/// Used when handling the OpenCL conditional operator where the
8184/// condition is a vector while the other operands are scalar.
8185///
8186/// We first compute the "result type" for the scalar operands
8187/// according to OpenCL v1.1 s6.3.i. Both operands are then converted
8188/// into a vector of that type where the length matches the condition
8189/// vector type. s6.11.6 requires that the element types of the result
8190/// and the condition must have the same number of bits.
8191static QualType
8192OpenCLConvertScalarsToVectors(Sema &S, ExprResult &LHS, ExprResult &RHS,
8193 QualType CondTy, SourceLocation QuestionLoc) {
8194 QualType ResTy = OpenCLArithmeticConversions(S, LHS, RHS, QuestionLoc);
8195 if (ResTy.isNull()) return QualType();
8196
8197 const VectorType *CV = CondTy->getAs<VectorType>();
8198 assert(CV)(static_cast<void> (0));
8199
8200 // Determine the vector result type
8201 unsigned NumElements = CV->getNumElements();
8202 QualType VectorTy = S.Context.getExtVectorType(ResTy, NumElements);
8203
8204 // Ensure that all types have the same number of bits
8205 if (S.Context.getTypeSize(CV->getElementType())
8206 != S.Context.getTypeSize(ResTy)) {
8207 // Since VectorTy is created internally, it does not pretty print
8208 // with an OpenCL name. Instead, we just print a description.
8209 std::string EleTyName = ResTy.getUnqualifiedType().getAsString();
8210 SmallString<64> Str;
8211 llvm::raw_svector_ostream OS(Str);
8212 OS << "(vector of " << NumElements << " '" << EleTyName << "' values)";
8213 S.Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8214 << CondTy << OS.str();
8215 return QualType();
8216 }
8217
8218 // Convert operands to the vector result type
8219 LHS = S.ImpCastExprToType(LHS.get(), VectorTy, CK_VectorSplat);
8220 RHS = S.ImpCastExprToType(RHS.get(), VectorTy, CK_VectorSplat);
8221
8222 return VectorTy;
8223}
8224
8225/// Return false if this is a valid OpenCL condition vector
8226static bool checkOpenCLConditionVector(Sema &S, Expr *Cond,
8227 SourceLocation QuestionLoc) {
8228 // OpenCL v1.1 s6.11.6 says the elements of the vector must be of
8229 // integral type.
8230 const VectorType *CondTy = Cond->getType()->getAs<VectorType>();
8231 assert(CondTy)(static_cast<void> (0));
8232 QualType EleTy = CondTy->getElementType();
8233 if (EleTy->isIntegerType()) return false;
8234
8235 S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat)
8236 << Cond->getType() << Cond->getSourceRange();
8237 return true;
8238}
8239
8240/// Return false if the vector condition type and the vector
8241/// result type are compatible.
8242///
8243/// OpenCL v1.1 s6.11.6 requires that both vector types have the same
8244/// number of elements, and their element types have the same number
8245/// of bits.
8246static bool checkVectorResult(Sema &S, QualType CondTy, QualType VecResTy,
8247 SourceLocation QuestionLoc) {
8248 const VectorType *CV = CondTy->getAs<VectorType>();
8249 const VectorType *RV = VecResTy->getAs<VectorType>();
8250 assert(CV && RV)(static_cast<void> (0));
8251
8252 if (CV->getNumElements() != RV->getNumElements()) {
8253 S.Diag(QuestionLoc, diag::err_conditional_vector_size)
8254 << CondTy << VecResTy;
8255 return true;
8256 }
8257
8258 QualType CVE = CV->getElementType();
8259 QualType RVE = RV->getElementType();
8260
8261 if (S.Context.getTypeSize(CVE) != S.Context.getTypeSize(RVE)) {
8262 S.Diag(QuestionLoc, diag::err_conditional_vector_element_size)
8263 << CondTy << VecResTy;
8264 return true;
8265 }
8266
8267 return false;
8268}
8269
8270/// Return the resulting type for the conditional operator in
8271/// OpenCL (aka "ternary selection operator", OpenCL v1.1
8272/// s6.3.i) when the condition is a vector type.
8273static QualType
8274OpenCLCheckVectorConditional(Sema &S, ExprResult &Cond,
8275 ExprResult &LHS, ExprResult &RHS,
8276 SourceLocation QuestionLoc) {
8277 Cond = S.DefaultFunctionArrayLvalueConversion(Cond.get());
8278 if (Cond.isInvalid())
8279 return QualType();
8280 QualType CondTy = Cond.get()->getType();
8281
8282 if (checkOpenCLConditionVector(S, Cond.get(), QuestionLoc))
8283 return QualType();
8284
8285 // If either operand is a vector then find the vector type of the
8286 // result as specified in OpenCL v1.1 s6.3.i.
8287 if (LHS.get()->getType()->isVectorType() ||
8288 RHS.get()->getType()->isVectorType()) {
8289 QualType VecResTy = S.CheckVectorOperands(LHS, RHS, QuestionLoc,
8290 /*isCompAssign*/false,
8291 /*AllowBothBool*/true,
8292 /*AllowBoolConversions*/false);
8293 if (VecResTy.isNull()) return QualType();
8294 // The result type must match the condition type as specified in
8295 // OpenCL v1.1 s6.11.6.
8296 if (checkVectorResult(S, CondTy, VecResTy, QuestionLoc))
8297 return QualType();
8298 return VecResTy;
8299 }
8300
8301 // Both operands are scalar.
8302 return OpenCLConvertScalarsToVectors(S, LHS, RHS, CondTy, QuestionLoc);
8303}
8304
8305/// Return true if the Expr is block type
8306static bool checkBlockType(Sema &S, const Expr *E) {
8307 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
8308 QualType Ty = CE->getCallee()->getType();
8309 if (Ty->isBlockPointerType()) {
8310 S.Diag(E->getExprLoc(), diag::err_opencl_ternary_with_block);
8311 return true;
8312 }
8313 }
8314 return false;
8315}
8316
8317/// Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
8318/// In that case, LHS = cond.
8319/// C99 6.5.15
8320QualType Sema::CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS,
8321 ExprResult &RHS, ExprValueKind &VK,
8322 ExprObjectKind &OK,
8323 SourceLocation QuestionLoc) {
8324
8325 ExprResult LHSResult = CheckPlaceholderExpr(LHS.get());
8326 if (!LHSResult.isUsable()) return QualType();
8327 LHS = LHSResult;
8328
8329 ExprResult RHSResult = CheckPlaceholderExpr(RHS.get());
8330 if (!RHSResult.isUsable()) return QualType();
8331 RHS = RHSResult;
8332
8333 // C++ is sufficiently different to merit its own checker.
8334 if (getLangOpts().CPlusPlus)
8335 return CXXCheckConditionalOperands(Cond, LHS, RHS, VK, OK, QuestionLoc);
8336
8337 VK = VK_PRValue;
8338 OK = OK_Ordinary;
8339
8340 if (Context.isDependenceAllowed() &&
8341 (Cond.get()->isTypeDependent() || LHS.get()->isTypeDependent() ||
8342 RHS.get()->isTypeDependent())) {
8343 assert(!getLangOpts().CPlusPlus)(static_cast<void> (0));
8344 assert((Cond.get()->containsErrors() || LHS.get()->containsErrors() ||(static_cast<void> (0))
8345 RHS.get()->containsErrors()) &&(static_cast<void> (0))
8346 "should only occur in error-recovery path.")(static_cast<void> (0));
8347 return Context.DependentTy;
8348 }
8349
8350 // The OpenCL operator with a vector condition is sufficiently
8351 // different to merit its own checker.
8352 if ((getLangOpts().OpenCL && Cond.get()->getType()->isVectorType()) ||
8353 Cond.get()->getType()->isExtVectorType())
8354 return OpenCLCheckVectorConditional(*this, Cond, LHS, RHS, QuestionLoc);
8355
8356 // First, check the condition.
8357 Cond = UsualUnaryConversions(Cond.get());
8358 if (Cond.isInvalid())
8359 return QualType();
8360 if (checkCondition(*this, Cond.get(), QuestionLoc))
8361 return QualType();
8362
8363 // Now check the two expressions.
8364 if (LHS.get()->getType()->isVectorType() ||
8365 RHS.get()->getType()->isVectorType())
8366 return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false,
8367 /*AllowBothBool*/true,
8368 /*AllowBoolConversions*/false);
8369
8370 QualType ResTy =
8371 UsualArithmeticConversions(LHS, RHS, QuestionLoc, ACK_Conditional);
8372 if (LHS.isInvalid() || RHS.isInvalid())
8373 return QualType();
8374
8375 QualType LHSTy = LHS.get()->getType();
8376 QualType RHSTy = RHS.get()->getType();
8377
8378 // Diagnose attempts to convert between __float128 and long double where
8379 // such conversions currently can't be handled.
8380 if (unsupportedTypeConversion(*this, LHSTy, RHSTy)) {
8381 Diag(QuestionLoc,
8382 diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy
8383 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
8384 return QualType();
8385 }
8386
8387 // OpenCL v2.0 s6.12.5 - Blocks cannot be used as expressions of the ternary
8388 // selection operator (?:).
8389 if (getLangOpts().OpenCL &&
8390 (checkBlockType(*this, LHS.get()) | checkBlockType(*this, RHS.get()))) {
8391 return QualType();
8392 }
8393
8394 // If both operands have arithmetic type, do the usual arithmetic conversions
8395 // to find a common type: C99 6.5.15p3,5.
8396 if (LHSTy->isArithmeticType() && RHSTy->isArithmeticType()) {
8397 // Disallow invalid arithmetic conversions, such as those between ExtInts of
8398 // different sizes, or between ExtInts and other types.
8399 if (ResTy.isNull() && (LHSTy->isExtIntType() || RHSTy->isExtIntType())) {
8400 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8401 << LHSTy << RHSTy << LHS.get()->getSourceRange()
8402 << RHS.get()->getSourceRange();
8403 return QualType();
8404 }
8405
8406 LHS = ImpCastExprToType(LHS.get(), ResTy, PrepareScalarCast(LHS, ResTy));
8407 RHS = ImpCastExprToType(RHS.get(), ResTy, PrepareScalarCast(RHS, ResTy));
8408
8409 return ResTy;
8410 }
8411
8412 // And if they're both bfloat (which isn't arithmetic), that's fine too.
8413 if (LHSTy->isBFloat16Type() && RHSTy->isBFloat16Type()) {
8414 return LHSTy;
8415 }
8416
8417 // If both operands are the same structure or union type, the result is that
8418 // type.
8419 if (const RecordType *LHSRT = LHSTy->getAs<RecordType>()) { // C99 6.5.15p3
8420 if (const RecordType *RHSRT = RHSTy->getAs<RecordType>())
8421 if (LHSRT->getDecl() == RHSRT->getDecl())
8422 // "If both the operands have structure or union type, the result has
8423 // that type." This implies that CV qualifiers are dropped.
8424 return LHSTy.getUnqualifiedType();
8425 // FIXME: Type of conditional expression must be complete in C mode.
8426 }
8427
8428 // C99 6.5.15p5: "If both operands have void type, the result has void type."
8429 // The following || allows only one side to be void (a GCC-ism).
8430 if (LHSTy->isVoidType() || RHSTy->isVoidType()) {
8431 return checkConditionalVoidType(*this, LHS, RHS);
8432 }
8433
8434 // C99 6.5.15p6 - "if one operand is a null pointer constant, the result has
8435 // the type of the other operand."
8436 if (!checkConditionalNullPointer(*this, RHS, LHSTy)) return LHSTy;
8437 if (!checkConditionalNullPointer(*this, LHS, RHSTy)) return RHSTy;
8438
8439 // All objective-c pointer type analysis is done here.
8440 QualType compositeType = FindCompositeObjCPointerType(LHS, RHS,
8441 QuestionLoc);
8442 if (LHS.isInvalid() || RHS.isInvalid())
8443 return QualType();
8444 if (!compositeType.isNull())
8445 return compositeType;
8446
8447
8448 // Handle block pointer types.
8449 if (LHSTy->isBlockPointerType() || RHSTy->isBlockPointerType())
8450 return checkConditionalBlockPointerCompatibility(*this, LHS, RHS,
8451 QuestionLoc);
8452
8453 // Check constraints for C object pointers types (C99 6.5.15p3,6).
8454 if (LHSTy->isPointerType() && RHSTy->isPointerType())
8455 return checkConditionalObjectPointersCompatibility(*this, LHS, RHS,
8456 QuestionLoc);
8457
8458 // GCC compatibility: soften pointer/integer mismatch. Note that
8459 // null pointers have been filtered out by this point.
8460 if (checkPointerIntegerMismatch(*this, LHS, RHS.get(), QuestionLoc,
8461 /*IsIntFirstExpr=*/true))
8462 return RHSTy;
8463 if (checkPointerIntegerMismatch(*this, RHS, LHS.get(), QuestionLoc,
8464 /*IsIntFirstExpr=*/false))
8465 return LHSTy;
8466
8467 // Allow ?: operations in which both operands have the same
8468 // built-in sizeless type.
8469 if (LHSTy->isSizelessBuiltinType() && Context.hasSameType(LHSTy, RHSTy))
8470 return LHSTy;
8471
8472 // Emit a better diagnostic if one of the expressions is a null pointer
8473 // constant and the other is not a pointer type. In this case, the user most
8474 // likely forgot to take the address of the other expression.
8475 if (DiagnoseConditionalForNull(LHS.get(), RHS.get(), QuestionLoc))
8476 return QualType();
8477
8478 // Otherwise, the operands are not compatible.
8479 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
8480 << LHSTy << RHSTy << LHS.get()->getSourceRange()
8481 << RHS.get()->getSourceRange();
8482 return QualType();
8483}
8484
8485/// FindCompositeObjCPointerType - Helper method to find composite type of
8486/// two objective-c pointer types of the two input expressions.
8487QualType Sema::FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS,
8488 SourceLocation QuestionLoc) {
8489 QualType LHSTy = LHS.get()->getType();
8490 QualType RHSTy = RHS.get()->getType();
8491
8492 // Handle things like Class and struct objc_class*. Here we case the result
8493 // to the pseudo-builtin, because that will be implicitly cast back to the
8494 // redefinition type if an attempt is made to access its fields.
8495 if (LHSTy->isObjCClassType() &&
8496 (Context.hasSameType(RHSTy, Context.getObjCClassRedefinitionType()))) {
8497 RHS = ImpCastExprToType(RHS.get(), LHSTy, CK_CPointerToObjCPointerCast);
8498 return LHSTy;
8499 }
8500 if (RHSTy->isObjCClassType() &&
8501 (Context.hasSameType(LHSTy, Context.getObjCClassRedefinitionType()))) {
8502 LHS = ImpCastExprToType(LHS.get(), RHSTy, CK_CPointerToObjCPointerCast);
8503 return RHSTy;
8504 }
8505 // And the same for struct objc_object* / id
8506 if (LHSTy->isObjCIdType() &&
8507 (Context.hasSameType(RHSTy, Context.getObjCIdRedefinitionType()))) {
8508 RHS = ImpCastExprToType(RHS.get(), LHSTy, CK_CPointerToObjCPointerCast);
8509 return LHSTy;
8510 }
8511 if (RHSTy->isObjCIdType() &&
8512 (Context.hasSameType(LHSTy, Context.getObjCIdRedefinitionType()))) {
8513 LHS = ImpCastExprToType(LHS.get(), RHSTy, CK_CPointerToObjCPointerCast);
8514 return RHSTy;
8515 }
8516 // And the same for struct objc_selector* / SEL
8517 if (Context.isObjCSelType(LHSTy) &&
8518 (Context.hasSameType(RHSTy, Context.getObjCSelRedefinitionType()))) {
8519 RHS = ImpCastExprToType(RHS.get(), LHSTy, CK_BitCast);
8520 return LHSTy;
8521 }
8522 if (Context.isObjCSelType(RHSTy) &&
8523 (Context.hasSameType(LHSTy, Context.getObjCSelRedefinitionType()))) {
8524 LHS = ImpCastExprToType(LHS.get(), RHSTy, CK_BitCast);
8525 return RHSTy;
8526 }
8527 // Check constraints for Objective-C object pointers types.
8528 if (LHSTy->isObjCObjectPointerType() && RHSTy->isObjCObjectPointerType()) {
8529
8530 if (Context.getCanonicalType(LHSTy) == Context.getCanonicalType(RHSTy)) {
8531 // Two identical object pointer types are always compatible.
8532 return LHSTy;
8533 }
8534 const ObjCObjectPointerType *LHSOPT = LHSTy->castAs<ObjCObjectPointerType>();
8535 const ObjCObjectPointerType *RHSOPT = RHSTy->castAs<ObjCObjectPointerType>();
8536 QualType compositeType = LHSTy;
8537
8538 // If both operands are interfaces and either operand can be
8539 // assigned to the other, use that type as the composite
8540 // type. This allows
8541 // xxx ? (A*) a : (B*) b
8542 // where B is a subclass of A.
8543 //
8544 // Additionally, as for assignment, if either type is 'id'
8545 // allow silent coercion. Finally, if the types are
8546 // incompatible then make sure to use 'id' as the composite
8547 // type so the result is acceptable for sending messages to.
8548
8549 // FIXME: Consider unifying with 'areComparableObjCPointerTypes'.
8550 // It could return the composite type.
8551 if (!(compositeType =
8552 Context.areCommonBaseCompatible(LHSOPT, RHSOPT)).isNull()) {
8553 // Nothing more to do.
8554 } else if (Context.canAssignObjCInterfaces(LHSOPT, RHSOPT)) {
8555 compositeType = RHSOPT->isObjCBuiltinType() ? RHSTy : LHSTy;
8556 } else if (Context.canAssignObjCInterfaces(RHSOPT, LHSOPT)) {
8557 compositeType = LHSOPT->isObjCBuiltinType() ? LHSTy : RHSTy;
8558 } else if ((LHSOPT->isObjCQualifiedIdType() ||
8559 RHSOPT->isObjCQualifiedIdType()) &&
8560 Context.ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT,
8561 true)) {
8562 // Need to handle "id<xx>" explicitly.
8563 // GCC allows qualified id and any Objective-C type to devolve to
8564 // id. Currently localizing to here until clear this should be
8565 // part of ObjCQualifiedIdTypesAreCompatible.
8566 compositeType = Context.getObjCIdType();
8567 } else if (LHSTy->isObjCIdType() || RHSTy->isObjCIdType()) {
8568 compositeType = Context.getObjCIdType();
8569 } else {
8570 Diag(QuestionLoc, diag::ext_typecheck_cond_incompatible_operands)
8571 << LHSTy << RHSTy
8572 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
8573 QualType incompatTy = Context.getObjCIdType();
8574 LHS = ImpCastExprToType(LHS.get(), incompatTy, CK_BitCast);
8575 RHS = ImpCastExprToType(RHS.get(), incompatTy, CK_BitCast);
8576 return incompatTy;
8577 }
8578 // The object pointer types are compatible.
8579 LHS = ImpCastExprToType(LHS.get(), compositeType, CK_BitCast);
8580 RHS = ImpCastExprToType(RHS.get(), compositeType, CK_BitCast);
8581 return compositeType;
8582 }
8583 // Check Objective-C object pointer types and 'void *'
8584 if (LHSTy->isVoidPointerType() && RHSTy->isObjCObjectPointerType()) {
8585 if (getLangOpts().ObjCAutoRefCount) {
8586 // ARC forbids the implicit conversion of object pointers to 'void *',
8587 // so these types are not compatible.
8588 Diag(QuestionLoc, diag::err_cond_voidptr_arc) << LHSTy << RHSTy
8589 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
8590 LHS = RHS = true;
8591 return QualType();
8592 }
8593 QualType lhptee = LHSTy->castAs<PointerType>()->getPointeeType();
8594 QualType rhptee = RHSTy->castAs<ObjCObjectPointerType>()->getPointeeType();
8595 QualType destPointee
8596 = Context.getQualifiedType(lhptee, rhptee.getQualifiers());
8597 QualType destType = Context.getPointerType(destPointee);
8598 // Add qualifiers if necessary.
8599 LHS = ImpCastExprToType(LHS.get(), destType, CK_NoOp);
8600 // Promote to void*.
8601 RHS = ImpCastExprToType(RHS.get(), destType, CK_BitCast);
8602 return destType;
8603 }
8604 if (LHSTy->isObjCObjectPointerType() && RHSTy->isVoidPointerType()) {
8605 if (getLangOpts().ObjCAutoRefCount) {
8606 // ARC forbids the implicit conversion of object pointers to 'void *',
8607 // so these types are not compatible.
8608 Diag(QuestionLoc, diag::err_cond_voidptr_arc) << LHSTy << RHSTy
8609 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
8610 LHS = RHS = true;
8611 return QualType();
8612 }
8613 QualType lhptee = LHSTy->castAs<ObjCObjectPointerType>()->getPointeeType();
8614 QualType rhptee = RHSTy->castAs<PointerType>()->getPointeeType();
8615 QualType destPointee
8616 = Context.getQualifiedType(rhptee, lhptee.getQualifiers());
8617 QualType destType = Context.getPointerType(destPointee);
8618 // Add qualifiers if necessary.
8619 RHS = ImpCastExprToType(RHS.get(), destType, CK_NoOp);
8620 // Promote to void*.
8621 LHS = ImpCastExprToType(LHS.get(), destType, CK_BitCast);
8622 return destType;
8623 }
8624 return QualType();
8625}
8626
8627/// SuggestParentheses - Emit a note with a fixit hint that wraps
8628/// ParenRange in parentheses.
8629static void SuggestParentheses(Sema &Self, SourceLocation Loc,
8630 const PartialDiagnostic &Note,
8631 SourceRange ParenRange) {
8632 SourceLocation EndLoc = Self.getLocForEndOfToken(ParenRange.getEnd());
8633 if (ParenRange.getBegin().isFileID() && ParenRange.getEnd().isFileID() &&
8634 EndLoc.isValid()) {
8635 Self.Diag(Loc, Note)
8636 << FixItHint::CreateInsertion(ParenRange.getBegin(), "(")
8637 << FixItHint::CreateInsertion(EndLoc, ")");
8638 } else {
8639 // We can't display the parentheses, so just show the bare note.
8640 Self.Diag(Loc, Note) << ParenRange;
8641 }
8642}
8643
8644static bool IsArithmeticOp(BinaryOperatorKind Opc) {
8645 return BinaryOperator::isAdditiveOp(Opc) ||
8646 BinaryOperator::isMultiplicativeOp(Opc) ||
8647 BinaryOperator::isShiftOp(Opc) || Opc == BO_And || Opc == BO_Or;
8648 // This only checks for bitwise-or and bitwise-and, but not bitwise-xor and
8649 // not any of the logical operators. Bitwise-xor is commonly used as a
8650 // logical-xor because there is no logical-xor operator. The logical
8651 // operators, including uses of xor, have a high false positive rate for
8652 // precedence warnings.
8653}
8654
8655/// IsArithmeticBinaryExpr - Returns true if E is an arithmetic binary
8656/// expression, either using a built-in or overloaded operator,
8657/// and sets *OpCode to the opcode and *RHSExprs to the right-hand side
8658/// expression.
8659static bool IsArithmeticBinaryExpr(Expr *E, BinaryOperatorKind *Opcode,
8660 Expr **RHSExprs) {
8661 // Don't strip parenthesis: we should not warn if E is in parenthesis.
8662 E = E->IgnoreImpCasts();
8663 E = E->IgnoreConversionOperatorSingleStep();
8664 E = E->IgnoreImpCasts();
8665 if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
8666 E = MTE->getSubExpr();
8667 E = E->IgnoreImpCasts();
8668 }
8669
8670 // Built-in binary operator.
8671 if (BinaryOperator *OP = dyn_cast<BinaryOperator>(E)) {
8672 if (IsArithmeticOp(OP->getOpcode())) {
8673 *Opcode = OP->getOpcode();
8674 *RHSExprs = OP->getRHS();
8675 return true;
8676 }
8677 }
8678
8679 // Overloaded operator.
8680 if (CXXOperatorCallExpr *Call = dyn_cast<CXXOperatorCallExpr>(E)) {
8681 if (Call->getNumArgs() != 2)
8682 return false;
8683
8684 // Make sure this is really a binary operator that is safe to pass into
8685 // BinaryOperator::getOverloadedOpcode(), e.g. it's not a subscript op.
8686 OverloadedOperatorKind OO = Call->getOperator();
8687 if (OO < OO_Plus || OO > OO_Arrow ||
8688 OO == OO_PlusPlus || OO == OO_MinusMinus)
8689 return false;
8690
8691 BinaryOperatorKind OpKind = BinaryOperator::getOverloadedOpcode(OO);
8692 if (IsArithmeticOp(OpKind)) {
8693 *Opcode = OpKind;
8694 *RHSExprs = Call->getArg(1);
8695 return true;
8696 }
8697 }
8698
8699 return false;
8700}
8701
8702/// ExprLooksBoolean - Returns true if E looks boolean, i.e. it has boolean type
8703/// or is a logical expression such as (x==y) which has int type, but is
8704/// commonly interpreted as boolean.
8705static bool ExprLooksBoolean(Expr *E) {
8706 E = E->IgnoreParenImpCasts();
8707
8708 if (E->getType()->isBooleanType())
8709 return true;
8710 if (BinaryOperator *OP = dyn_cast<BinaryOperator>(E))
8711 return OP->isComparisonOp() || OP->isLogicalOp();
8712 if (UnaryOperator *OP = dyn_cast<UnaryOperator>(E))
8713 return OP->getOpcode() == UO_LNot;
8714 if (E->getType()->isPointerType())
8715 return true;
8716 // FIXME: What about overloaded operator calls returning "unspecified boolean
8717 // type"s (commonly pointer-to-members)?
8718
8719 return false;
8720}
8721
8722/// DiagnoseConditionalPrecedence - Emit a warning when a conditional operator
8723/// and binary operator are mixed in a way that suggests the programmer assumed
8724/// the conditional operator has higher precedence, for example:
8725/// "int x = a + someBinaryCondition ? 1 : 2".
8726static void DiagnoseConditionalPrecedence(Sema &Self,
8727 SourceLocation OpLoc,
8728 Expr *Condition,
8729 Expr *LHSExpr,
8730 Expr *RHSExpr) {
8731 BinaryOperatorKind CondOpcode;
8732 Expr *CondRHS;
8733
8734 if (!IsArithmeticBinaryExpr(Condition, &CondOpcode, &CondRHS))
8735 return;
8736 if (!ExprLooksBoolean(CondRHS))
8737 return;
8738
8739 // The condition is an arithmetic binary expression, with a right-
8740 // hand side that looks boolean, so warn.
8741
8742 unsigned DiagID = BinaryOperator::isBitwiseOp(CondOpcode)
8743 ? diag::warn_precedence_bitwise_conditional
8744 : diag::warn_precedence_conditional;
8745
8746 Self.Diag(OpLoc, DiagID)
8747 << Condition->getSourceRange()
8748 << BinaryOperator::getOpcodeStr(CondOpcode);
8749
8750 SuggestParentheses(
8751 Self, OpLoc,
8752 Self.PDiag(diag::note_precedence_silence)
8753 << BinaryOperator::getOpcodeStr(CondOpcode),
8754 SourceRange(Condition->getBeginLoc(), Condition->getEndLoc()));
8755
8756 SuggestParentheses(Self, OpLoc,
8757 Self.PDiag(diag::note_precedence_conditional_first),
8758 SourceRange(CondRHS->getBeginLoc(), RHSExpr->getEndLoc()));
8759}
8760
8761/// Compute the nullability of a conditional expression.
8762static QualType computeConditionalNullability(QualType ResTy, bool IsBin,
8763 QualType LHSTy, QualType RHSTy,
8764 ASTContext &Ctx) {
8765 if (!ResTy->isAnyPointerType())
8766 return ResTy;
8767
8768 auto GetNullability = [&Ctx](QualType Ty) {
8769 Optional<NullabilityKind> Kind = Ty->getNullability(Ctx);
8770 if (Kind) {
8771 // For our purposes, treat _Nullable_result as _Nullable.
8772 if (*Kind == NullabilityKind::NullableResult)
8773 return NullabilityKind::Nullable;
8774 return *Kind;
8775 }
8776 return NullabilityKind::Unspecified;
8777 };
8778
8779 auto LHSKind = GetNullability(LHSTy), RHSKind = GetNullability(RHSTy);
8780 NullabilityKind MergedKind;
8781
8782 // Compute nullability of a binary conditional expression.
8783 if (IsBin) {
8784 if (LHSKind == NullabilityKind::NonNull)
8785 MergedKind = NullabilityKind::NonNull;
8786 else
8787 MergedKind = RHSKind;
8788 // Compute nullability of a normal conditional expression.
8789 } else {
8790 if (LHSKind == NullabilityKind::Nullable ||
8791 RHSKind == NullabilityKind::Nullable)
8792 MergedKind = NullabilityKind::Nullable;
8793 else if (LHSKind == NullabilityKind::NonNull)
8794 MergedKind = RHSKind;
8795 else if (RHSKind == NullabilityKind::NonNull)
8796 MergedKind = LHSKind;
8797 else
8798 MergedKind = NullabilityKind::Unspecified;
8799 }
8800
8801 // Return if ResTy already has the correct nullability.
8802 if (GetNullability(ResTy) == MergedKind)
8803 return ResTy;
8804
8805 // Strip all nullability from ResTy.
8806 while (ResTy->getNullability(Ctx))
8807 ResTy = ResTy.getSingleStepDesugaredType(Ctx);
8808
8809 // Create a new AttributedType with the new nullability kind.
8810 auto NewAttr = AttributedType::getNullabilityAttrKind(MergedKind);
8811 return Ctx.getAttributedType(NewAttr, ResTy, ResTy);
8812}
8813
8814/// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
8815/// in the case of a the GNU conditional expr extension.
8816ExprResult Sema::ActOnConditionalOp(SourceLocation QuestionLoc,
8817 SourceLocation ColonLoc,
8818 Expr *CondExpr, Expr *LHSExpr,
8819 Expr *RHSExpr) {
8820 if (!Context.isDependenceAllowed()) {
8821 // C cannot handle TypoExpr nodes in the condition because it
8822 // doesn't handle dependent types properly, so make sure any TypoExprs have
8823 // been dealt with before checking the operands.
8824 ExprResult CondResult = CorrectDelayedTyposInExpr(CondExpr);
8825 ExprResult LHSResult = CorrectDelayedTyposInExpr(LHSExpr);
8826 ExprResult RHSResult = CorrectDelayedTyposInExpr(RHSExpr);
8827
8828 if (!CondResult.isUsable())
8829 return ExprError();
8830
8831 if (LHSExpr) {
8832 if (!LHSResult.isUsable())
8833 return ExprError();
8834 }
8835
8836 if (!RHSResult.isUsable())
8837 return ExprError();
8838
8839 CondExpr = CondResult.get();
8840 LHSExpr = LHSResult.get();
8841 RHSExpr = RHSResult.get();
8842 }
8843
8844 // If this is the gnu "x ?: y" extension, analyze the types as though the LHS
8845 // was the condition.
8846 OpaqueValueExpr *opaqueValue = nullptr;
8847 Expr *commonExpr = nullptr;
8848 if (!LHSExpr) {
8849 commonExpr = CondExpr;
8850 // Lower out placeholder types first. This is important so that we don't
8851 // try to capture a placeholder. This happens in few cases in C++; such
8852 // as Objective-C++'s dictionary subscripting syntax.
8853 if (commonExpr->hasPlaceholderType()) {
8854 ExprResult result = CheckPlaceholderExpr(commonExpr);
8855 if (!result.isUsable()) return ExprError();
8856 commonExpr = result.get();
8857 }
8858 // We usually want to apply unary conversions *before* saving, except
8859 // in the special case of a C++ l-value conditional.
8860 if (!(getLangOpts().CPlusPlus
8861 && !commonExpr->isTypeDependent()
8862 && commonExpr->getValueKind() == RHSExpr->getValueKind()
8863 && commonExpr->isGLValue()
8864 && commonExpr->isOrdinaryOrBitFieldObject()
8865 && RHSExpr->isOrdinaryOrBitFieldObject()
8866 && Context.hasSameType(commonExpr->getType(), RHSExpr->getType()))) {
8867 ExprResult commonRes = UsualUnaryConversions(commonExpr);
8868 if (commonRes.isInvalid())
8869 return ExprError();
8870 commonExpr = commonRes.get();
8871 }
8872
8873 // If the common expression is a class or array prvalue, materialize it
8874 // so that we can safely refer to it multiple times.
8875 if (commonExpr->isPRValue() && (commonExpr->getType()->isRecordType() ||
8876 commonExpr->getType()->isArrayType())) {
8877 ExprResult MatExpr = TemporaryMaterializationConversion(commonExpr);
8878 if (MatExpr.isInvalid())
8879 return ExprError();
8880 commonExpr = MatExpr.get();
8881 }
8882
8883 opaqueValue = new (Context) OpaqueValueExpr(commonExpr->getExprLoc(),
8884 commonExpr->getType(),
8885 commonExpr->getValueKind(),
8886 commonExpr->getObjectKind(),
8887 commonExpr);
8888 LHSExpr = CondExpr = opaqueValue;
8889 }
8890
8891 QualType LHSTy = LHSExpr->getType(), RHSTy = RHSExpr->getType();
8892 ExprValueKind VK = VK_PRValue;
8893 ExprObjectKind OK = OK_Ordinary;
8894 ExprResult Cond = CondExpr, LHS = LHSExpr, RHS = RHSExpr;
8895 QualType result = CheckConditionalOperands(Cond, LHS, RHS,
8896 VK, OK, QuestionLoc);
8897 if (result.isNull() || Cond.isInvalid() || LHS.isInvalid() ||
8898 RHS.isInvalid())
8899 return ExprError();
8900
8901 DiagnoseConditionalPrecedence(*this, QuestionLoc, Cond.get(), LHS.get(),
8902 RHS.get());
8903
8904 CheckBoolLikeConversion(Cond.get(), QuestionLoc);
8905
8906 result = computeConditionalNullability(result, commonExpr, LHSTy, RHSTy,
8907 Context);
8908
8909 if (!commonExpr)
8910 return new (Context)
8911 ConditionalOperator(Cond.get(), QuestionLoc, LHS.get(), ColonLoc,
8912 RHS.get(), result, VK, OK);
8913
8914 return new (Context) BinaryConditionalOperator(
8915 commonExpr, opaqueValue, Cond.get(), LHS.get(), RHS.get(), QuestionLoc,
8916 ColonLoc, result, VK, OK);
8917}
8918
8919// Check if we have a conversion between incompatible cmse function pointer
8920// types, that is, a conversion between a function pointer with the
8921// cmse_nonsecure_call attribute and one without.
8922static bool IsInvalidCmseNSCallConversion(Sema &S, QualType FromType,
8923 QualType ToType) {
8924 if (const auto *ToFn =
8925 dyn_cast<FunctionType>(S.Context.getCanonicalType(ToType))) {
8926 if (const auto *FromFn =
8927 dyn_cast<FunctionType>(S.Context.getCanonicalType(FromType))) {
8928 FunctionType::ExtInfo ToEInfo = ToFn->getExtInfo();
8929 FunctionType::ExtInfo FromEInfo = FromFn->getExtInfo();
8930
8931 return ToEInfo.getCmseNSCall() != FromEInfo.getCmseNSCall();
8932 }
8933 }
8934 return false;
8935}
8936
8937// checkPointerTypesForAssignment - This is a very tricky routine (despite
8938// being closely modeled after the C99 spec:-). The odd characteristic of this
8939// routine is it effectively iqnores the qualifiers on the top level pointee.
8940// This circumvents the usual type rules specified in 6.2.7p1 & 6.7.5.[1-3].
8941// FIXME: add a couple examples in this comment.
8942static Sema::AssignConvertType
8943checkPointerTypesForAssignment(Sema &S, QualType LHSType, QualType RHSType) {
8944 assert(LHSType.isCanonical() && "LHS not canonicalized!")(static_cast<void> (0));
8945 assert(RHSType.isCanonical() && "RHS not canonicalized!")(static_cast<void> (0));
8946
8947 // get the "pointed to" type (ignoring qualifiers at the top level)
8948 const Type *lhptee, *rhptee;
8949 Qualifiers lhq, rhq;
8950 std::tie(lhptee, lhq) =
8951 cast<PointerType>(LHSType)->getPointeeType().split().asPair();
8952 std::tie(rhptee, rhq) =
8953 cast<PointerType>(RHSType)->getPointeeType().split().asPair();
8954
8955 Sema::AssignConvertType ConvTy = Sema::Compatible;
8956
8957 // C99 6.5.16.1p1: This following citation is common to constraints
8958 // 3 & 4 (below). ...and the type *pointed to* by the left has all the
8959 // qualifiers of the type *pointed to* by the right;
8960
8961 // As a special case, 'non-__weak A *' -> 'non-__weak const *' is okay.
8962 if (lhq.getObjCLifetime() != rhq.getObjCLifetime() &&
8963 lhq.compatiblyIncludesObjCLifetime(rhq)) {
8964 // Ignore lifetime for further calculation.
8965 lhq.removeObjCLifetime();
8966 rhq.removeObjCLifetime();
8967 }
8968
8969 if (!lhq.compatiblyIncludes(rhq)) {
8970 // Treat address-space mismatches as fatal.
8971 if (!lhq.isAddressSpaceSupersetOf(rhq))
8972 return Sema::IncompatiblePointerDiscardsQualifiers;
8973
8974 // It's okay to add or remove GC or lifetime qualifiers when converting to
8975 // and from void*.
8976 else if (lhq.withoutObjCGCAttr().withoutObjCLifetime()
8977 .compatiblyIncludes(
8978 rhq.withoutObjCGCAttr().withoutObjCLifetime())
8979 && (lhptee->isVoidType() || rhptee->isVoidType()))
8980 ; // keep old
8981
8982 // Treat lifetime mismatches as fatal.
8983 else if (lhq.getObjCLifetime() != rhq.getObjCLifetime())
8984 ConvTy = Sema::IncompatiblePointerDiscardsQualifiers;
8985
8986 // For GCC/MS compatibility, other qualifier mismatches are treated
8987 // as still compatible in C.
8988 else ConvTy = Sema::CompatiblePointerDiscardsQualifiers;
8989 }
8990
8991 // C99 6.5.16.1p1 (constraint 4): If one operand is a pointer to an object or
8992 // incomplete type and the other is a pointer to a qualified or unqualified
8993 // version of void...
8994 if (lhptee->isVoidType()) {
8995 if (rhptee->isIncompleteOrObjectType())
8996 return ConvTy;
8997
8998 // As an extension, we allow cast to/from void* to function pointer.
8999 assert(rhptee->isFunctionType())(static_cast<void> (0));
9000 return Sema::FunctionVoidPointer;
9001 }
9002
9003 if (rhptee->isVoidType()) {
9004 if (lhptee->isIncompleteOrObjectType())
9005 return ConvTy;
9006
9007 // As an extension, we allow cast to/from void* to function pointer.
9008 assert(lhptee->isFunctionType())(static_cast<void> (0));
9009 return Sema::FunctionVoidPointer;
9010 }
9011
9012 // C99 6.5.16.1p1 (constraint 3): both operands are pointers to qualified or
9013 // unqualified versions of compatible types, ...
9014 QualType ltrans = QualType(lhptee, 0), rtrans = QualType(rhptee, 0);
9015 if (!S.Context.typesAreCompatible(ltrans, rtrans)) {
9016 // Check if the pointee types are compatible ignoring the sign.
9017 // We explicitly check for char so that we catch "char" vs
9018 // "unsigned char" on systems where "char" is unsigned.
9019 if (lhptee->isCharType())
9020 ltrans = S.Context.UnsignedCharTy;
9021 else if (lhptee->hasSignedIntegerRepresentation())
9022 ltrans = S.Context.getCorrespondingUnsignedType(ltrans);
9023
9024 if (rhptee->isCharType())
9025 rtrans = S.Context.UnsignedCharTy;
9026 else if (rhptee->hasSignedIntegerRepresentation())
9027 rtrans = S.Context.getCorrespondingUnsignedType(rtrans);
9028
9029 if (ltrans == rtrans) {
9030 // Types are compatible ignoring the sign. Qualifier incompatibility
9031 // takes priority over sign incompatibility because the sign
9032 // warning can be disabled.
9033 if (ConvTy != Sema::Compatible)
9034 return ConvTy;
9035
9036 return Sema::IncompatiblePointerSign;
9037 }
9038
9039 // If we are a multi-level pointer, it's possible that our issue is simply
9040 // one of qualification - e.g. char ** -> const char ** is not allowed. If
9041 // the eventual target type is the same and the pointers have the same
9042 // level of indirection, this must be the issue.
9043 if (isa<PointerType>(lhptee) && isa<PointerType>(rhptee)) {
9044 do {
9045 std::tie(lhptee, lhq) =
9046 cast<PointerType>(lhptee)->getPointeeType().split().asPair();
9047 std::tie(rhptee, rhq) =
9048 cast<PointerType>(rhptee)->getPointeeType().split().asPair();
9049
9050 // Inconsistent address spaces at this point is invalid, even if the
9051 // address spaces would be compatible.
9052 // FIXME: This doesn't catch address space mismatches for pointers of
9053 // different nesting levels, like:
9054 // __local int *** a;
9055 // int ** b = a;
9056 // It's not clear how to actually determine when such pointers are
9057 // invalidly incompatible.
9058 if (lhq.getAddressSpace() != rhq.getAddressSpace())
9059 return Sema::IncompatibleNestedPointerAddressSpaceMismatch;
9060
9061 } while (isa<PointerType>(lhptee) && isa<PointerType>(rhptee));
9062
9063 if (lhptee == rhptee)
9064 return Sema::IncompatibleNestedPointerQualifiers;
9065 }
9066
9067 // General pointer incompatibility takes priority over qualifiers.
9068 if (RHSType->isFunctionPointerType() && LHSType->isFunctionPointerType())
9069 return Sema::IncompatibleFunctionPointer;
9070 return Sema::IncompatiblePointer;
9071 }
9072 if (!S.getLangOpts().CPlusPlus &&
9073 S.IsFunctionConversion(ltrans, rtrans, ltrans))
9074 return Sema::IncompatibleFunctionPointer;
9075 if (IsInvalidCmseNSCallConversion(S, ltrans, rtrans))
9076 return Sema::IncompatibleFunctionPointer;
9077 return ConvTy;
9078}
9079
9080/// checkBlockPointerTypesForAssignment - This routine determines whether two
9081/// block pointer types are compatible or whether a block and normal pointer
9082/// are compatible. It is more restrict than comparing two function pointer
9083// types.
9084static Sema::AssignConvertType
9085checkBlockPointerTypesForAssignment(Sema &S, QualType LHSType,
9086 QualType RHSType) {
9087 assert(LHSType.isCanonical() && "LHS not canonicalized!")(static_cast<void> (0));
9088 assert(RHSType.isCanonical() && "RHS not canonicalized!")(static_cast<void> (0));
9089
9090 QualType lhptee, rhptee;
9091
9092 // get the "pointed to" type (ignoring qualifiers at the top level)
9093 lhptee = cast<BlockPointerType>(LHSType)->getPointeeType();
9094 rhptee = cast<BlockPointerType>(RHSType)->getPointeeType();
9095
9096 // In C++, the types have to match exactly.
9097 if (S.getLangOpts().CPlusPlus)
9098 return Sema::IncompatibleBlockPointer;
9099
9100 Sema::AssignConvertType ConvTy = Sema::Compatible;
9101
9102 // For blocks we enforce that qualifiers are identical.
9103 Qualifiers LQuals = lhptee.getLocalQualifiers();
9104 Qualifiers RQuals = rhptee.getLocalQualifiers();
9105 if (S.getLangOpts().OpenCL) {
9106 LQuals.removeAddressSpace();
9107 RQuals.removeAddressSpace();
9108 }
9109 if (LQuals != RQuals)
9110 ConvTy = Sema::CompatiblePointerDiscardsQualifiers;
9111
9112 // FIXME: OpenCL doesn't define the exact compile time semantics for a block
9113 // assignment.
9114 // The current behavior is similar to C++ lambdas. A block might be
9115 // assigned to a variable iff its return type and parameters are compatible
9116 // (C99 6.2.7) with the corresponding return type and parameters of the LHS of
9117 // an assignment. Presumably it should behave in way that a function pointer
9118 // assignment does in C, so for each parameter and return type:
9119 // * CVR and address space of LHS should be a superset of CVR and address
9120 // space of RHS.
9121 // * unqualified types should be compatible.
9122 if (S.getLangOpts().OpenCL) {
9123 if (!S.Context.typesAreBlockPointerCompatible(
9124 S.Context.getQualifiedType(LHSType.getUnqualifiedType(), LQuals),
9125 S.Context.getQualifiedType(RHSType.getUnqualifiedType(), RQuals)))
9126 return Sema::IncompatibleBlockPointer;
9127 } else if (!S.Context.typesAreBlockPointerCompatible(LHSType, RHSType))
9128 return Sema::IncompatibleBlockPointer;
9129
9130 return ConvTy;
9131}
9132
9133/// checkObjCPointerTypesForAssignment - Compares two objective-c pointer types
9134/// for assignment compatibility.
9135static Sema::AssignConvertType
9136checkObjCPointerTypesForAssignment(Sema &S, QualType LHSType,
9137 QualType RHSType) {
9138 assert(LHSType.isCanonical() && "LHS was not canonicalized!")(static_cast<void> (0));
9139 assert(RHSType.isCanonical() && "RHS was not canonicalized!")(static_cast<void> (0));
9140
9141 if (LHSType->isObjCBuiltinType()) {
9142 // Class is not compatible with ObjC object pointers.
9143 if (LHSType->isObjCClassType() && !RHSType->isObjCBuiltinType() &&
9144 !RHSType->isObjCQualifiedClassType())
9145 return Sema::IncompatiblePointer;
9146 return Sema::Compatible;
9147 }
9148 if (RHSType->isObjCBuiltinType()) {
9149 if (RHSType->isObjCClassType() && !LHSType->isObjCBuiltinType() &&
9150 !LHSType->isObjCQualifiedClassType())
9151 return Sema::IncompatiblePointer;
9152 return Sema::Compatible;
9153 }
9154 QualType lhptee = LHSType->castAs<ObjCObjectPointerType>()->getPointeeType();
9155 QualType rhptee = RHSType->castAs<ObjCObjectPointerType>()->getPointeeType();
9156
9157 if (!lhptee.isAtLeastAsQualifiedAs(rhptee) &&
9158 // make an exception for id<P>
9159 !LHSType->isObjCQualifiedIdType())
9160 return Sema::CompatiblePointerDiscardsQualifiers;
9161
9162 if (S.Context.typesAreCompatible(LHSType, RHSType))
9163 return Sema::Compatible;
9164 if (LHSType->isObjCQualifiedIdType() || RHSType->isObjCQualifiedIdType())
9165 return Sema::IncompatibleObjCQualifiedId;
9166 return Sema::IncompatiblePointer;
9167}
9168
9169Sema::AssignConvertType
9170Sema::CheckAssignmentConstraints(SourceLocation Loc,
9171 QualType LHSType, QualType RHSType) {
9172 // Fake up an opaque expression. We don't actually care about what
9173 // cast operations are required, so if CheckAssignmentConstraints
9174 // adds casts to this they'll be wasted, but fortunately that doesn't
9175 // usually happen on valid code.
9176 OpaqueValueExpr RHSExpr(Loc, RHSType, VK_PRValue);
9177 ExprResult RHSPtr = &RHSExpr;
9178 CastKind K;
9179
9180 return CheckAssignmentConstraints(LHSType, RHSPtr, K, /*ConvertRHS=*/false);
9181}
9182
9183/// This helper function returns true if QT is a vector type that has element
9184/// type ElementType.
9185static bool isVector(QualType QT, QualType ElementType) {
9186 if (const VectorType *VT = QT->getAs<VectorType>())
9187 return VT->getElementType().getCanonicalType() == ElementType;
9188 return false;
9189}
9190
9191/// CheckAssignmentConstraints (C99 6.5.16) - This routine currently
9192/// has code to accommodate several GCC extensions when type checking
9193/// pointers. Here are some objectionable examples that GCC considers warnings:
9194///
9195/// int a, *pint;
9196/// short *pshort;
9197/// struct foo *pfoo;
9198///
9199/// pint = pshort; // warning: assignment from incompatible pointer type
9200/// a = pint; // warning: assignment makes integer from pointer without a cast
9201/// pint = a; // warning: assignment makes pointer from integer without a cast
9202/// pint = pfoo; // warning: assignment from incompatible pointer type
9203///
9204/// As a result, the code for dealing with pointers is more complex than the
9205/// C99 spec dictates.
9206///
9207/// Sets 'Kind' for any result kind except Incompatible.
9208Sema::AssignConvertType
9209Sema::CheckAssignmentConstraints(QualType LHSType, ExprResult &RHS,
9210 CastKind &Kind, bool ConvertRHS) {
9211 QualType RHSType = RHS.get()->getType();
9212 QualType OrigLHSType = LHSType;
9213
9214 // Get canonical types. We're not formatting these types, just comparing
9215 // them.
9216 LHSType = Context.getCanonicalType(LHSType).getUnqualifiedType();
9217 RHSType = Context.getCanonicalType(RHSType).getUnqualifiedType();
9218
9219 // Common case: no conversion required.
9220 if (LHSType == RHSType) {
9221 Kind = CK_NoOp;
9222 return Compatible;
9223 }
9224
9225 // If we have an atomic type, try a non-atomic assignment, then just add an
9226 // atomic qualification step.
9227 if (const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
9228 Sema::AssignConvertType result =
9229 CheckAssignmentConstraints(AtomicTy->getValueType(), RHS, Kind);
9230 if (result != Compatible)
9231 return result;
9232 if (Kind != CK_NoOp && ConvertRHS)
9233 RHS = ImpCastExprToType(RHS.get(), AtomicTy->getValueType(), Kind);
9234 Kind = CK_NonAtomicToAtomic;
9235 return Compatible;
9236 }
9237
9238 // If the left-hand side is a reference type, then we are in a
9239 // (rare!) case where we've allowed the use of references in C,
9240 // e.g., as a parameter type in a built-in function. In this case,
9241 // just make sure that the type referenced is compatible with the
9242 // right-hand side type. The caller is responsible for adjusting
9243 // LHSType so that the resulting expression does not have reference
9244 // type.
9245 if (const ReferenceType *LHSTypeRef = LHSType->getAs<ReferenceType>()) {
9246 if (Context.typesAreCompatible(LHSTypeRef->getPointeeType(), RHSType)) {
9247 Kind = CK_LValueBitCast;
9248 return Compatible;
9249 }
9250 return Incompatible;
9251 }
9252
9253 // Allow scalar to ExtVector assignments, and assignments of an ExtVector type
9254 // to the same ExtVector type.
9255 if (LHSType->isExtVectorType()) {
9256 if (RHSType->isExtVectorType())
9257 return Incompatible;
9258 if (RHSType->isArithmeticType()) {
9259 // CK_VectorSplat does T -> vector T, so first cast to the element type.
9260 if (ConvertRHS)
9261 RHS = prepareVectorSplat(LHSType, RHS.get());
9262 Kind = CK_VectorSplat;
9263 return Compatible;
9264 }
9265 }
9266
9267 // Conversions to or from vector type.
9268 if (LHSType->isVectorType() || RHSType->isVectorType()) {
9269 if (LHSType->isVectorType() && RHSType->isVectorType()) {
9270 // Allow assignments of an AltiVec vector type to an equivalent GCC
9271 // vector type and vice versa
9272 if (Context.areCompatibleVectorTypes(LHSType, RHSType)) {
9273 Kind = CK_BitCast;
9274 return Compatible;
9275 }
9276
9277 // If we are allowing lax vector conversions, and LHS and RHS are both
9278 // vectors, the total size only needs to be the same. This is a bitcast;
9279 // no bits are changed but the result type is different.
9280 if (isLaxVectorConversion(RHSType, LHSType)) {
9281 Kind = CK_BitCast;
9282 return IncompatibleVectors;
9283 }
9284 }
9285
9286 // When the RHS comes from another lax conversion (e.g. binops between
9287 // scalars and vectors) the result is canonicalized as a vector. When the
9288 // LHS is also a vector, the lax is allowed by the condition above. Handle
9289 // the case where LHS is a scalar.
9290 if (LHSType->isScalarType()) {
9291 const VectorType *VecType = RHSType->getAs<VectorType>();
9292 if (VecType && VecType->getNumElements() == 1 &&
9293 isLaxVectorConversion(RHSType, LHSType)) {
9294 ExprResult *VecExpr = &RHS;
9295 *VecExpr = ImpCastExprToType(VecExpr->get(), LHSType, CK_BitCast);
9296 Kind = CK_BitCast;
9297 return Compatible;
9298 }
9299 }
9300
9301 // Allow assignments between fixed-length and sizeless SVE vectors.
9302 if ((LHSType->isSizelessBuiltinType() && RHSType->isVectorType()) ||
9303 (LHSType->isVectorType() && RHSType->isSizelessBuiltinType()))
9304 if (Context.areCompatibleSveTypes(LHSType, RHSType) ||
9305 Context.areLaxCompatibleSveTypes(LHSType, RHSType)) {
9306 Kind = CK_BitCast;
9307 return Compatible;
9308 }
9309
9310 return Incompatible;
9311 }
9312
9313 // Diagnose attempts to convert between __float128 and long double where
9314 // such conversions currently can't be handled.
9315 if (unsupportedTypeConversion(*this, LHSType, RHSType))
9316 return Incompatible;
9317
9318 // Disallow assigning a _Complex to a real type in C++ mode since it simply
9319 // discards the imaginary part.
9320 if (getLangOpts().CPlusPlus && RHSType->getAs<ComplexType>() &&
9321 !LHSType->getAs<ComplexType>())
9322 return Incompatible;
9323
9324 // Arithmetic conversions.
9325 if (LHSType->isArithmeticType() && RHSType->isArithmeticType() &&
9326 !(getLangOpts().CPlusPlus && LHSType->isEnumeralType())) {
9327 if (ConvertRHS)
9328 Kind = PrepareScalarCast(RHS, LHSType);
9329 return Compatible;
9330 }
9331
9332 // Conversions to normal pointers.
9333 if (const PointerType *LHSPointer = dyn_cast<PointerType>(LHSType)) {
9334 // U* -> T*
9335 if (isa<PointerType>(RHSType)) {
9336 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9337 LangAS AddrSpaceR = RHSType->getPointeeType().getAddressSpace();
9338 if (AddrSpaceL != AddrSpaceR)
9339 Kind = CK_AddressSpaceConversion;
9340 else if (Context.hasCvrSimilarType(RHSType, LHSType))
9341 Kind = CK_NoOp;
9342 else
9343 Kind = CK_BitCast;
9344 return checkPointerTypesForAssignment(*this, LHSType, RHSType);
9345 }
9346
9347 // int -> T*
9348 if (RHSType->isIntegerType()) {
9349 Kind = CK_IntegralToPointer; // FIXME: null?
9350 return IntToPointer;
9351 }
9352
9353 // C pointers are not compatible with ObjC object pointers,
9354 // with two exceptions:
9355 if (isa<ObjCObjectPointerType>(RHSType)) {
9356 // - conversions to void*
9357 if (LHSPointer->getPointeeType()->isVoidType()) {
9358 Kind = CK_BitCast;
9359 return Compatible;
9360 }
9361
9362 // - conversions from 'Class' to the redefinition type
9363 if (RHSType->isObjCClassType() &&
9364 Context.hasSameType(LHSType,
9365 Context.getObjCClassRedefinitionType())) {
9366 Kind = CK_BitCast;
9367 return Compatible;
9368 }
9369
9370 Kind = CK_BitCast;
9371 return IncompatiblePointer;
9372 }
9373
9374 // U^ -> void*
9375 if (RHSType->getAs<BlockPointerType>()) {
9376 if (LHSPointer->getPointeeType()->isVoidType()) {
9377 LangAS AddrSpaceL = LHSPointer->getPointeeType().getAddressSpace();
9378 LangAS AddrSpaceR = RHSType->getAs<BlockPointerType>()
9379 ->getPointeeType()
9380 .getAddressSpace();
9381 Kind =
9382 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9383 return Compatible;
9384 }
9385 }
9386
9387 return Incompatible;
9388 }
9389
9390 // Conversions to block pointers.
9391 if (isa<BlockPointerType>(LHSType)) {
9392 // U^ -> T^
9393 if (RHSType->isBlockPointerType()) {
9394 LangAS AddrSpaceL = LHSType->getAs<BlockPointerType>()
9395 ->getPointeeType()
9396 .getAddressSpace();
9397 LangAS AddrSpaceR = RHSType->getAs<BlockPointerType>()
9398 ->getPointeeType()
9399 .getAddressSpace();
9400 Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
9401 return checkBlockPointerTypesForAssignment(*this, LHSType, RHSType);
9402 }
9403
9404 // int or null -> T^
9405 if (RHSType->isIntegerType()) {
9406 Kind = CK_IntegralToPointer; // FIXME: null
9407 return IntToBlockPointer;
9408 }
9409
9410 // id -> T^
9411 if (getLangOpts().ObjC && RHSType->isObjCIdType()) {
9412 Kind = CK_AnyPointerToBlockPointerCast;
9413 return Compatible;
9414 }
9415
9416 // void* -> T^
9417 if (const PointerType *RHSPT = RHSType->getAs<PointerType>())
9418 if (RHSPT->getPointeeType()->isVoidType()) {
9419 Kind = CK_AnyPointerToBlockPointerCast;
9420 return Compatible;
9421 }
9422
9423 return Incompatible;
9424 }
9425
9426 // Conversions to Objective-C pointers.
9427 if (isa<ObjCObjectPointerType>(LHSType)) {
9428 // A* -> B*
9429 if (RHSType->isObjCObjectPointerType()) {
9430 Kind = CK_BitCast;
9431 Sema::AssignConvertType result =
9432 checkObjCPointerTypesForAssignment(*this, LHSType, RHSType);
9433 if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9434 result == Compatible &&
9435 !CheckObjCARCUnavailableWeakConversion(OrigLHSType, RHSType))
9436 result = IncompatibleObjCWeakRef;
9437 return result;
9438 }
9439
9440 // int or null -> A*
9441 if (RHSType->isIntegerType()) {
9442 Kind = CK_IntegralToPointer; // FIXME: null
9443 return IntToPointer;
9444 }
9445
9446 // In general, C pointers are not compatible with ObjC object pointers,
9447 // with two exceptions:
9448 if (isa<PointerType>(RHSType)) {
9449 Kind = CK_CPointerToObjCPointerCast;
9450
9451 // - conversions from 'void*'
9452 if (RHSType->isVoidPointerType()) {
9453 return Compatible;
9454 }
9455
9456 // - conversions to 'Class' from its redefinition type
9457 if (LHSType->isObjCClassType() &&
9458 Context.hasSameType(RHSType,
9459 Context.getObjCClassRedefinitionType())) {
9460 return Compatible;
9461 }
9462
9463 return IncompatiblePointer;
9464 }
9465
9466 // Only under strict condition T^ is compatible with an Objective-C pointer.
9467 if (RHSType->isBlockPointerType() &&
9468 LHSType->isBlockCompatibleObjCPointerType(Context)) {
9469 if (ConvertRHS)
9470 maybeExtendBlockObject(RHS);
9471 Kind = CK_BlockPointerToObjCPointerCast;
9472 return Compatible;
9473 }
9474
9475 return Incompatible;
9476 }
9477
9478 // Conversions from pointers that are not covered by the above.
9479 if (isa<PointerType>(RHSType)) {
9480 // T* -> _Bool
9481 if (LHSType == Context.BoolTy) {
9482 Kind = CK_PointerToBoolean;
9483 return Compatible;
9484 }
9485
9486 // T* -> int
9487 if (LHSType->isIntegerType()) {
9488 Kind = CK_PointerToIntegral;
9489 return PointerToInt;
9490 }
9491
9492 return Incompatible;
9493 }
9494
9495 // Conversions from Objective-C pointers that are not covered by the above.
9496 if (isa<ObjCObjectPointerType>(RHSType)) {
9497 // T* -> _Bool
9498 if (LHSType == Context.BoolTy) {
9499 Kind = CK_PointerToBoolean;
9500 return Compatible;
9501 }
9502
9503 // T* -> int
9504 if (LHSType->isIntegerType()) {
9505 Kind = CK_PointerToIntegral;
9506 return PointerToInt;
9507 }
9508
9509 return Incompatible;
9510 }
9511
9512 // struct A -> struct B
9513 if (isa<TagType>(LHSType) && isa<TagType>(RHSType)) {
9514 if (Context.typesAreCompatible(LHSType, RHSType)) {
9515 Kind = CK_NoOp;
9516 return Compatible;
9517 }
9518 }
9519
9520 if (LHSType->isSamplerT() && RHSType->isIntegerType()) {
9521 Kind = CK_IntToOCLSampler;
9522 return Compatible;
9523 }
9524
9525 return Incompatible;
9526}
9527
9528/// Constructs a transparent union from an expression that is
9529/// used to initialize the transparent union.
9530static void ConstructTransparentUnion(Sema &S, ASTContext &C,
9531 ExprResult &EResult, QualType UnionType,
9532 FieldDecl *Field) {
9533 // Build an initializer list that designates the appropriate member
9534 // of the transparent union.
9535 Expr *E = EResult.get();
9536 InitListExpr *Initializer = new (C) InitListExpr(C, SourceLocation(),
9537 E, SourceLocation());
9538 Initializer->setType(UnionType);
9539 Initializer->setInitializedFieldInUnion(Field);
9540
9541 // Build a compound literal constructing a value of the transparent
9542 // union type from this initializer list.
9543 TypeSourceInfo *unionTInfo = C.getTrivialTypeSourceInfo(UnionType);
9544 EResult = new (C) CompoundLiteralExpr(SourceLocation(), unionTInfo, UnionType,
9545 VK_PRValue, Initializer, false);
9546}
9547
9548Sema::AssignConvertType
9549Sema::CheckTransparentUnionArgumentConstraints(QualType ArgType,
9550 ExprResult &RHS) {
9551 QualType RHSType = RHS.get()->getType();
9552
9553 // If the ArgType is a Union type, we want to handle a potential
9554 // transparent_union GCC extension.
9555 const RecordType *UT = ArgType->getAsUnionType();
9556 if (!UT || !UT->getDecl()->hasAttr<TransparentUnionAttr>())
9557 return Incompatible;
9558
9559 // The field to initialize within the transparent union.
9560 RecordDecl *UD = UT->getDecl();
9561 FieldDecl *InitField = nullptr;
9562 // It's compatible if the expression matches any of the fields.
9563 for (auto *it : UD->fields()) {
9564 if (it->getType()->isPointerType()) {
9565 // If the transparent union contains a pointer type, we allow:
9566 // 1) void pointer
9567 // 2) null pointer constant
9568 if (RHSType->isPointerType())
9569 if (RHSType->castAs<PointerType>()->getPointeeType()->isVoidType()) {
9570 RHS = ImpCastExprToType(RHS.get(), it->getType(), CK_BitCast);
9571 InitField = it;
9572 break;
9573 }
9574
9575 if (RHS.get()->isNullPointerConstant(Context,
9576 Expr::NPC_ValueDependentIsNull)) {
9577 RHS = ImpCastExprToType(RHS.get(), it->getType(),
9578 CK_NullToPointer);
9579 InitField = it;
9580 break;
9581 }
9582 }
9583
9584 CastKind Kind;
9585 if (CheckAssignmentConstraints(it->getType(), RHS, Kind)
9586 == Compatible) {
9587 RHS = ImpCastExprToType(RHS.get(), it->getType(), Kind);
9588 InitField = it;
9589 break;
9590 }
9591 }
9592
9593 if (!InitField)
9594 return Incompatible;
9595
9596 ConstructTransparentUnion(*this, Context, RHS, ArgType, InitField);
9597 return Compatible;
9598}
9599
9600Sema::AssignConvertType
9601Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &CallerRHS,
9602 bool Diagnose,
9603 bool DiagnoseCFAudited,
9604 bool ConvertRHS) {
9605 // We need to be able to tell the caller whether we diagnosed a problem, if
9606 // they ask us to issue diagnostics.
9607 assert((ConvertRHS || !Diagnose) && "can't indicate whether we diagnosed")(static_cast<void> (0));
9608
9609 // If ConvertRHS is false, we want to leave the caller's RHS untouched. Sadly,
9610 // we can't avoid *all* modifications at the moment, so we need some somewhere
9611 // to put the updated value.
9612 ExprResult LocalRHS = CallerRHS;
9613 ExprResult &RHS = ConvertRHS ? CallerRHS : LocalRHS;
9614
9615 if (const auto *LHSPtrType = LHSType->getAs<PointerType>()) {
9616 if (const auto *RHSPtrType = RHS.get()->getType()->getAs<PointerType>()) {
9617 if (RHSPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
9618 !LHSPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
9619 Diag(RHS.get()->getExprLoc(),
9620 diag::warn_noderef_to_dereferenceable_pointer)
9621 << RHS.get()->getSourceRange();
9622 }
9623 }
9624 }
9625
9626 if (getLangOpts().CPlusPlus) {
9627 if (!LHSType->isRecordType() && !LHSType->isAtomicType()) {
9628 // C++ 5.17p3: If the left operand is not of class type, the
9629 // expression is implicitly converted (C++ 4) to the
9630 // cv-unqualified type of the left operand.
9631 QualType RHSType = RHS.get()->getType();
9632 if (Diagnose) {
9633 RHS = PerformImplicitConversion(RHS.get(), LHSType.getUnqualifiedType(),
9634 AA_Assigning);
9635 } else {
9636 ImplicitConversionSequence ICS =
9637 TryImplicitConversion(RHS.get(), LHSType.getUnqualifiedType(),
9638 /*SuppressUserConversions=*/false,
9639 AllowedExplicit::None,
9640 /*InOverloadResolution=*/false,
9641 /*CStyle=*/false,
9642 /*AllowObjCWritebackConversion=*/false);
9643 if (ICS.isFailure())
9644 return Incompatible;
9645 RHS = PerformImplicitConversion(RHS.get(), LHSType.getUnqualifiedType(),
9646 ICS, AA_Assigning);
9647 }
9648 if (RHS.isInvalid())
9649 return Incompatible;
9650 Sema::AssignConvertType result = Compatible;
9651 if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9652 !CheckObjCARCUnavailableWeakConversion(LHSType, RHSType))
9653 result = IncompatibleObjCWeakRef;
9654 return result;
9655 }
9656
9657 // FIXME: Currently, we fall through and treat C++ classes like C
9658 // structures.
9659 // FIXME: We also fall through for atomics; not sure what should
9660 // happen there, though.
9661 } else if (RHS.get()->getType() == Context.OverloadTy) {
9662 // As a set of extensions to C, we support overloading on functions. These
9663 // functions need to be resolved here.
9664 DeclAccessPair DAP;
9665 if (FunctionDecl *FD = ResolveAddressOfOverloadedFunction(
9666 RHS.get(), LHSType, /*Complain=*/false, DAP))
9667 RHS = FixOverloadedFunctionReference(RHS.get(), DAP, FD);
9668 else
9669 return Incompatible;
9670 }
9671
9672 // C99 6.5.16.1p1: the left operand is a pointer and the right is
9673 // a null pointer constant.
9674 if ((LHSType->isPointerType() || LHSType->isObjCObjectPointerType() ||
9675 LHSType->isBlockPointerType()) &&
9676 RHS.get()->isNullPointerConstant(Context,
9677 Expr::NPC_ValueDependentIsNull)) {
9678 if (Diagnose || ConvertRHS) {
9679 CastKind Kind;
9680 CXXCastPath Path;
9681 CheckPointerConversion(RHS.get(), LHSType, Kind, Path,
9682 /*IgnoreBaseAccess=*/false, Diagnose);
9683 if (ConvertRHS)
9684 RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_PRValue, &Path);
9685 }
9686 return Compatible;
9687 }
9688
9689 // OpenCL queue_t type assignment.
9690 if (LHSType->isQueueT() && RHS.get()->isNullPointerConstant(
9691 Context, Expr::NPC_ValueDependentIsNull)) {
9692 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
9693 return Compatible;
9694 }
9695
9696 // This check seems unnatural, however it is necessary to ensure the proper
9697 // conversion of functions/arrays. If the conversion were done for all
9698 // DeclExpr's (created by ActOnIdExpression), it would mess up the unary
9699 // expressions that suppress this implicit conversion (&, sizeof).
9700 //
9701 // Suppress this for references: C++ 8.5.3p5.
9702 if (!LHSType->isReferenceType()) {
9703 // FIXME: We potentially allocate here even if ConvertRHS is false.
9704 RHS = DefaultFunctionArrayLvalueConversion(RHS.get(), Diagnose);
9705 if (RHS.isInvalid())
9706 return Incompatible;
9707 }
9708 CastKind Kind;
9709 Sema::AssignConvertType result =
9710 CheckAssignmentConstraints(LHSType, RHS, Kind, ConvertRHS);
9711
9712 // C99 6.5.16.1p2: The value of the right operand is converted to the
9713 // type of the assignment expression.
9714 // CheckAssignmentConstraints allows the left-hand side to be a reference,
9715 // so that we can use references in built-in functions even in C.
9716 // The getNonReferenceType() call makes sure that the resulting expression
9717 // does not have reference type.
9718 if (result != Incompatible && RHS.get()->getType() != LHSType) {
9719 QualType Ty = LHSType.getNonLValueExprType(Context);
9720 Expr *E = RHS.get();
9721
9722 // Check for various Objective-C errors. If we are not reporting
9723 // diagnostics and just checking for errors, e.g., during overload
9724 // resolution, return Incompatible to indicate the failure.
9725 if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
9726 CheckObjCConversion(SourceRange(), Ty, E, CCK_ImplicitConversion,
9727 Diagnose, DiagnoseCFAudited) != ACR_okay) {
9728 if (!Diagnose)
9729 return Incompatible;
9730 }
9731 if (getLangOpts().ObjC &&
9732 (CheckObjCBridgeRelatedConversions(E->getBeginLoc(), LHSType,
9733 E->getType(), E, Diagnose) ||
9734 CheckConversionToObjCLiteral(LHSType, E, Diagnose))) {
9735 if (!Diagnose)
9736 return Incompatible;
9737 // Replace the expression with a corrected version and continue so we
9738 // can find further errors.
9739 RHS = E;
9740 return Compatible;
9741 }
9742
9743 if (ConvertRHS)
9744 RHS = ImpCastExprToType(E, Ty, Kind);
9745 }
9746
9747 return result;
9748}
9749
9750namespace {
9751/// The original operand to an operator, prior to the application of the usual
9752/// arithmetic conversions and converting the arguments of a builtin operator
9753/// candidate.
9754struct OriginalOperand {
9755 explicit OriginalOperand(Expr *Op) : Orig(Op), Conversion(nullptr) {
9756 if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Op))
9757 Op = MTE->getSubExpr();
9758 if (auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Op))
9759 Op = BTE->getSubExpr();
9760 if (auto *ICE = dyn_cast<ImplicitCastExpr>(Op)) {
9761 Orig = ICE->getSubExprAsWritten();
9762 Conversion = ICE->getConversionFunction();
9763 }
9764 }
9765
9766 QualType getType() const { return Orig->getType(); }
9767
9768 Expr *Orig;
9769 NamedDecl *Conversion;
9770};
9771}
9772
9773QualType Sema::InvalidOperands(SourceLocation Loc, ExprResult &LHS,
9774 ExprResult &RHS) {
9775 OriginalOperand OrigLHS(LHS.get()), OrigRHS(RHS.get());
9776
9777 Diag(Loc, diag::err_typecheck_invalid_operands)
9778 << OrigLHS.getType() << OrigRHS.getType()
9779 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
9780
9781 // If a user-defined conversion was applied to either of the operands prior
9782 // to applying the built-in operator rules, tell the user about it.
9783 if (OrigLHS.Conversion) {
9784 Diag(OrigLHS.Conversion->getLocation(),
9785 diag::note_typecheck_invalid_operands_converted)
9786 << 0 << LHS.get()->getType();
9787 }
9788 if (OrigRHS.Conversion) {
9789 Diag(OrigRHS.Conversion->getLocation(),
9790 diag::note_typecheck_invalid_operands_converted)
9791 << 1 << RHS.get()->getType();
9792 }
9793
9794 return QualType();
9795}
9796
9797// Diagnose cases where a scalar was implicitly converted to a vector and
9798// diagnose the underlying types. Otherwise, diagnose the error
9799// as invalid vector logical operands for non-C++ cases.
9800QualType Sema::InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS,
9801 ExprResult &RHS) {
9802 QualType LHSType = LHS.get()->IgnoreImpCasts()->getType();
9803 QualType RHSType = RHS.get()->IgnoreImpCasts()->getType();
9804
9805 bool LHSNatVec = LHSType->isVectorType();
9806 bool RHSNatVec = RHSType->isVectorType();
9807
9808 if (!(LHSNatVec && RHSNatVec)) {
9809 Expr *Vector = LHSNatVec ? LHS.get() : RHS.get();
9810 Expr *NonVector = !LHSNatVec ? LHS.get() : RHS.get();
9811 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9812 << 0 << Vector->getType() << NonVector->IgnoreImpCasts()->getType()
9813 << Vector->getSourceRange();
9814 return QualType();
9815 }
9816
9817 Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict)
9818 << 1 << LHSType << RHSType << LHS.get()->getSourceRange()
9819 << RHS.get()->getSourceRange();
9820
9821 return QualType();
9822}
9823
9824/// Try to convert a value of non-vector type to a vector type by converting
9825/// the type to the element type of the vector and then performing a splat.
9826/// If the language is OpenCL, we only use conversions that promote scalar
9827/// rank; for C, Obj-C, and C++ we allow any real scalar conversion except
9828/// for float->int.
9829///
9830/// OpenCL V2.0 6.2.6.p2:
9831/// An error shall occur if any scalar operand type has greater rank
9832/// than the type of the vector element.
9833///
9834/// \param scalar - if non-null, actually perform the conversions
9835/// \return true if the operation fails (but without diagnosing the failure)
9836static bool tryVectorConvertAndSplat(Sema &S, ExprResult *scalar,
9837 QualType scalarTy,
9838 QualType vectorEltTy,
9839 QualType vectorTy,
9840 unsigned &DiagID) {
9841 // The conversion to apply to the scalar before splatting it,
9842 // if necessary.
9843 CastKind scalarCast = CK_NoOp;
9844
9845 if (vectorEltTy->isIntegralType(S.Context)) {
9846 if (S.getLangOpts().OpenCL && (scalarTy->isRealFloatingType() ||
9847 (scalarTy->isIntegerType() &&
9848 S.Context.getIntegerTypeOrder(vectorEltTy, scalarTy) < 0))) {
9849 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9850 return true;
9851 }
9852 if (!scalarTy->isIntegralType(S.Context))
9853 return true;
9854 scalarCast = CK_IntegralCast;
9855 } else if (vectorEltTy->isRealFloatingType()) {
9856 if (scalarTy->isRealFloatingType()) {
9857 if (S.getLangOpts().OpenCL &&
9858 S.Context.getFloatingTypeOrder(vectorEltTy, scalarTy) < 0) {
9859 DiagID = diag::err_opencl_scalar_type_rank_greater_than_vector_type;
9860 return true;
9861 }
9862 scalarCast = CK_FloatingCast;
9863 }
9864 else if (scalarTy->isIntegralType(S.Context))
9865 scalarCast = CK_IntegralToFloating;
9866 else
9867 return true;
9868 } else {
9869 return true;
9870 }
9871
9872 // Adjust scalar if desired.
9873 if (scalar) {
9874 if (scalarCast != CK_NoOp)
9875 *scalar = S.ImpCastExprToType(scalar->get(), vectorEltTy, scalarCast);
9876 *scalar = S.ImpCastExprToType(scalar->get(), vectorTy, CK_VectorSplat);
9877 }
9878 return false;
9879}
9880
9881/// Convert vector E to a vector with the same number of elements but different
9882/// element type.
9883static ExprResult convertVector(Expr *E, QualType ElementType, Sema &S) {
9884 const auto *VecTy = E->getType()->getAs<VectorType>();
9885 assert(VecTy && "Expression E must be a vector")(static_cast<void> (0));
9886 QualType NewVecTy = S.Context.getVectorType(ElementType,
9887 VecTy->getNumElements(),
9888 VecTy->getVectorKind());
9889
9890 // Look through the implicit cast. Return the subexpression if its type is
9891 // NewVecTy.
9892 if (auto *ICE = dyn_cast<ImplicitCastExpr>(E))
9893 if (ICE->getSubExpr()->getType() == NewVecTy)
9894 return ICE->getSubExpr();
9895
9896 auto Cast = ElementType->isIntegerType() ? CK_IntegralCast : CK_FloatingCast;
9897 return S.ImpCastExprToType(E, NewVecTy, Cast);
9898}
9899
9900/// Test if a (constant) integer Int can be casted to another integer type
9901/// IntTy without losing precision.
9902static bool canConvertIntToOtherIntTy(Sema &S, ExprResult *Int,
9903 QualType OtherIntTy) {
9904 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9905
9906 // Reject cases where the value of the Int is unknown as that would
9907 // possibly cause truncation, but accept cases where the scalar can be
9908 // demoted without loss of precision.
9909 Expr::EvalResult EVResult;
9910 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.Context);
9911 int Order = S.Context.getIntegerTypeOrder(OtherIntTy, IntTy);
9912 bool IntSigned = IntTy->hasSignedIntegerRepresentation();
9913 bool OtherIntSigned = OtherIntTy->hasSignedIntegerRepresentation();
9914
9915 if (CstInt) {
9916 // If the scalar is constant and is of a higher order and has more active
9917 // bits that the vector element type, reject it.
9918 llvm::APSInt Result = EVResult.Val.getInt();
9919 unsigned NumBits = IntSigned
9920 ? (Result.isNegative() ? Result.getMinSignedBits()
9921 : Result.getActiveBits())
9922 : Result.getActiveBits();
9923 if (Order < 0 && S.Context.getIntWidth(OtherIntTy) < NumBits)
9924 return true;
9925
9926 // If the signedness of the scalar type and the vector element type
9927 // differs and the number of bits is greater than that of the vector
9928 // element reject it.
9929 return (IntSigned != OtherIntSigned &&
9930 NumBits > S.Context.getIntWidth(OtherIntTy));
9931 }
9932
9933 // Reject cases where the value of the scalar is not constant and it's
9934 // order is greater than that of the vector element type.
9935 return (Order < 0);
9936}
9937
9938/// Test if a (constant) integer Int can be casted to floating point type
9939/// FloatTy without losing precision.
9940static bool canConvertIntTyToFloatTy(Sema &S, ExprResult *Int,
9941 QualType FloatTy) {
9942 QualType IntTy = Int->get()->getType().getUnqualifiedType();
9943
9944 // Determine if the integer constant can be expressed as a floating point
9945 // number of the appropriate type.
9946 Expr::EvalResult EVResult;
9947 bool CstInt = Int->get()->EvaluateAsInt(EVResult, S.Context);
9948
9949 uint64_t Bits = 0;
9950 if (CstInt) {
9951 // Reject constants that would be truncated if they were converted to
9952 // the floating point type. Test by simple to/from conversion.
9953 // FIXME: Ideally the conversion to an APFloat and from an APFloat
9954 // could be avoided if there was a convertFromAPInt method
9955 // which could signal back if implicit truncation occurred.
9956 llvm::APSInt Result = EVResult.Val.getInt();
9957 llvm::APFloat Float(S.Context.getFloatTypeSemantics(FloatTy));
9958 Float.convertFromAPInt(Result, IntTy->hasSignedIntegerRepresentation(),
9959 llvm::APFloat::rmTowardZero);
9960 llvm::APSInt ConvertBack(S.Context.getIntWidth(IntTy),
9961 !IntTy->hasSignedIntegerRepresentation());
9962 bool Ignored = false;
9963 Float.convertToInteger(ConvertBack, llvm::APFloat::rmNearestTiesToEven,
9964 &Ignored);
9965 if (Result != ConvertBack)
9966 return true;
9967 } else {
9968 // Reject types that cannot be fully encoded into the mantissa of
9969 // the float.
9970 Bits = S.Context.getTypeSize(IntTy);
9971 unsigned FloatPrec = llvm::APFloat::semanticsPrecision(
9972 S.Context.getFloatTypeSemantics(FloatTy));
9973 if (Bits > FloatPrec)
9974 return true;
9975 }
9976
9977 return false;
9978}
9979
9980/// Attempt to convert and splat Scalar into a vector whose types matches
9981/// Vector following GCC conversion rules. The rule is that implicit
9982/// conversion can occur when Scalar can be casted to match Vector's element
9983/// type without causing truncation of Scalar.
9984static bool tryGCCVectorConvertAndSplat(Sema &S, ExprResult *Scalar,
9985 ExprResult *Vector) {
9986 QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType();
9987 QualType VectorTy = Vector->get()->getType().getUnqualifiedType();
9988 const VectorType *VT = VectorTy->getAs<VectorType>();
44
Assuming the object is a 'VectorType'
67
Assuming the object is a 'VectorType'
9989
9990 assert(!isa<ExtVectorType>(VT) &&(static_cast<void> (0))
9991 "ExtVectorTypes should not be handled here!")(static_cast<void> (0));
9992
9993 QualType VectorEltTy = VT->getElementType();
9994
9995 // Reject cases where the vector element type or the scalar element type are
9996 // not integral or floating point types.
9997 if (!VectorEltTy->isArithmeticType() || !ScalarTy->isArithmeticType())
45
Assuming the condition is false
46
Assuming the condition is false
47
Taking false branch
68
Assuming the condition is false
69
Assuming the condition is false
70
Taking false branch
9998 return true;
9999
10000 // The conversion to apply to the scalar before splatting it,
10001 // if necessary.
10002 CastKind ScalarCast = CK_NoOp;
10003
10004 // Accept cases where the vector elements are integers and the scalar is
10005 // an integer.
10006 // FIXME: Notionally if the scalar was a floating point value with a precise
10007 // integral representation, we could cast it to an appropriate integer
10008 // type and then perform the rest of the checks here. GCC will perform
10009 // this conversion in some cases as determined by the input language.
10010 // We should accept it on a language independent basis.
10011 if (VectorEltTy->isIntegralType(S.Context) &&
48
Assuming the condition is false
71
Assuming the condition is false
10012 ScalarTy->isIntegralType(S.Context) &&
10013 S.Context.getIntegerTypeOrder(VectorEltTy, ScalarTy)) {
10014
10015 if (canConvertIntToOtherIntTy(S, Scalar, VectorEltTy))
10016 return true;
10017
10018 ScalarCast = CK_IntegralCast;
10019 } else if (VectorEltTy->isIntegralType(S.Context) &&
49
Assuming the condition is false
72
Assuming the condition is false
10020 ScalarTy->isRealFloatingType()) {
10021 if (S.Context.getTypeSize(VectorEltTy) == S.Context.getTypeSize(ScalarTy))
10022 ScalarCast = CK_FloatingToIntegral;
10023 else
10024 return true;
10025 } else if (VectorEltTy->isRealFloatingType()) {
50
Assuming the condition is false
51
Taking false branch
73
Assuming the condition is false
74
Taking false branch
10026 if (ScalarTy->isRealFloatingType()) {
10027
10028 // Reject cases where the scalar type is not a constant and has a higher
10029 // Order than the vector element type.
10030 llvm::APFloat Result(0.0);
10031
10032 // Determine whether this is a constant scalar. In the event that the
10033 // value is dependent (and thus cannot be evaluated by the constant
10034 // evaluator), skip the evaluation. This will then diagnose once the
10035 // expression is instantiated.
10036 bool CstScalar = Scalar->get()->isValueDependent() ||
10037 Scalar->get()->EvaluateAsFloat(Result, S.Context);
10038 int Order = S.Context.getFloatingTypeOrder(VectorEltTy, ScalarTy);
10039 if (!CstScalar && Order < 0)
10040 return true;
10041
10042 // If the scalar cannot be safely casted to the vector element type,
10043 // reject it.
10044 if (CstScalar) {
10045 bool Truncated = false;
10046 Result.convert(S.Context.getFloatTypeSemantics(VectorEltTy),
10047 llvm::APFloat::rmNearestTiesToEven, &Truncated);
10048 if (Truncated)
10049 return true;
10050 }
10051
10052 ScalarCast = CK_FloatingCast;
10053 } else if (ScalarTy->isIntegralType(S.Context)) {
10054 if (canConvertIntTyToFloatTy(S, Scalar, VectorEltTy))
10055 return true;
10056
10057 ScalarCast = CK_IntegralToFloating;
10058 } else
10059 return true;
10060 } else if (ScalarTy->isEnumeralType())
52
Calling 'Type::isEnumeralType'
55
Returning from 'Type::isEnumeralType'
56
Taking true branch
75
Calling 'Type::isEnumeralType'
78
Returning from 'Type::isEnumeralType'
79
Taking true branch
10061 return true;
57
Returning the value 1, which participates in a condition later
80
Returning the value 1, which participates in a condition later
10062
10063 // Adjust scalar if desired.
10064 if (Scalar) {
10065 if (ScalarCast != CK_NoOp)
10066 *Scalar = S.ImpCastExprToType(Scalar->get(), VectorEltTy, ScalarCast);
10067 *Scalar = S.ImpCastExprToType(Scalar->get(), VectorTy, CK_VectorSplat);
10068 }
10069 return false;
10070}
10071
10072QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS,
10073 SourceLocation Loc, bool IsCompAssign,
10074 bool AllowBothBool,
10075 bool AllowBoolConversions) {
10076 if (!IsCompAssign) {
1
Assuming 'IsCompAssign' is true
2
Taking false branch
10077 LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
10078 if (LHS.isInvalid())
10079 return QualType();
10080 }
10081 RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
10082 if (RHS.isInvalid())
3
Assuming the condition is false
4
Taking false branch
10083 return QualType();
10084
10085 // For conversion purposes, we ignore any qualifiers.
10086 // For example, "const float" and "float" are equivalent.
10087 QualType LHSType = LHS.get()->getType().getUnqualifiedType();
10088 QualType RHSType = RHS.get()->getType().getUnqualifiedType();
10089
10090 const VectorType *LHSVecType = LHSType->getAs<VectorType>();
5
Assuming the object is not a 'VectorType'
10091 const VectorType *RHSVecType = RHSType->getAs<VectorType>();
6
Assuming the object is not a 'VectorType'
7
'RHSVecType' initialized to a null pointer value
10092 assert(LHSVecType || RHSVecType)(static_cast<void> (0));
10093
10094 if ((LHSVecType
7.1
'LHSVecType' is null
7.1
'LHSVecType' is null
7.1
'LHSVecType' is null
&& LHSVecType->getElementType()->isBFloat16Type()) ||
10095 (RHSVecType
7.2
'RHSVecType' is null
7.2
'RHSVecType' is null
7.2
'RHSVecType' is null
&& RHSVecType->getElementType()->isBFloat16Type()))
10096 return InvalidOperands(Loc, LHS, RHS);
10097
10098 // AltiVec-style "vector bool op vector bool" combinations are allowed
10099 // for some operators but not others.
10100 if (!AllowBothBool &&
8
Assuming 'AllowBothBool' is true
10101 LHSVecType && LHSVecType->getVectorKind() == VectorType::AltiVecBool &&
10102 RHSVecType && RHSVecType->getVectorKind() == VectorType::AltiVecBool)
10103 return InvalidOperands(Loc, LHS, RHS);
10104
10105 // If the vector types are identical, return.
10106 if (Context.hasSameType(LHSType, RHSType))
9
Assuming the condition is false
10107 return LHSType;
10108
10109 // If we have compatible AltiVec and GCC vector types, use the AltiVec type.
10110 if (LHSVecType
9.1
'LHSVecType' is null
9.1
'LHSVecType' is null
9.1
'LHSVecType' is null
&& RHSVecType &&
10111 Context.areCompatibleVectorTypes(LHSType, RHSType)) {
10112 if (isa<ExtVectorType>(LHSVecType)) {
10113 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast);
10114 return LHSType;
10115 }
10116
10117 if (!IsCompAssign)
10118 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_BitCast);
10119 return RHSType;
10120 }
10121
10122 // AllowBoolConversions says that bool and non-bool AltiVec vectors
10123 // can be mixed, with the result being the non-bool type. The non-bool
10124 // operand must have integer element type.
10125 if (AllowBoolConversions && LHSVecType && RHSVecType &&
10
Assuming 'AllowBoolConversions' is false
11
Taking false branch
10126 LHSVecType->getNumElements() == RHSVecType->getNumElements() &&
10127 (Context.getTypeSize(LHSVecType->getElementType()) ==
10128 Context.getTypeSize(RHSVecType->getElementType()))) {
10129 if (LHSVecType->getVectorKind() == VectorType::AltiVecVector &&
10130 LHSVecType->getElementType()->isIntegerType() &&
10131 RHSVecType->getVectorKind() == VectorType::AltiVecBool) {
10132 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast);
10133 return LHSType;
10134 }
10135 if (!IsCompAssign &&
10136 LHSVecType->getVectorKind() == VectorType::AltiVecBool &&
10137 RHSVecType->getVectorKind() == VectorType::AltiVecVector &&
10138 RHSVecType->getElementType()->isIntegerType()) {
10139 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_BitCast);
10140 return RHSType;
10141 }
10142 }
10143
10144 // Expressions containing fixed-length and sizeless SVE vectors are invalid
10145 // since the ambiguity can affect the ABI.
10146 auto IsSveConversion = [](QualType FirstType, QualType SecondType) {
10147 const VectorType *VecType = SecondType->getAs<VectorType>();
13
Assuming the object is not a 'VectorType'
18
Assuming the object is not a 'VectorType'
10148 return FirstType->isSizelessBuiltinType() && VecType &&
14
Assuming the condition is false
15
Returning zero, which participates in a condition later
19
Assuming the condition is false
20
Returning zero, which participates in a condition later
10149 (VecType->getVectorKind() == VectorType::SveFixedLengthDataVector ||
10150 VecType->getVectorKind() ==
10151 VectorType::SveFixedLengthPredicateVector);
10152 };
10153
10154 if (IsSveConversion(LHSType, RHSType) || IsSveConversion(RHSType, LHSType)) {
12
Calling 'operator()'
16
Returning from 'operator()'
17
Calling 'operator()'
21
Returning from 'operator()'
22
Taking false branch
10155 Diag(Loc, diag::err_typecheck_sve_ambiguous) << LHSType << RHSType;
10156 return QualType();
10157 }
10158
10159 // Expressions containing GNU and SVE (fixed or sizeless) vectors are invalid
10160 // since the ambiguity can affect the ABI.
10161 auto IsSveGnuConversion = [](QualType FirstType, QualType SecondType) {
10162 const VectorType *FirstVecType = FirstType->getAs<VectorType>();
24
Assuming the object is a 'VectorType'
32
Assuming the object is a 'VectorType'
10163 const VectorType *SecondVecType = SecondType->getAs<VectorType>();
25
Assuming the object is a 'VectorType'
33
Assuming the object is a 'VectorType'
10164
10165 if (FirstVecType && SecondVecType)
26
Assuming 'FirstVecType' is non-null
27
Assuming 'SecondVecType' is non-null
34
Assuming 'FirstVecType' is non-null
35
Assuming 'SecondVecType' is non-null
10166 return FirstVecType->getVectorKind() == VectorType::GenericVector &&
28
Assuming the condition is false
29
Returning zero, which participates in a condition later
36
Assuming the condition is false
37
Returning zero, which participates in a condition later
10167 (SecondVecType->getVectorKind() ==
10168 VectorType::SveFixedLengthDataVector ||
10169 SecondVecType->getVectorKind() ==
10170 VectorType::SveFixedLengthPredicateVector);
10171
10172 return FirstType->isSizelessBuiltinType() && SecondVecType &&
10173 SecondVecType->getVectorKind() == VectorType::GenericVector;
10174 };
10175
10176 if (IsSveGnuConversion(LHSType, RHSType) ||
23
Calling 'operator()'
30
Returning from 'operator()'
39
Taking false branch
10177 IsSveGnuConversion(RHSType, LHSType)) {
31
Calling 'operator()'
38
Returning from 'operator()'
10178 Diag(Loc, diag::err_typecheck_sve_gnu_ambiguous) << LHSType << RHSType;
10179 return QualType();
10180 }
10181
10182 // If there's a vector type and a scalar, try to convert the scalar to
10183 // the vector element type and splat.
10184 unsigned DiagID = diag::err_typecheck_vector_not_convertable;
10185 if (!RHSVecType
39.1
'RHSVecType' is null
39.1
'RHSVecType' is null
39.1
'RHSVecType' is null
) {
40
Taking true branch
10186 if (isa<ExtVectorType>(LHSVecType)) {
41
Assuming 'LHSVecType' is not a 'ExtVectorType'
42
Taking false branch
10187 if (!tryVectorConvertAndSplat(*this, &RHS, RHSType,
10188 LHSVecType->getElementType(), LHSType,
10189 DiagID))
10190 return LHSType;
10191 } else {
10192 if (!tryGCCVectorConvertAndSplat(*this, &RHS, &LHS))
43
Calling 'tryGCCVectorConvertAndSplat'
58
Returning from 'tryGCCVectorConvertAndSplat'
59
Taking false branch
10193 return LHSType;
10194 }
10195 }
10196 if (!LHSVecType
59.1
'LHSVecType' is null
59.1
'LHSVecType' is null
59.1
'LHSVecType' is null
) {
60
Taking true branch
10197 if (isa<ExtVectorType>(RHSVecType)) {
61
Assuming 'RHSVecType' is not a 'ExtVectorType'
10198 if (!tryVectorConvertAndSplat(*this, (IsCompAssign ? nullptr : &LHS),
10199 LHSType, RHSVecType->getElementType(),
10200 RHSType, DiagID))
10201 return RHSType;
10202 } else {
10203 if (LHS.get()->isLValue() ||
62
Calling 'Expr::isLValue'
65
Returning from 'Expr::isLValue'
10204 !tryGCCVectorConvertAndSplat(*this, &LHS, &RHS))
66
Calling 'tryGCCVectorConvertAndSplat'
81
Returning from 'tryGCCVectorConvertAndSplat'
10205 return RHSType;
10206 }
10207 }
10208
10209 // FIXME: The code below also handles conversion between vectors and
10210 // non-scalars, we should break this down into fine grained specific checks
10211 // and emit proper diagnostics.
10212 QualType VecType = LHSVecType
82.1
'LHSVecType' is null
82.1
'LHSVecType' is null
82.1
'LHSVecType' is null
? LHSType : RHSType;
82
Taking false branch
83
'?' condition is false
10213 const VectorType *VT = LHSVecType
83.1
'LHSVecType' is null
83.1
'LHSVecType' is null
83.1
'LHSVecType' is null
? LHSVecType : RHSVecType;
84
'?' condition is false
85
'VT' initialized to a null pointer value
10214 QualType OtherType = LHSVecType
85.1
'LHSVecType' is null
85.1
'LHSVecType' is null
85.1
'LHSVecType' is null
? RHSType : LHSType;
86
'?' condition is false
10215 ExprResult *OtherExpr = LHSVecType
86.1
'LHSVecType' is null
86.1
'LHSVecType' is null
86.1
'LHSVecType' is null
? &RHS : &LHS;
87
'?' condition is false
10216 if (isLaxVectorConversion(OtherType, VecType)) {
88
Calling 'Sema::isLaxVectorConversion'
115
Returning from 'Sema::isLaxVectorConversion'
116
Taking true branch
10217 // If we're allowing lax vector conversions, only the total (data) size
10218 // needs to be the same. For non compound assignment, if one of the types is
10219 // scalar, the result is always the vector type.
10220 if (!IsCompAssign
116.1
'IsCompAssign' is true
116.1
'IsCompAssign' is true
116.1
'IsCompAssign' is true
) {
10221 *OtherExpr = ImpCastExprToType(OtherExpr->get(), VecType, CK_BitCast);
10222 return VecType;
10223 // In a compound assignment, lhs += rhs, 'lhs' is a lvalue src, forbidding
10224 // any implicit cast. Here, the 'rhs' should be implicit casted to 'lhs'
10225 // type. Note that this is already done by non-compound assignments in
10226 // CheckAssignmentConstraints. If it's a scalar type, only bitcast for
10227 // <1 x T> -> T. The result is also a vector type.
10228 } else if (OtherType->isExtVectorType() || OtherType->isVectorType() ||
117
Calling 'Type::isExtVectorType'
120
Returning from 'Type::isExtVectorType'
121
Calling 'Type::isVectorType'
124
Returning from 'Type::isVectorType'
10229 (OtherType->isScalarType() && VT->getNumElements() == 1)) {
125
Assuming the condition is true
126
Called C++ object pointer is null
10230 ExprResult *RHSExpr = &RHS;
10231 *RHSExpr = ImpCastExprToType(RHSExpr->get(), LHSType, CK_BitCast);
10232 return VecType;
10233 }
10234 }
10235
10236 // Okay, the expression is invalid.
10237
10238 // If there's a non-vector, non-real operand, diagnose that.
10239 if ((!RHSVecType && !RHSType->isRealType()) ||
10240 (!LHSVecType && !LHSType->isRealType())) {
10241 Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar)
10242 << LHSType << RHSType
10243 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
10244 return QualType();
10245 }
10246
10247 // OpenCL V1.1 6.2.6.p1:
10248 // If the operands are of more than one vector type, then an error shall
10249 // occur. Implicit conversions between vector types are not permitted, per
10250 // section 6.2.1.
10251 if (getLangOpts().OpenCL &&
10252 RHSVecType && isa<ExtVectorType>(RHSVecType) &&
10253 LHSVecType && isa<ExtVectorType>(LHSVecType)) {
10254 Diag(Loc, diag::err_opencl_implicit_vector_conversion) << LHSType
10255 << RHSType;
10256 return QualType();
10257 }
10258
10259
10260 // If there is a vector type that is not a ExtVector and a scalar, we reach
10261 // this point if scalar could not be converted to the vector's element type
10262 // without truncation.
10263 if ((RHSVecType && !isa<ExtVectorType>(RHSVecType)) ||
10264 (LHSVecType && !isa<ExtVectorType>(LHSVecType))) {
10265 QualType Scalar = LHSVecType ? RHSType : LHSType;
10266 QualType Vector = LHSVecType ? LHSType : RHSType;
10267 unsigned ScalarOrVector = LHSVecType && RHSVecType ? 1 : 0;
10268 Diag(Loc,
10269 diag::err_typecheck_vector_not_convertable_implict_truncation)
10270 << ScalarOrVector << Scalar << Vector;
10271
10272 return QualType();
10273 }
10274
10275 // Otherwise, use the generic diagnostic.
10276 Diag(Loc, DiagID)
10277 << LHSType << RHSType
10278 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
10279 return QualType();
10280}
10281
10282// checkArithmeticNull - Detect when a NULL constant is used improperly in an
10283// expression. These are mainly cases where the null pointer is used as an
10284// integer instead of a pointer.
10285static void checkArithmeticNull(Sema &S, ExprResult &LHS, ExprResult &RHS,
10286 SourceLocation Loc, bool IsCompare) {
10287 // The canonical way to check for a GNU null is with isNullPointerConstant,
10288 // but we use a bit of a hack here for speed; this is a relatively
10289 // hot path, and isNullPointerConstant is slow.
10290 bool LHSNull = isa<GNUNullExpr>(LHS.get()->IgnoreParenImpCasts());
10291 bool RHSNull = isa<GNUNullExpr>(RHS.get()->IgnoreParenImpCasts());
10292
10293 QualType NonNullType = LHSNull ? RHS.get()->getType() : LHS.get()->getType();
10294
10295 // Avoid analyzing cases where the result will either be invalid (and
10296 // diagnosed as such) or entirely valid and not something to warn about.
10297 if ((!LHSNull && !RHSNull) || NonNullType->isBlockPointerType() ||
10298 NonNullType->isMemberPointerType() || NonNullType->isFunctionType())
10299 return;
10300
10301 // Comparison operations would not make sense with a null pointer no matter
10302 // what the other expression is.
10303 if (!IsCompare) {
10304 S.Diag(Loc, diag::warn_null_in_arithmetic_operation)
10305 << (LHSNull ? LHS.get()->getSourceRange() : SourceRange())
10306 << (RHSNull ? RHS.get()->getSourceRange() : SourceRange());
10307 return;
10308 }
10309
10310 // The rest of the operations only make sense with a null pointer
10311 // if the other expression is a pointer.
10312 if (LHSNull == RHSNull || NonNullType->isAnyPointerType() ||
10313 NonNullType->canDecayToPointerType())
10314 return;
10315
10316 S.Diag(Loc, diag::warn_null_in_comparison_operation)
10317 << LHSNull /* LHS is NULL */ << NonNullType
10318 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
10319}
10320
10321static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS,
10322 SourceLocation Loc) {
10323 const auto *LUE = dyn_cast<UnaryExprOrTypeTraitExpr>(LHS);
10324 const auto *RUE = dyn_cast<UnaryExprOrTypeTraitExpr>(RHS);
10325 if (!LUE || !RUE)
10326 return;
10327 if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() ||
10328 RUE->getKind() != UETT_SizeOf)
10329 return;
10330
10331 const Expr *LHSArg = LUE->getArgumentExpr()->IgnoreParens();
10332 QualType LHSTy = LHSArg->getType();
10333 QualType RHSTy;
10334
10335 if (RUE->isArgumentType())
10336 RHSTy = RUE->getArgumentType().getNonReferenceType();
10337 else
10338 RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType();
10339
10340 if (LHSTy->isPointerType() && !RHSTy->isPointerType()) {
10341 if (!S.Context.hasSameUnqualifiedType(LHSTy->getPointeeType(), RHSTy))
10342 return;
10343
10344 S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS << LHS->getSourceRange();
10345 if (const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10346 if (const ValueDecl *LHSArgDecl = DRE->getDecl())
10347 S.Diag(LHSArgDecl->getLocation(), diag::note_pointer_declared_here)
10348 << LHSArgDecl;
10349 }
10350 } else if (const auto *ArrayTy = S.Context.getAsArrayType(LHSTy)) {
10351 QualType ArrayElemTy = ArrayTy->getElementType();
10352 if (ArrayElemTy != S.Context.getBaseElementType(ArrayTy) ||
10353 ArrayElemTy->isDependentType() || RHSTy->isDependentType() ||
10354 RHSTy->isReferenceType() || ArrayElemTy->isCharType() ||
10355 S.Context.getTypeSize(ArrayElemTy) == S.Context.getTypeSize(RHSTy))
10356 return;
10357 S.Diag(Loc, diag::warn_division_sizeof_array)
10358 << LHSArg->getSourceRange() << ArrayElemTy << RHSTy;
10359 if (const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {
10360 if (const ValueDecl *LHSArgDecl = DRE->getDecl())
10361 S.Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here)
10362 << LHSArgDecl;
10363 }
10364
10365 S.Diag(Loc, diag::note_precedence_silence) << RHS;
10366 }
10367}
10368
10369static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS,
10370 ExprResult &RHS,
10371 SourceLocation Loc, bool IsDiv) {
10372 // Check for division/remainder by zero.
10373 Expr::EvalResult RHSValue;
10374 if (!RHS.get()->isValueDependent() &&
10375 RHS.get()->EvaluateAsInt(RHSValue, S.Context) &&
10376 RHSValue.Val.getInt() == 0)
10377 S.DiagRuntimeBehavior(Loc, RHS.get(),
10378 S.PDiag(diag::warn_remainder_division_by_zero)
10379 << IsDiv << RHS.get()->getSourceRange());
10380}
10381
10382QualType Sema::CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS,
10383 SourceLocation Loc,
10384 bool IsCompAssign, bool IsDiv) {
10385 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
10386
10387 QualType LHSTy = LHS.get()->getType();
10388 QualType RHSTy = RHS.get()->getType();
10389 if (LHSTy->isVectorType() || RHSTy->isVectorType())
10390 return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign,
10391 /*AllowBothBool*/getLangOpts().AltiVec,
10392 /*AllowBoolConversions*/false);
10393 if (!IsDiv &&
10394 (LHSTy->isConstantMatrixType() || RHSTy->isConstantMatrixType()))
10395 return CheckMatrixMultiplyOperands(LHS, RHS, Loc, IsCompAssign);
10396 // For division, only matrix-by-scalar is supported. Other combinations with
10397 // matrix types are invalid.
10398 if (IsDiv && LHSTy->isConstantMatrixType() && RHSTy->isArithmeticType())
10399 return CheckMatrixElementwiseOperands(LHS, RHS, Loc, IsCompAssign);
10400
10401 QualType compType = UsualArithmeticConversions(
10402 LHS, RHS, Loc, IsCompAssign ? ACK_CompAssign : ACK_Arithmetic);
10403 if (LHS.isInvalid() || RHS.isInvalid())
10404 return QualType();
10405
10406
10407 if (compType.isNull() || !compType->isArithmeticType())
10408 return InvalidOperands(Loc, LHS, RHS);
10409 if (IsDiv) {
10410 DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv);
10411 DiagnoseDivisionSizeofPointerOrArray(*this, LHS.get(), RHS.get(), Loc);
10412 }
10413 return compType;
10414}
10415
10416QualType Sema::CheckRemainderOperands(
10417 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {
10418 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
10419
10420 if (LHS.get()->getType()->isVectorType() ||
10421 RHS.get()->getType()->isVectorType()) {
10422 if (LHS.get()->getType()->hasIntegerRepresentation() &&
10423 RHS.get()->getType()->hasIntegerRepresentation())
10424 return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign,
10425 /*AllowBothBool*/getLangOpts().AltiVec,
10426 /*AllowBoolConversions*/false);
10427 return InvalidOperands(Loc, LHS, RHS);
10428 }
10429
10430 QualType compType = UsualArithmeticConversions(
10431 LHS, RHS, Loc, IsCompAssign ? ACK_CompAssign : ACK_Arithmetic);
10432 if (LHS.isInvalid() || RHS.isInvalid())
10433 return QualType();
10434
10435 if (compType.isNull() || !compType->isIntegerType())
10436 return InvalidOperands(Loc, LHS, RHS);
10437 DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, false /* IsDiv */);
10438 return compType;
10439}
10440
10441/// Diagnose invalid arithmetic on two void pointers.
10442static void diagnoseArithmeticOnTwoVoidPointers(Sema &S, SourceLocation Loc,
10443 Expr *LHSExpr, Expr *RHSExpr) {
10444 S.Diag(Loc, S.getLangOpts().CPlusPlus
10445 ? diag::err_typecheck_pointer_arith_void_type
10446 : diag::ext_gnu_void_ptr)
10447 << 1 /* two pointers */ << LHSExpr->getSourceRange()
10448 << RHSExpr->getSourceRange();
10449}
10450
10451/// Diagnose invalid arithmetic on a void pointer.
10452static void diagnoseArithmeticOnVoidPointer(Sema &S, SourceLocation Loc,
10453 Expr *Pointer) {
10454 S.Diag(Loc, S.getLangOpts().CPlusPlus
10455 ? diag::err_typecheck_pointer_arith_void_type
10456 : diag::ext_gnu_void_ptr)
10457 << 0 /* one pointer */ << Pointer->getSourceRange();
10458}
10459
10460/// Diagnose invalid arithmetic on a null pointer.
10461///
10462/// If \p IsGNUIdiom is true, the operation is using the 'p = (i8*)nullptr + n'
10463/// idiom, which we recognize as a GNU extension.
10464///
10465static void diagnoseArithmeticOnNullPointer(Sema &S, SourceLocation Loc,
10466 Expr *Pointer, bool IsGNUIdiom) {
10467 if (IsGNUIdiom)
10468 S.Diag(Loc, diag::warn_gnu_null_ptr_arith)
10469 << Pointer->getSourceRange();
10470 else
10471 S.Diag(Loc, diag::warn_pointer_arith_null_ptr)
10472 << S.getLangOpts().CPlusPlus << Pointer->getSourceRange();
10473}
10474
10475/// Diagnose invalid subraction on a null pointer.
10476///
10477static void diagnoseSubtractionOnNullPointer(Sema &S, SourceLocation Loc,
10478 Expr *Pointer, bool BothNull) {
10479 // Null - null is valid in C++ [expr.add]p7
10480 if (BothNull && S.getLangOpts().CPlusPlus)
10481 return;
10482
10483 // Is this s a macro from a system header?
10484 if (S.Diags.getSuppressSystemWarnings() && S.SourceMgr.isInSystemMacro(Loc))
10485 return;
10486
10487 S.Diag(Loc, diag::warn_pointer_sub_null_ptr)
10488 << S.getLangOpts().CPlusPlus << Pointer->getSourceRange();
10489}
10490
10491/// Diagnose invalid arithmetic on two function pointers.
10492static void diagnoseArithmeticOnTwoFunctionPointers(Sema &S, SourceLocation Loc,
10493 Expr *LHS, Expr *RHS) {
10494 assert(LHS->getType()->isAnyPointerType())(static_cast<void> (0));
10495 assert(RHS->getType()->isAnyPointerType())(static_cast<void> (0));
10496 S.Diag(Loc, S.getLangOpts().CPlusPlus
10497 ? diag::err_typecheck_pointer_arith_function_type
10498 : diag::ext_gnu_ptr_func_arith)
10499 << 1 /* two pointers */ << LHS->getType()->getPointeeType()
10500 // We only show the second type if it differs from the first.
10501 << (unsigned)!S.Context.hasSameUnqualifiedType(LHS->getType(),
10502 RHS->getType())
10503 << RHS->getType()->getPointeeType()
10504 << LHS->getSourceRange() << RHS->getSourceRange();
10505}
10506
10507/// Diagnose invalid arithmetic on a function pointer.
10508static void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc,
10509 Expr *Pointer) {
10510 assert(Pointer->getType()->isAnyPointerType())(static_cast<void> (0));
10511 S.Diag(Loc, S.getLangOpts().CPlusPlus
10512 ? diag::err_typecheck_pointer_arith_function_type
10513 : diag::ext_gnu_ptr_func_arith)
10514 << 0 /* one pointer */ << Pointer->getType()->getPointeeType()
10515 << 0 /* one pointer, so only one type */
10516 << Pointer->getSourceRange();
10517}
10518
10519/// Emit error if Operand is incomplete pointer type
10520///
10521/// \returns True if pointer has incomplete type
10522static bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc,
10523 Expr *Operand) {
10524 QualType ResType = Operand->getType();
10525 if (const AtomicType *ResAtomicType = ResType->getAs<AtomicType>())
10526 ResType = ResAtomicType->getValueType();
10527
10528 assert(ResType->isAnyPointerType() && !ResType->isDependentType())(static_cast<void> (0));
10529 QualType PointeeTy = ResType->getPointeeType();
10530 return S.RequireCompleteSizedType(
10531 Loc, PointeeTy,
10532 diag::err_typecheck_arithmetic_incomplete_or_sizeless_type,
10533 Operand->getSourceRange());
10534}
10535
10536/// Check the validity of an arithmetic pointer operand.
10537///
10538/// If the operand has pointer type, this code will check for pointer types
10539/// which are invalid in arithmetic operations. These will be diagnosed
10540/// appropriately, including whether or not the use is supported as an
10541/// extension.
10542///
10543/// \returns True when the operand is valid to use (even if as an extension).
10544static bool checkArithmeticOpPointerOperand(Sema &S, SourceLocation Loc,
10545 Expr *Operand) {
10546 QualType ResType = Operand->getType();
10547 if (const AtomicType *ResAtomicType = ResType->getAs<AtomicType>())
10548 ResType = ResAtomicType->getValueType();
10549
10550 if (!ResType->isAnyPointerType()) return true;
10551
10552 QualType PointeeTy = ResType->getPointeeType();
10553 if (PointeeTy->isVoidType()) {
10554 diagnoseArithmeticOnVoidPointer(S, Loc, Operand);
10555 return !S.getLangOpts().CPlusPlus;
10556 }
10557 if (PointeeTy->isFunctionType()) {
10558 diagnoseArithmeticOnFunctionPointer(S, Loc, Operand);
10559 return !S.getLangOpts().CPlusPlus;
10560 }
10561
10562 if (checkArithmeticIncompletePointerType(S, Loc, Operand)) return false;
10563
10564 return true;
10565}
10566
10567/// Check the validity of a binary arithmetic operation w.r.t. pointer
10568/// operands.
10569///
10570/// This routine will diagnose any invalid arithmetic on pointer operands much
10571/// like \see checkArithmeticOpPointerOperand. However, it has special logic
10572/// for emitting a single diagnostic even for operations where both LHS and RHS
10573/// are (potentially problematic) pointers.
10574///
10575/// \returns True when the operand is valid to use (even if as an extension).
10576static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc,
10577 Expr *LHSExpr, Expr *RHSExpr) {
10578 bool isLHSPointer = LHSExpr->getType()->isAnyPointerType();
10579 bool isRHSPointer = RHSExpr->getType()->isAnyPointerType();
10580 if (!isLHSPointer && !isRHSPointer) return true;
10581
10582 QualType LHSPointeeTy, RHSPointeeTy;
10583 if (isLHSPointer) LHSPointeeTy = LHSExpr->getType()->getPointeeType();
10584 if (isRHSPointer) RHSPointeeTy = RHSExpr->getType()->getPointeeType();
10585
10586 // if both are pointers check if operation is valid wrt address spaces
10587 if (isLHSPointer && isRHSPointer) {
10588 if (!LHSPointeeTy.isAddressSpaceOverlapping(RHSPointeeTy)) {
10589 S.Diag(Loc,
10590 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
10591 << LHSExpr->getType() << RHSExpr->getType() << 1 /*arithmetic op*/
10592 << LHSExpr->getSourceRange() << RHSExpr->getSourceRange();
10593 return false;
10594 }
10595 }
10596
10597 // Check for arithmetic on pointers to incomplete types.
10598 bool isLHSVoidPtr = isLHSPointer && LHSPointeeTy->isVoidType();
10599 bool isRHSVoidPtr = isRHSPointer && RHSPointeeTy->isVoidType();
10600 if (isLHSVoidPtr || isRHSVoidPtr) {
10601 if (!isRHSVoidPtr) diagnoseArithmeticOnVoidPointer(S, Loc, LHSExpr);
10602 else if (!isLHSVoidPtr) diagnoseArithmeticOnVoidPointer(S, Loc, RHSExpr);
10603 else diagnoseArithmeticOnTwoVoidPointers(S, Loc, LHSExpr, RHSExpr);
10604
10605 return !S.getLangOpts().CPlusPlus;
10606 }
10607
10608 bool isLHSFuncPtr = isLHSPointer && LHSPointeeTy->isFunctionType();
10609 bool isRHSFuncPtr = isRHSPointer && RHSPointeeTy->isFunctionType();
10610 if (isLHSFuncPtr || isRHSFuncPtr) {
10611 if (!isRHSFuncPtr) diagnoseArithmeticOnFunctionPointer(S, Loc, LHSExpr);
10612 else if (!isLHSFuncPtr) diagnoseArithmeticOnFunctionPointer(S, Loc,
10613 RHSExpr);
10614 else diagnoseArithmeticOnTwoFunctionPointers(S, Loc, LHSExpr, RHSExpr);
10615
10616 return !S.getLangOpts().CPlusPlus;
10617 }
10618
10619 if (isLHSPointer && checkArithmeticIncompletePointerType(S, Loc, LHSExpr))
10620 return false;
10621 if (isRHSPointer && checkArithmeticIncompletePointerType(S, Loc, RHSExpr))
10622 return false;
10623
10624 return true;
10625}
10626
10627/// diagnoseStringPlusInt - Emit a warning when adding an integer to a string
10628/// literal.
10629static void diagnoseStringPlusInt(Sema &Self, SourceLocation OpLoc,
10630 Expr *LHSExpr, Expr *RHSExpr) {
10631 StringLiteral* StrExpr = dyn_cast<StringLiteral>(LHSExpr->IgnoreImpCasts());
10632 Expr* IndexExpr = RHSExpr;
10633 if (!StrExpr) {
10634 StrExpr = dyn_cast<StringLiteral>(RHSExpr->IgnoreImpCasts());
10635 IndexExpr = LHSExpr;
10636 }
10637
10638 bool IsStringPlusInt = StrExpr &&
10639 IndexExpr->getType()->isIntegralOrUnscopedEnumerationType();
10640 if (!IsStringPlusInt || IndexExpr->isValueDependent())
10641 return;
10642
10643 SourceRange DiagRange(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
10644 Self.Diag(OpLoc, diag::warn_string_plus_int)
10645 << DiagRange << IndexExpr->IgnoreImpCasts()->getType();
10646
10647 // Only print a fixit for "str" + int, not for int + "str".
10648 if (IndexExpr == RHSExpr) {
10649 SourceLocation EndLoc = Self.getLocForEndOfToken(RHSExpr->getEndLoc());
10650 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10651 << FixItHint::CreateInsertion(LHSExpr->getBeginLoc(), "&")
10652 << FixItHint::CreateReplacement(SourceRange(OpLoc), "[")
10653 << FixItHint::CreateInsertion(EndLoc, "]");
10654 } else
10655 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10656}
10657
10658/// Emit a warning when adding a char literal to a string.
10659static void diagnoseStringPlusChar(Sema &Self, SourceLocation OpLoc,
10660 Expr *LHSExpr, Expr *RHSExpr) {
10661 const Expr *StringRefExpr = LHSExpr;
10662 const CharacterLiteral *CharExpr =
10663 dyn_cast<CharacterLiteral>(RHSExpr->IgnoreImpCasts());
10664
10665 if (!CharExpr) {
10666 CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->IgnoreImpCasts());
10667 StringRefExpr = RHSExpr;
10668 }
10669
10670 if (!CharExpr || !StringRefExpr)
10671 return;
10672
10673 const QualType StringType = StringRefExpr->getType();
10674
10675 // Return if not a PointerType.
10676 if (!StringType->isAnyPointerType())
10677 return;
10678
10679 // Return if not a CharacterType.
10680 if (!StringType->getPointeeType()->isAnyCharacterType())
10681 return;
10682
10683 ASTContext &Ctx = Self.getASTContext();
10684 SourceRange DiagRange(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
10685
10686 const QualType CharType = CharExpr->getType();
10687 if (!CharType->isAnyCharacterType() &&
10688 CharType->isIntegerType() &&
10689 llvm::isUIntN(Ctx.getCharWidth(), CharExpr->getValue())) {
10690 Self.Diag(OpLoc, diag::warn_string_plus_char)
10691 << DiagRange << Ctx.CharTy;
10692 } else {
10693 Self.Diag(OpLoc, diag::warn_string_plus_char)
10694 << DiagRange << CharExpr->getType();
10695 }
10696
10697 // Only print a fixit for str + char, not for char + str.
10698 if (isa<CharacterLiteral>(RHSExpr->IgnoreImpCasts())) {
10699 SourceLocation EndLoc = Self.getLocForEndOfToken(RHSExpr->getEndLoc());
10700 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence)
10701 << FixItHint::CreateInsertion(LHSExpr->getBeginLoc(), "&")
10702 << FixItHint::CreateReplacement(SourceRange(OpLoc), "[")
10703 << FixItHint::CreateInsertion(EndLoc, "]");
10704 } else {
10705 Self.Diag(OpLoc, diag::note_string_plus_scalar_silence);
10706 }
10707}
10708
10709/// Emit error when two pointers are incompatible.
10710static void diagnosePointerIncompatibility(Sema &S, SourceLocation Loc,
10711 Expr *LHSExpr, Expr *RHSExpr) {
10712 assert(LHSExpr->getType()->isAnyPointerType())(static_cast<void> (0));
10713 assert(RHSExpr->getType()->isAnyPointerType())(static_cast<void> (0));
10714 S.Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
10715 << LHSExpr->getType() << RHSExpr->getType() << LHSExpr->getSourceRange()
10716 << RHSExpr->getSourceRange();
10717}
10718
10719// C99 6.5.6
10720QualType Sema::CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS,
10721 SourceLocation Loc, BinaryOperatorKind Opc,
10722 QualType* CompLHSTy) {
10723 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
10724
10725 if (LHS.get()->getType()->isVectorType() ||
10726 RHS.get()->getType()->isVectorType()) {
10727 QualType compType = CheckVectorOperands(
10728 LHS, RHS, Loc, CompLHSTy,
10729 /*AllowBothBool*/getLangOpts().AltiVec,
10730 /*AllowBoolConversions*/getLangOpts().ZVector);
10731 if (CompLHSTy) *CompLHSTy = compType;
10732 return compType;
10733 }
10734
10735 if (LHS.get()->getType()->isConstantMatrixType() ||
10736 RHS.get()->getType()->isConstantMatrixType()) {
10737 QualType compType =
10738 CheckMatrixElementwiseOperands(LHS, RHS, Loc, CompLHSTy);
10739 if (CompLHSTy)
10740 *CompLHSTy = compType;
10741 return compType;
10742 }
10743
10744 QualType compType = UsualArithmeticConversions(
10745 LHS, RHS, Loc, CompLHSTy ? ACK_CompAssign : ACK_Arithmetic);
10746 if (LHS.isInvalid() || RHS.isInvalid())
10747 return QualType();
10748
10749 // Diagnose "string literal" '+' int and string '+' "char literal".
10750 if (Opc == BO_Add) {
10751 diagnoseStringPlusInt(*this, Loc, LHS.get(), RHS.get());
10752 diagnoseStringPlusChar(*this, Loc, LHS.get(), RHS.get());
10753 }
10754
10755 // handle the common case first (both operands are arithmetic).
10756 if (!compType.isNull() && compType->isArithmeticType()) {
10757 if (CompLHSTy) *CompLHSTy = compType;
10758 return compType;
10759 }
10760
10761 // Type-checking. Ultimately the pointer's going to be in PExp;
10762 // note that we bias towards the LHS being the pointer.
10763 Expr *PExp = LHS.get(), *IExp = RHS.get();
10764
10765 bool isObjCPointer;
10766 if (PExp->getType()->isPointerType()) {
10767 isObjCPointer = false;
10768 } else if (PExp->getType()->isObjCObjectPointerType()) {
10769 isObjCPointer = true;
10770 } else {
10771 std::swap(PExp, IExp);
10772 if (PExp->getType()->isPointerType()) {
10773 isObjCPointer = false;
10774 } else if (PExp->getType()->isObjCObjectPointerType()) {
10775 isObjCPointer = true;
10776 } else {
10777 return InvalidOperands(Loc, LHS, RHS);
10778 }
10779 }
10780 assert(PExp->getType()->isAnyPointerType())(static_cast<void> (0));
10781
10782 if (!IExp->getType()->isIntegerType())
10783 return InvalidOperands(Loc, LHS, RHS);
10784
10785 // Adding to a null pointer results in undefined behavior.
10786 if (PExp->IgnoreParenCasts()->isNullPointerConstant(
10787 Context, Expr::NPC_ValueDependentIsNotNull)) {
10788 // In C++ adding zero to a null pointer is defined.
10789 Expr::EvalResult KnownVal;
10790 if (!getLangOpts().CPlusPlus ||
10791 (!IExp->isValueDependent() &&
10792 (!IExp->EvaluateAsInt(KnownVal, Context) ||
10793 KnownVal.Val.getInt() != 0))) {
10794 // Check the conditions to see if this is the 'p = nullptr + n' idiom.
10795 bool IsGNUIdiom = BinaryOperator::isNullPointerArithmeticExtension(
10796 Context, BO_Add, PExp, IExp);
10797 diagnoseArithmeticOnNullPointer(*this, Loc, PExp, IsGNUIdiom);
10798 }
10799 }
10800
10801 if (!checkArithmeticOpPointerOperand(*this, Loc, PExp))
10802 return QualType();
10803
10804 if (isObjCPointer && checkArithmeticOnObjCPointer(*this, Loc, PExp))
10805 return QualType();
10806
10807 // Check array bounds for pointer arithemtic
10808 CheckArrayAccess(PExp, IExp);
10809
10810 if (CompLHSTy) {
10811 QualType LHSTy = Context.isPromotableBitField(LHS.get());
10812 if (LHSTy.isNull()) {
10813 LHSTy = LHS.get()->getType();
10814 if (LHSTy->isPromotableIntegerType())
10815 LHSTy = Context.getPromotedIntegerType(LHSTy);
10816 }
10817 *CompLHSTy = LHSTy;
10818 }
10819
10820 return PExp->getType();
10821}
10822
10823// C99 6.5.6
10824QualType Sema::CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS,
10825 SourceLocation Loc,
10826 QualType* CompLHSTy) {
10827 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
10828
10829 if (LHS.get()->getType()->isVectorType() ||
10830 RHS.get()->getType()->isVectorType()) {
10831 QualType compType = CheckVectorOperands(
10832 LHS, RHS, Loc, CompLHSTy,
10833 /*AllowBothBool*/getLangOpts().AltiVec,
10834 /*AllowBoolConversions*/getLangOpts().ZVector);
10835 if (CompLHSTy) *CompLHSTy = compType;
10836 return compType;
10837 }
10838
10839 if (LHS.get()->getType()->isConstantMatrixType() ||
10840 RHS.get()->getType()->isConstantMatrixType()) {
10841 QualType compType =
10842 CheckMatrixElementwiseOperands(LHS, RHS, Loc, CompLHSTy);
10843 if (CompLHSTy)
10844 *CompLHSTy = compType;
10845 return compType;
10846 }
10847
10848 QualType compType = UsualArithmeticConversions(
10849 LHS, RHS, Loc, CompLHSTy ? ACK_CompAssign : ACK_Arithmetic);
10850 if (LHS.isInvalid() || RHS.isInvalid())
10851 return QualType();
10852
10853 // Enforce type constraints: C99 6.5.6p3.
10854
10855 // Handle the common case first (both operands are arithmetic).
10856 if (!compType.isNull() && compType->isArithmeticType()) {
10857 if (CompLHSTy) *CompLHSTy = compType;
10858 return compType;
10859 }
10860
10861 // Either ptr - int or ptr - ptr.
10862 if (LHS.get()->getType()->isAnyPointerType()) {
10863 QualType lpointee = LHS.get()->getType()->getPointeeType();
10864
10865 // Diagnose bad cases where we step over interface counts.
10866 if (LHS.get()->getType()->isObjCObjectPointerType() &&
10867 checkArithmeticOnObjCPointer(*this, Loc, LHS.get()))
10868 return QualType();
10869
10870 // The result type of a pointer-int computation is the pointer type.
10871 if (RHS.get()->getType()->isIntegerType()) {
10872 // Subtracting from a null pointer should produce a warning.
10873 // The last argument to the diagnose call says this doesn't match the
10874 // GNU int-to-pointer idiom.
10875 if (LHS.get()->IgnoreParenCasts()->isNullPointerConstant(Context,
10876 Expr::NPC_ValueDependentIsNotNull)) {
10877 // In C++ adding zero to a null pointer is defined.
10878 Expr::EvalResult KnownVal;
10879 if (!getLangOpts().CPlusPlus ||
10880 (!RHS.get()->isValueDependent() &&
10881 (!RHS.get()->EvaluateAsInt(KnownVal, Context) ||
10882 KnownVal.Val.getInt() != 0))) {
10883 diagnoseArithmeticOnNullPointer(*this, Loc, LHS.get(), false);
10884 }
10885 }
10886
10887 if (!checkArithmeticOpPointerOperand(*this, Loc, LHS.get()))
10888 return QualType();
10889
10890 // Check array bounds for pointer arithemtic
10891 CheckArrayAccess(LHS.get(), RHS.get(), /*ArraySubscriptExpr*/nullptr,
10892 /*AllowOnePastEnd*/true, /*IndexNegated*/true);
10893
10894 if (CompLHSTy) *CompLHSTy = LHS.get()->getType();
10895 return LHS.get()->getType();
10896 }
10897
10898 // Handle pointer-pointer subtractions.
10899 if (const PointerType *RHSPTy
10900 = RHS.get()->getType()->getAs<PointerType>()) {
10901 QualType rpointee = RHSPTy->getPointeeType();
10902
10903 if (getLangOpts().CPlusPlus) {
10904 // Pointee types must be the same: C++ [expr.add]
10905 if (!Context.hasSameUnqualifiedType(lpointee, rpointee)) {
10906 diagnosePointerIncompatibility(*this, Loc, LHS.get(), RHS.get());
10907 }
10908 } else {
10909 // Pointee types must be compatible C99 6.5.6p3
10910 if (!Context.typesAreCompatible(
10911 Context.getCanonicalType(lpointee).getUnqualifiedType(),
10912 Context.getCanonicalType(rpointee).getUnqualifiedType())) {
10913 diagnosePointerIncompatibility(*this, Loc, LHS.get(), RHS.get());
10914 return QualType();
10915 }
10916 }
10917
10918 if (!checkArithmeticBinOpPointerOperands(*this, Loc,
10919 LHS.get(), RHS.get()))
10920 return QualType();
10921
10922 bool LHSIsNullPtr = LHS.get()->IgnoreParenCasts()->isNullPointerConstant(
10923 Context, Expr::NPC_ValueDependentIsNotNull);
10924 bool RHSIsNullPtr = RHS.get()->IgnoreParenCasts()->isNullPointerConstant(
10925 Context, Expr::NPC_ValueDependentIsNotNull);
10926
10927 // Subtracting nullptr or from nullptr is suspect
10928 if (LHSIsNullPtr)
10929 diagnoseSubtractionOnNullPointer(*this, Loc, LHS.get(), RHSIsNullPtr);
10930 if (RHSIsNullPtr)
10931 diagnoseSubtractionOnNullPointer(*this, Loc, RHS.get(), LHSIsNullPtr);
10932
10933 // The pointee type may have zero size. As an extension, a structure or
10934 // union may have zero size or an array may have zero length. In this
10935 // case subtraction does not make sense.
10936 if (!rpointee->isVoidType() && !rpointee->isFunctionType()) {
10937 CharUnits ElementSize = Context.getTypeSizeInChars(rpointee);
10938 if (ElementSize.isZero()) {
10939 Diag(Loc,diag::warn_sub_ptr_zero_size_types)
10940 << rpointee.getUnqualifiedType()
10941 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
10942 }
10943 }
10944
10945 if (CompLHSTy) *CompLHSTy = LHS.get()->getType();
10946 return Context.getPointerDiffType();
10947 }
10948 }
10949
10950 return InvalidOperands(Loc, LHS, RHS);
10951}
10952
10953static bool isScopedEnumerationType(QualType T) {
10954 if (const EnumType *ET = T->getAs<EnumType>())
10955 return ET->getDecl()->isScoped();
10956 return false;
10957}
10958
10959static void DiagnoseBadShiftValues(Sema& S, ExprResult &LHS, ExprResult &RHS,
10960 SourceLocation Loc, BinaryOperatorKind Opc,
10961 QualType LHSType) {
10962 // OpenCL 6.3j: shift values are effectively % word size of LHS (more defined),
10963 // so skip remaining warnings as we don't want to modify values within Sema.
10964 if (S.getLangOpts().OpenCL)
10965 return;
10966
10967 // Check right/shifter operand
10968 Expr::EvalResult RHSResult;
10969 if (RHS.get()->isValueDependent() ||
10970 !RHS.get()->EvaluateAsInt(RHSResult, S.Context))
10971 return;
10972 llvm::APSInt Right = RHSResult.Val.getInt();
10973
10974 if (Right.isNegative()) {
10975 S.DiagRuntimeBehavior(Loc, RHS.get(),
10976 S.PDiag(diag::warn_shift_negative)
10977 << RHS.get()->getSourceRange());
10978 return;
10979 }
10980
10981 QualType LHSExprType = LHS.get()->getType();
10982 uint64_t LeftSize = S.Context.getTypeSize(LHSExprType);
10983 if (LHSExprType->isExtIntType())
10984 LeftSize = S.Context.getIntWidth(LHSExprType);
10985 else if (LHSExprType->isFixedPointType()) {
10986 auto FXSema = S.Context.getFixedPointSemantics(LHSExprType);
10987 LeftSize = FXSema.getWidth() - (unsigned)FXSema.hasUnsignedPadding();
10988 }
10989 llvm::APInt LeftBits(Right.getBitWidth(), LeftSize);
10990 if (Right.uge(LeftBits)) {
10991 S.DiagRuntimeBehavior(Loc, RHS.get(),
10992 S.PDiag(diag::warn_shift_gt_typewidth)
10993 << RHS.get()->getSourceRange());
10994 return;
10995 }
10996
10997 // FIXME: We probably need to handle fixed point types specially here.
10998 if (Opc != BO_Shl || LHSExprType->isFixedPointType())
10999 return;
11000
11001 // When left shifting an ICE which is signed, we can check for overflow which
11002 // according to C++ standards prior to C++2a has undefined behavior
11003 // ([expr.shift] 5.8/2). Unsigned integers have defined behavior modulo one
11004 // more than the maximum value representable in the result type, so never
11005 // warn for those. (FIXME: Unsigned left-shift overflow in a constant
11006 // expression is still probably a bug.)
11007 Expr::EvalResult LHSResult;
11008 if (LHS.get()->isValueDependent() ||
11009 LHSType->hasUnsignedIntegerRepresentation() ||
11010 !LHS.get()->EvaluateAsInt(LHSResult, S.Context))
11011 return;
11012 llvm::APSInt Left = LHSResult.Val.getInt();
11013
11014 // If LHS does not have a signed type and non-negative value
11015 // then, the behavior is undefined before C++2a. Warn about it.
11016 if (Left.isNegative() && !S.getLangOpts().isSignedOverflowDefined() &&
11017 !S.getLangOpts().CPlusPlus20) {
11018 S.DiagRuntimeBehavior(Loc, LHS.get(),
11019 S.PDiag(diag::warn_shift_lhs_negative)
11020 << LHS.get()->getSourceRange());
11021 return;
11022 }
11023
11024 llvm::APInt ResultBits =
11025 static_cast<llvm::APInt&>(Right) + Left.getMinSignedBits();
11026 if (LeftBits.uge(ResultBits))
11027 return;
11028 llvm::APSInt Result = Left.extend(ResultBits.getLimitedValue());
11029 Result = Result.shl(Right);
11030
11031 // Print the bit representation of the signed integer as an unsigned
11032 // hexadecimal number.
11033 SmallString<40> HexResult;
11034 Result.toString(HexResult, 16, /*Signed =*/false, /*Literal =*/true);
11035
11036 // If we are only missing a sign bit, this is less likely to result in actual
11037 // bugs -- if the result is cast back to an unsigned type, it will have the
11038 // expected value. Thus we place this behind a different warning that can be
11039 // turned off separately if needed.
11040 if (LeftBits == ResultBits - 1) {
11041 S.Diag(Loc, diag::warn_shift_result_sets_sign_bit)
11042 << HexResult << LHSType
11043 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11044 return;
11045 }
11046
11047 S.Diag(Loc, diag::warn_shift_result_gt_typewidth)
11048 << HexResult.str() << Result.getMinSignedBits() << LHSType
11049 << Left.getBitWidth() << LHS.get()->getSourceRange()
11050 << RHS.get()->getSourceRange();
11051}
11052
11053/// Return the resulting type when a vector is shifted
11054/// by a scalar or vector shift amount.
11055static QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS,
11056 SourceLocation Loc, bool IsCompAssign) {
11057 // OpenCL v1.1 s6.3.j says RHS can be a vector only if LHS is a vector.
11058 if ((S.LangOpts.OpenCL || S.LangOpts.ZVector) &&
11059 !LHS.get()->getType()->isVectorType()) {
11060 S.Diag(Loc, diag::err_shift_rhs_only_vector)
11061 << RHS.get()->getType() << LHS.get()->getType()
11062 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11063 return QualType();
11064 }
11065
11066 if (!IsCompAssign) {
11067 LHS = S.UsualUnaryConversions(LHS.get());
11068 if (LHS.isInvalid()) return QualType();
11069 }
11070
11071 RHS = S.UsualUnaryConversions(RHS.get());
11072 if (RHS.isInvalid()) return QualType();
11073
11074 QualType LHSType = LHS.get()->getType();
11075 // Note that LHS might be a scalar because the routine calls not only in
11076 // OpenCL case.
11077 const VectorType *LHSVecTy = LHSType->getAs<VectorType>();
11078 QualType LHSEleType = LHSVecTy ? LHSVecTy->getElementType() : LHSType;
11079
11080 // Note that RHS might not be a vector.
11081 QualType RHSType = RHS.get()->getType();
11082 const VectorType *RHSVecTy = RHSType->getAs<VectorType>();
11083 QualType RHSEleType = RHSVecTy ? RHSVecTy->getElementType() : RHSType;
11084
11085 // The operands need to be integers.
11086 if (!LHSEleType->isIntegerType()) {
11087 S.Diag(Loc, diag::err_typecheck_expect_int)
11088 << LHS.get()->getType() << LHS.get()->getSourceRange();
11089 return QualType();
11090 }
11091
11092 if (!RHSEleType->isIntegerType()) {
11093 S.Diag(Loc, diag::err_typecheck_expect_int)
11094 << RHS.get()->getType() << RHS.get()->getSourceRange();
11095 return QualType();
11096 }
11097
11098 if (!LHSVecTy) {
11099 assert(RHSVecTy)(static_cast<void> (0));
11100 if (IsCompAssign)
11101 return RHSType;
11102 if (LHSEleType != RHSEleType) {
11103 LHS = S.ImpCastExprToType(LHS.get(),RHSEleType, CK_IntegralCast);
11104 LHSEleType = RHSEleType;
11105 }
11106 QualType VecTy =
11107 S.Context.getExtVectorType(LHSEleType, RHSVecTy->getNumElements());
11108 LHS = S.ImpCastExprToType(LHS.get(), VecTy, CK_VectorSplat);
11109 LHSType = VecTy;
11110 } else if (RHSVecTy) {
11111 // OpenCL v1.1 s6.3.j says that for vector types, the operators
11112 // are applied component-wise. So if RHS is a vector, then ensure
11113 // that the number of elements is the same as LHS...
11114 if (RHSVecTy->getNumElements() != LHSVecTy->getNumElements()) {
11115 S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
11116 << LHS.get()->getType() << RHS.get()->getType()
11117 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11118 return QualType();
11119 }
11120 if (!S.LangOpts.OpenCL && !S.LangOpts.ZVector) {
11121 const BuiltinType *LHSBT = LHSEleType->getAs<clang::BuiltinType>();
11122 const BuiltinType *RHSBT = RHSEleType->getAs<clang::BuiltinType>();
11123 if (LHSBT != RHSBT &&
11124 S.Context.getTypeSize(LHSBT) != S.Context.getTypeSize(RHSBT)) {
11125 S.Diag(Loc, diag::warn_typecheck_vector_element_sizes_not_equal)
11126 << LHS.get()->getType() << RHS.get()->getType()
11127 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11128 }
11129 }
11130 } else {
11131 // ...else expand RHS to match the number of elements in LHS.
11132 QualType VecTy =
11133 S.Context.getExtVectorType(RHSEleType, LHSVecTy->getNumElements());
11134 RHS = S.ImpCastExprToType(RHS.get(), VecTy, CK_VectorSplat);
11135 }
11136
11137 return LHSType;
11138}
11139
11140// C99 6.5.7
11141QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS,
11142 SourceLocation Loc, BinaryOperatorKind Opc,
11143 bool IsCompAssign) {
11144 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
11145
11146 // Vector shifts promote their scalar inputs to vector type.
11147 if (LHS.get()->getType()->isVectorType() ||
11148 RHS.get()->getType()->isVectorType()) {
11149 if (LangOpts.ZVector) {
11150 // The shift operators for the z vector extensions work basically
11151 // like general shifts, except that neither the LHS nor the RHS is
11152 // allowed to be a "vector bool".
11153 if (auto LHSVecType = LHS.get()->getType()->getAs<VectorType>())
11154 if (LHSVecType->getVectorKind() == VectorType::AltiVecBool)
11155 return InvalidOperands(Loc, LHS, RHS);
11156 if (auto RHSVecType = RHS.get()->getType()->getAs<VectorType>())
11157 if (RHSVecType->getVectorKind() == VectorType::AltiVecBool)
11158 return InvalidOperands(Loc, LHS, RHS);
11159 }
11160 return checkVectorShift(*this, LHS, RHS, Loc, IsCompAssign);
11161 }
11162
11163 // Shifts don't perform usual arithmetic conversions, they just do integer
11164 // promotions on each operand. C99 6.5.7p3
11165
11166 // For the LHS, do usual unary conversions, but then reset them away
11167 // if this is a compound assignment.
11168 ExprResult OldLHS = LHS;
11169 LHS = UsualUnaryConversions(LHS.get());
11170 if (LHS.isInvalid())
11171 return QualType();
11172 QualType LHSType = LHS.get()->getType();
11173 if (IsCompAssign) LHS = OldLHS;
11174
11175 // The RHS is simpler.
11176 RHS = UsualUnaryConversions(RHS.get());
11177 if (RHS.isInvalid())
11178 return QualType();
11179 QualType RHSType = RHS.get()->getType();
11180
11181 // C99 6.5.7p2: Each of the operands shall have integer type.
11182 // Embedded-C 4.1.6.2.2: The LHS may also be fixed-point.
11183 if ((!LHSType->isFixedPointOrIntegerType() &&
11184 !LHSType->hasIntegerRepresentation()) ||
11185 !RHSType->hasIntegerRepresentation())
11186 return InvalidOperands(Loc, LHS, RHS);
11187
11188 // C++0x: Don't allow scoped enums. FIXME: Use something better than
11189 // hasIntegerRepresentation() above instead of this.
11190 if (isScopedEnumerationType(LHSType) ||
11191 isScopedEnumerationType(RHSType)) {
11192 return InvalidOperands(Loc, LHS, RHS);
11193 }
11194 // Sanity-check shift operands
11195 DiagnoseBadShiftValues(*this, LHS, RHS, Loc, Opc, LHSType);
11196
11197 // "The type of the result is that of the promoted left operand."
11198 return LHSType;
11199}
11200
11201/// Diagnose bad pointer comparisons.
11202static void diagnoseDistinctPointerComparison(Sema &S, SourceLocation Loc,
11203 ExprResult &LHS, ExprResult &RHS,
11204 bool IsError) {
11205 S.Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers
11206 : diag::ext_typecheck_comparison_of_distinct_pointers)
11207 << LHS.get()->getType() << RHS.get()->getType()
11208 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11209}
11210
11211/// Returns false if the pointers are converted to a composite type,
11212/// true otherwise.
11213static bool convertPointersToCompositeType(Sema &S, SourceLocation Loc,
11214 ExprResult &LHS, ExprResult &RHS) {
11215 // C++ [expr.rel]p2:
11216 // [...] Pointer conversions (4.10) and qualification
11217 // conversions (4.4) are performed on pointer operands (or on
11218 // a pointer operand and a null pointer constant) to bring
11219 // them to their composite pointer type. [...]
11220 //
11221 // C++ [expr.eq]p1 uses the same notion for (in)equality
11222 // comparisons of pointers.
11223
11224 QualType LHSType = LHS.get()->getType();
11225 QualType RHSType = RHS.get()->getType();
11226 assert(LHSType->isPointerType() || RHSType->isPointerType() ||(static_cast<void> (0))
11227 LHSType->isMemberPointerType() || RHSType->isMemberPointerType())(static_cast<void> (0));
11228
11229 QualType T = S.FindCompositePointerType(Loc, LHS, RHS);
11230 if (T.isNull()) {
11231 if ((LHSType->isAnyPointerType() || LHSType->isMemberPointerType()) &&
11232 (RHSType->isAnyPointerType() || RHSType->isMemberPointerType()))
11233 diagnoseDistinctPointerComparison(S, Loc, LHS, RHS, /*isError*/true);
11234 else
11235 S.InvalidOperands(Loc, LHS, RHS);
11236 return true;
11237 }
11238
11239 return false;
11240}
11241
11242static void diagnoseFunctionPointerToVoidComparison(Sema &S, SourceLocation Loc,
11243 ExprResult &LHS,
11244 ExprResult &RHS,
11245 bool IsError) {
11246 S.Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void
11247 : diag::ext_typecheck_comparison_of_fptr_to_void)
11248 << LHS.get()->getType() << RHS.get()->getType()
11249 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
11250}
11251
11252static bool isObjCObjectLiteral(ExprResult &E) {
11253 switch (E.get()->IgnoreParenImpCasts()->getStmtClass()) {
11254 case Stmt::ObjCArrayLiteralClass:
11255 case Stmt::ObjCDictionaryLiteralClass:
11256 case Stmt::ObjCStringLiteralClass:
11257 case Stmt::ObjCBoxedExprClass:
11258 return true;
11259 default:
11260 // Note that ObjCBoolLiteral is NOT an object literal!
11261 return false;
11262 }
11263}
11264
11265static bool hasIsEqualMethod(Sema &S, const Expr *LHS, const Expr *RHS) {
11266 const ObjCObjectPointerType *Type =
11267 LHS->getType()->getAs<ObjCObjectPointerType>();
11268
11269 // If this is not actually an Objective-C object, bail out.
11270 if (!Type)
11271 return false;
11272
11273 // Get the LHS object's interface type.
11274 QualType InterfaceType = Type->getPointeeType();
11275
11276 // If the RHS isn't an Objective-C object, bail out.
11277 if (!RHS->getType()->isObjCObjectPointerType())
11278 return false;
11279
11280 // Try to find the -isEqual: method.
11281 Selector IsEqualSel = S.NSAPIObj->getIsEqualSelector();
11282 ObjCMethodDecl *Method = S.LookupMethodInObjectType(IsEqualSel,
11283 InterfaceType,
11284 /*IsInstance=*/true);
11285 if (!Method) {
11286 if (Type->isObjCIdType()) {
11287 // For 'id', just check the global pool.
11288 Method = S.LookupInstanceMethodInGlobalPool(IsEqualSel, SourceRange(),
11289 /*receiverId=*/true);
11290 } else {
11291 // Check protocols.
11292 Method = S.LookupMethodInQualifiedType(IsEqualSel, Type,
11293 /*IsInstance=*/true);
11294 }
11295 }
11296
11297 if (!Method)
11298 return false;
11299
11300 QualType T = Method->parameters()[0]->getType();
11301 if (!T->isObjCObjectPointerType())
11302 return false;
11303
11304 QualType R = Method->getReturnType();
11305 if (!R->isScalarType())
11306 return false;
11307
11308 return true;
11309}
11310
11311Sema::ObjCLiteralKind Sema::CheckLiteralKind(Expr *FromE) {
11312 FromE = FromE->IgnoreParenImpCasts();
11313 switch (FromE->getStmtClass()) {
11314 default:
11315 break;
11316 case Stmt::ObjCStringLiteralClass:
11317 // "string literal"
11318 return LK_String;
11319 case Stmt::ObjCArrayLiteralClass:
11320 // "array literal"
11321 return LK_Array;
11322 case Stmt::ObjCDictionaryLiteralClass:
11323 // "dictionary literal"
11324 return LK_Dictionary;
11325 case Stmt::BlockExprClass:
11326 return LK_Block;
11327 case Stmt::ObjCBoxedExprClass: {
11328 Expr *Inner = cast<ObjCBoxedExpr>(FromE)->getSubExpr()->IgnoreParens();
11329 switch (Inner->getStmtClass()) {
11330 case Stmt::IntegerLiteralClass:
11331 case Stmt::FloatingLiteralClass:
11332 case Stmt::CharacterLiteralClass:
11333 case Stmt::ObjCBoolLiteralExprClass:
11334 case Stmt::CXXBoolLiteralExprClass:
11335 // "numeric literal"
11336 return LK_Numeric;
11337 case Stmt::ImplicitCastExprClass: {
11338 CastKind CK = cast<CastExpr>(Inner)->getCastKind();
11339 // Boolean literals can be represented by implicit casts.
11340 if (CK == CK_IntegralToBoolean || CK == CK_IntegralCast)
11341 return LK_Numeric;
11342 break;
11343 }
11344 default:
11345 break;
11346 }
11347 return LK_Boxed;
11348 }
11349 }
11350 return LK_None;
11351}
11352
11353static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc,
11354 ExprResult &LHS, ExprResult &RHS,
11355 BinaryOperator::Opcode Opc){
11356 Expr *Literal;
11357 Expr *Other;
11358 if (isObjCObjectLiteral(LHS)) {
11359 Literal = LHS.get();
11360 Other = RHS.get();
11361 } else {
11362 Literal = RHS.get();
11363 Other = LHS.get();
11364 }
11365
11366 // Don't warn on comparisons against nil.
11367 Other = Other->IgnoreParenCasts();
11368 if (Other->isNullPointerConstant(S.getASTContext(),
11369 Expr::NPC_ValueDependentIsNotNull))
11370 return;
11371
11372 // This should be kept in sync with warn_objc_literal_comparison.
11373 // LK_String should always be after the other literals, since it has its own
11374 // warning flag.
11375 Sema::ObjCLiteralKind LiteralKind = S.CheckLiteralKind(Literal);
11376 assert(LiteralKind != Sema::LK_Block)(static_cast<void> (0));
11377 if (LiteralKind == Sema::LK_None) {
11378 llvm_unreachable("Unknown Objective-C object literal kind")__builtin_unreachable();
11379 }
11380
11381 if (LiteralKind == Sema::LK_String)
11382 S.Diag(Loc, diag::warn_objc_string_literal_comparison)
11383 << Literal->getSourceRange();
11384 else
11385 S.Diag(Loc, diag::warn_objc_literal_comparison)
11386 << LiteralKind << Literal->getSourceRange();
11387
11388 if (BinaryOperator::isEqualityOp(Opc) &&
11389 hasIsEqualMethod(S, LHS.get(), RHS.get())) {
11390 SourceLocation Start = LHS.get()->getBeginLoc();
11391 SourceLocation End = S.getLocForEndOfToken(RHS.get()->getEndLoc());
11392 CharSourceRange OpRange =
11393 CharSourceRange::getCharRange(Loc, S.getLocForEndOfToken(Loc));
11394
11395 S.Diag(Loc, diag::note_objc_literal_comparison_isequal)
11396 << FixItHint::CreateInsertion(Start, Opc == BO_EQ ? "[" : "![")
11397 << FixItHint::CreateReplacement(OpRange, " isEqual:")
11398 << FixItHint::CreateInsertion(End, "]");
11399 }
11400}
11401
11402/// Warns on !x < y, !x & y where !(x < y), !(x & y) was probably intended.
11403static void diagnoseLogicalNotOnLHSofCheck(Sema &S, ExprResult &LHS,
11404 ExprResult &RHS, SourceLocation Loc,
11405 BinaryOperatorKind Opc) {
11406 // Check that left hand side is !something.
11407 UnaryOperator *UO = dyn_cast<UnaryOperator>(LHS.get()->IgnoreImpCasts());
11408 if (!UO || UO->getOpcode() != UO_LNot) return;
11409
11410 // Only check if the right hand side is non-bool arithmetic type.
11411 if (RHS.get()->isKnownToHaveBooleanValue()) return;
11412
11413 // Make sure that the something in !something is not bool.
11414 Expr *SubExpr = UO->getSubExpr()->IgnoreImpCasts();
11415 if (SubExpr->isKnownToHaveBooleanValue()) return;
11416
11417 // Emit warning.
11418 bool IsBitwiseOp = Opc == BO_And || Opc == BO_Or || Opc == BO_Xor;
11419 S.Diag(UO->getOperatorLoc(), diag::warn_logical_not_on_lhs_of_check)
11420 << Loc << IsBitwiseOp;
11421
11422 // First note suggest !(x < y)
11423 SourceLocation FirstOpen = SubExpr->getBeginLoc();
11424 SourceLocation FirstClose = RHS.get()->getEndLoc();
11425 FirstClose = S.getLocForEndOfToken(FirstClose);
11426 if (FirstClose.isInvalid())
11427 FirstOpen = SourceLocation();
11428 S.Diag(UO->getOperatorLoc(), diag::note_logical_not_fix)
11429 << IsBitwiseOp
11430 << FixItHint::CreateInsertion(FirstOpen, "(")
11431 << FixItHint::CreateInsertion(FirstClose, ")");
11432
11433 // Second note suggests (!x) < y
11434 SourceLocation SecondOpen = LHS.get()->getBeginLoc();
11435 SourceLocation SecondClose = LHS.get()->getEndLoc();
11436 SecondClose = S.getLocForEndOfToken(SecondClose);
11437 if (SecondClose.isInvalid())
11438 SecondOpen = SourceLocation();
11439 S.Diag(UO->getOperatorLoc(), diag::note_logical_not_silence_with_parens)
11440 << FixItHint::CreateInsertion(SecondOpen, "(")
11441 << FixItHint::CreateInsertion(SecondClose, ")");
11442}
11443
11444// Returns true if E refers to a non-weak array.
11445static bool checkForArray(const Expr *E) {
11446 const ValueDecl *D = nullptr;
11447 if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E)) {
11448 D = DR->getDecl();
11449 } else if (const MemberExpr *Mem = dyn_cast<MemberExpr>(E)) {
11450 if (Mem->isImplicitAccess())
11451 D = Mem->getMemberDecl();
11452 }
11453 if (!D)
11454 return false;
11455 return D->getType()->isArrayType() && !D->isWeak();
11456}
11457
11458/// Diagnose some forms of syntactically-obvious tautological comparison.
11459static void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc,
11460 Expr *LHS, Expr *RHS,
11461 BinaryOperatorKind Opc) {
11462 Expr *LHSStripped = LHS->IgnoreParenImpCasts();
11463 Expr *RHSStripped = RHS->IgnoreParenImpCasts();
11464
11465 QualType LHSType = LHS->getType();
11466 QualType RHSType = RHS->getType();
11467 if (LHSType->hasFloatingRepresentation() ||
11468 (LHSType->isBlockPointerType() && !BinaryOperator::isEqualityOp(Opc)) ||
11469 S.inTemplateInstantiation())
11470 return;
11471
11472 // Comparisons between two array types are ill-formed for operator<=>, so
11473 // we shouldn't emit any additional warnings about it.
11474 if (Opc == BO_Cmp && LHSType->isArrayType() && RHSType->isArrayType())
11475 return;
11476
11477 // For non-floating point types, check for self-comparisons of the form
11478 // x == x, x != x, x < x, etc. These always evaluate to a constant, and
11479 // often indicate logic errors in the program.
11480 //
11481 // NOTE: Don't warn about comparison expressions resulting from macro
11482 // expansion. Also don't warn about comparisons which are only self
11483 // comparisons within a template instantiation. The warnings should catch
11484 // obvious cases in the definition of the template anyways. The idea is to
11485 // warn when the typed comparison operator will always evaluate to the same
11486 // result.
11487
11488 // Used for indexing into %select in warn_comparison_always
11489 enum {
11490 AlwaysConstant,
11491 AlwaysTrue,
11492 AlwaysFalse,
11493 AlwaysEqual, // std::strong_ordering::equal from operator<=>
11494 };
11495
11496 // C++2a [depr.array.comp]:
11497 // Equality and relational comparisons ([expr.eq], [expr.rel]) between two
11498 // operands of array type are deprecated.
11499 if (S.getLangOpts().CPlusPlus20 && LHSStripped->getType()->isArrayType() &&
11500 RHSStripped->getType()->isArrayType()) {
11501 S.Diag(Loc, diag::warn_depr_array_comparison)
11502 << LHS->getSourceRange() << RHS->getSourceRange()
11503 << LHSStripped->getType() << RHSStripped->getType();
11504 // Carry on to produce the tautological comparison warning, if this
11505 // expression is potentially-evaluated, we can resolve the array to a
11506 // non-weak declaration, and so on.
11507 }
11508
11509 if (!LHS->getBeginLoc().isMacroID() && !RHS->getBeginLoc().isMacroID()) {
11510 if (Expr::isSameComparisonOperand(LHS, RHS)) {
11511 unsigned Result;
11512 switch (Opc) {
11513 case BO_EQ:
11514 case BO_LE:
11515 case BO_GE:
11516 Result = AlwaysTrue;
11517 break;
11518 case BO_NE:
11519 case BO_LT:
11520 case BO_GT:
11521 Result = AlwaysFalse;
11522 break;
11523 case BO_Cmp:
11524 Result = AlwaysEqual;
11525 break;
11526 default:
11527 Result = AlwaysConstant;
11528 break;
11529 }
11530 S.DiagRuntimeBehavior(Loc, nullptr,
11531 S.PDiag(diag::warn_comparison_always)
11532 << 0 /*self-comparison*/
11533 << Result);
11534 } else if (checkForArray(LHSStripped) && checkForArray(RHSStripped)) {
11535 // What is it always going to evaluate to?
11536 unsigned Result;
11537 switch (Opc) {
11538 case BO_EQ: // e.g. array1 == array2
11539 Result = AlwaysFalse;
11540 break;
11541 case BO_NE: // e.g. array1 != array2
11542 Result = AlwaysTrue;
11543 break;
11544 default: // e.g. array1 <= array2
11545 // The best we can say is 'a constant'
11546 Result = AlwaysConstant;
11547 break;
11548 }
11549 S.DiagRuntimeBehavior(Loc, nullptr,
11550 S.PDiag(diag::warn_comparison_always)
11551 << 1 /*array comparison*/
11552 << Result);
11553 }
11554 }
11555
11556 if (isa<CastExpr>(LHSStripped))
11557 LHSStripped = LHSStripped->IgnoreParenCasts();
11558 if (isa<CastExpr>(RHSStripped))
11559 RHSStripped = RHSStripped->IgnoreParenCasts();
11560
11561 // Warn about comparisons against a string constant (unless the other
11562 // operand is null); the user probably wants string comparison function.
11563 Expr *LiteralString = nullptr;
11564 Expr *LiteralStringStripped = nullptr;
11565 if ((isa<StringLiteral>(LHSStripped) || isa<ObjCEncodeExpr>(LHSStripped)) &&
11566 !RHSStripped->isNullPointerConstant(S.Context,
11567 Expr::NPC_ValueDependentIsNull)) {
11568 LiteralString = LHS;
11569 LiteralStringStripped = LHSStripped;
11570 } else if ((isa<StringLiteral>(RHSStripped) ||
11571 isa<ObjCEncodeExpr>(RHSStripped)) &&
11572 !LHSStripped->isNullPointerConstant(S.Context,
11573 Expr::NPC_ValueDependentIsNull)) {
11574 LiteralString = RHS;
11575 LiteralStringStripped = RHSStripped;
11576 }
11577
11578 if (LiteralString) {
11579 S.DiagRuntimeBehavior(Loc, nullptr,
11580 S.PDiag(diag::warn_stringcompare)
11581 << isa<ObjCEncodeExpr>(LiteralStringStripped)
11582 << LiteralString->getSourceRange());
11583 }
11584}
11585
11586static ImplicitConversionKind castKindToImplicitConversionKind(CastKind CK) {
11587 switch (CK) {
11588 default: {
11589#ifndef NDEBUG1
11590 llvm::errs() << "unhandled cast kind: " << CastExpr::getCastKindName(CK)
11591 << "\n";
11592#endif
11593 llvm_unreachable("unhandled cast kind")__builtin_unreachable();
11594 }
11595 case CK_UserDefinedConversion:
11596 return ICK_Identity;
11597 case CK_LValueToRValue:
11598 return ICK_Lvalue_To_Rvalue;
11599 case CK_ArrayToPointerDecay:
11600 return ICK_Array_To_Pointer;
11601 case CK_FunctionToPointerDecay:
11602 return ICK_Function_To_Pointer;
11603 case CK_IntegralCast:
11604 return ICK_Integral_Conversion;
11605 case CK_FloatingCast:
11606 return ICK_Floating_Conversion;
11607 case CK_IntegralToFloating:
11608 case CK_FloatingToIntegral:
11609 return ICK_Floating_Integral;
11610 case CK_IntegralComplexCast:
11611 case CK_FloatingComplexCast:
11612 case CK_FloatingComplexToIntegralComplex:
11613 case CK_IntegralComplexToFloatingComplex:
11614 return ICK_Complex_Conversion;
11615 case CK_FloatingComplexToReal:
11616 case CK_FloatingRealToComplex:
11617 case CK_IntegralComplexToReal:
11618 case CK_IntegralRealToComplex:
11619 return ICK_Complex_Real;
11620 }
11621}
11622
11623static bool checkThreeWayNarrowingConversion(Sema &S, QualType ToType, Expr *E,
11624 QualType FromType,
11625 SourceLocation Loc) {
11626 // Check for a narrowing implicit conversion.
11627 StandardConversionSequence SCS;
11628 SCS.setAsIdentityConversion();
11629 SCS.setToType(0, FromType);
11630 SCS.setToType(1, ToType);
11631 if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
11632 SCS.Second = castKindToImplicitConversionKind(ICE->getCastKind());
11633
11634 APValue PreNarrowingValue;
11635 QualType PreNarrowingType;
11636 switch (SCS.getNarrowingKind(S.Context, E, PreNarrowingValue,
11637 PreNarrowingType,
11638 /*IgnoreFloatToIntegralConversion*/ true)) {
11639 case NK_Dependent_Narrowing:
11640 // Implicit conversion to a narrower type, but the expression is
11641 // value-dependent so we can't tell whether it's actually narrowing.
11642 case NK_Not_Narrowing:
11643 return false;
11644
11645 case NK_Constant_Narrowing:
11646 // Implicit conversion to a narrower type, and the value is not a constant
11647 // expression.
11648 S.Diag(E->getBeginLoc(), diag::err_spaceship_argument_narrowing)
11649 << /*Constant*/ 1
11650 << PreNarrowingValue.getAsString(S.Context, PreNarrowingType) << ToType;
11651 return true;
11652
11653 case NK_Variable_Narrowing:
11654 // Implicit conversion to a narrower type, and the value is not a constant
11655 // expression.
11656 case NK_Type_Narrowing:
11657 S.Diag(E->getBeginLoc(), diag::err_spaceship_argument_narrowing)
11658 << /*Constant*/ 0 << FromType << ToType;
11659 // TODO: It's not a constant expression, but what if the user intended it
11660 // to be? Can we produce notes to help them figure out why it isn't?
11661 return true;
11662 }
11663 llvm_unreachable("unhandled case in switch")__builtin_unreachable();
11664}
11665
11666static QualType checkArithmeticOrEnumeralThreeWayCompare(Sema &S,
11667 ExprResult &LHS,
11668 ExprResult &RHS,
11669 SourceLocation Loc) {
11670 QualType LHSType = LHS.get()->getType();
11671 QualType RHSType = RHS.get()->getType();
11672 // Dig out the original argument type and expression before implicit casts
11673 // were applied. These are the types/expressions we need to check the
11674 // [expr.spaceship] requirements against.
11675 ExprResult LHSStripped = LHS.get()->IgnoreParenImpCasts();
11676 ExprResult RHSStripped = RHS.get()->IgnoreParenImpCasts();
11677 QualType LHSStrippedType = LHSStripped.get()->getType();
11678 QualType RHSStrippedType = RHSStripped.get()->getType();
11679
11680 // C++2a [expr.spaceship]p3: If one of the operands is of type bool and the
11681 // other is not, the program is ill-formed.
11682 if (LHSStrippedType->isBooleanType() != RHSStrippedType->isBooleanType()) {
11683 S.InvalidOperands(Loc, LHSStripped, RHSStripped);
11684 return QualType();
11685 }
11686
11687 // FIXME: Consider combining this with checkEnumArithmeticConversions.
11688 int NumEnumArgs = (int)LHSStrippedType->isEnumeralType() +
11689 RHSStrippedType->isEnumeralType();
11690 if (NumEnumArgs == 1) {
11691 bool LHSIsEnum = LHSStrippedType->isEnumeralType();
11692 QualType OtherTy = LHSIsEnum ? RHSStrippedType : LHSStrippedType;
11693 if (OtherTy->hasFloatingRepresentation()) {
11694 S.InvalidOperands(Loc, LHSStripped, RHSStripped);
11695 return QualType();
11696 }
11697 }
11698 if (NumEnumArgs == 2) {
11699 // C++2a [expr.spaceship]p5: If both operands have the same enumeration
11700 // type E, the operator yields the result of converting the operands
11701 // to the underlying type of E and applying <=> to the converted operands.
11702 if (!S.Context.hasSameUnqualifiedType(LHSStrippedType, RHSStrippedType)) {
11703 S.InvalidOperands(Loc, LHS, RHS);
11704 return QualType();
11705 }
11706 QualType IntType =
11707 LHSStrippedType->castAs<EnumType>()->getDecl()->getIntegerType();
11708 assert(IntType->isArithmeticType())(static_cast<void> (0));
11709
11710 // We can't use `CK_IntegralCast` when the underlying type is 'bool', so we
11711 // promote the boolean type, and all other promotable integer types, to
11712 // avoid this.
11713 if (IntType->isPromotableIntegerType())
11714 IntType = S.Context.getPromotedIntegerType(IntType);
11715
11716 LHS = S.ImpCastExprToType(LHS.get(), IntType, CK_IntegralCast);
11717 RHS = S.ImpCastExprToType(RHS.get(), IntType, CK_IntegralCast);
11718 LHSType = RHSType = IntType;
11719 }
11720
11721 // C++2a [expr.spaceship]p4: If both operands have arithmetic types, the
11722 // usual arithmetic conversions are applied to the operands.
11723 QualType Type =
11724 S.UsualArithmeticConversions(LHS, RHS, Loc, Sema::ACK_Comparison);
11725 if (LHS.isInvalid() || RHS.isInvalid())
11726 return QualType();
11727 if (Type.isNull())
11728 return S.InvalidOperands(Loc, LHS, RHS);
11729
11730 Optional<ComparisonCategoryType> CCT =
11731 getComparisonCategoryForBuiltinCmp(Type);
11732 if (!CCT)
11733 return S.InvalidOperands(Loc, LHS, RHS);
11734
11735 bool HasNarrowing = checkThreeWayNarrowingConversion(
11736 S, Type, LHS.get(), LHSType, LHS.get()->getBeginLoc());
11737 HasNarrowing |= checkThreeWayNarrowingConversion(S, Type, RHS.get(), RHSType,
11738 RHS.get()->getBeginLoc());
11739 if (HasNarrowing)
11740 return QualType();
11741
11742 assert(!Type.isNull() && "composite type for <=> has not been set")(static_cast<void> (0));
11743
11744 return S.CheckComparisonCategoryType(
11745 *CCT, Loc, Sema::ComparisonCategoryUsage::OperatorInExpression);
11746}
11747
11748static QualType checkArithmeticOrEnumeralCompare(Sema &S, ExprResult &LHS,
11749 ExprResult &RHS,
11750 SourceLocation Loc,
11751 BinaryOperatorKind Opc) {
11752 if (Opc == BO_Cmp)
11753 return checkArithmeticOrEnumeralThreeWayCompare(S, LHS, RHS, Loc);
11754
11755 // C99 6.5.8p3 / C99 6.5.9p4
11756 QualType Type =
11757 S.UsualArithmeticConversions(LHS, RHS, Loc, Sema::ACK_Comparison);
11758 if (LHS.isInvalid() || RHS.isInvalid())
11759 return QualType();
11760 if (Type.isNull())
11761 return S.InvalidOperands(Loc, LHS, RHS);
11762 assert(Type->isArithmeticType() || Type->isEnumeralType())(static_cast<void> (0));
11763
11764 if (Type->isAnyComplexType() && BinaryOperator::isRelationalOp(Opc))
11765 return S.InvalidOperands(Loc, LHS, RHS);
11766
11767 // Check for comparisons of floating point operands using != and ==.
11768 if (Type->hasFloatingRepresentation() && BinaryOperator::isEqualityOp(Opc))
11769 S.CheckFloatComparison(Loc, LHS.get(), RHS.get());
11770
11771 // The result of comparisons is 'bool' in C++, 'int' in C.
11772 return S.Context.getLogicalOperationType();
11773}
11774
11775void Sema::CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE) {
11776 if (!NullE.get()->getType()->isAnyPointerType())
11777 return;
11778 int NullValue = PP.isMacroDefined("NULL") ? 0 : 1;
11779 if (!E.get()->getType()->isAnyPointerType() &&
11780 E.get()->isNullPointerConstant(Context,
11781 Expr::NPC_ValueDependentIsNotNull) ==
11782 Expr::NPCK_ZeroExpression) {
11783 if (const auto *CL = dyn_cast<CharacterLiteral>(E.get())) {
11784 if (CL->getValue() == 0)
11785 Diag(E.get()->getExprLoc(), diag::warn_pointer_compare)
11786 << NullValue
11787 << FixItHint::CreateReplacement(E.get()->getExprLoc(),
11788 NullValue ? "NULL" : "(void *)0");
11789 } else if (const auto *CE = dyn_cast<CStyleCastExpr>(E.get())) {
11790 TypeSourceInfo *TI = CE->getTypeInfoAsWritten();
11791 QualType T = Context.getCanonicalType(TI->getType()).getUnqualifiedType();
11792 if (T == Context.CharTy)
11793 Diag(E.get()->getExprLoc(), diag::warn_pointer_compare)
11794 << NullValue
11795 << FixItHint::CreateReplacement(E.get()->getExprLoc(),
11796 NullValue ? "NULL" : "(void *)0");
11797 }
11798 }
11799}
11800
11801// C99 6.5.8, C++ [expr.rel]
11802QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS,
11803 SourceLocation Loc,
11804 BinaryOperatorKind Opc) {
11805 bool IsRelational = BinaryOperator::isRelationalOp(Opc);
11806 bool IsThreeWay = Opc == BO_Cmp;
11807 bool IsOrdered = IsRelational || IsThreeWay;
11808 auto IsAnyPointerType = [](ExprResult E) {
11809 QualType Ty = E.get()->getType();
11810 return Ty->isPointerType() || Ty->isMemberPointerType();
11811 };
11812
11813 // C++2a [expr.spaceship]p6: If at least one of the operands is of pointer
11814 // type, array-to-pointer, ..., conversions are performed on both operands to
11815 // bring them to their composite type.
11816 // Otherwise, all comparisons expect an rvalue, so convert to rvalue before
11817 // any type-related checks.
11818 if (!IsThreeWay || IsAnyPointerType(LHS) || IsAnyPointerType(RHS)) {
11819 LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
11820 if (LHS.isInvalid())
11821 return QualType();
11822 RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
11823 if (RHS.isInvalid())
11824 return QualType();
11825 } else {
11826 LHS = DefaultLvalueConversion(LHS.get());
11827 if (LHS.isInvalid())
11828 return QualType();
11829 RHS = DefaultLvalueConversion(RHS.get());
11830 if (RHS.isInvalid())
11831 return QualType();
11832 }
11833
11834 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/true);
11835 if (!getLangOpts().CPlusPlus && BinaryOperator::isEqualityOp(Opc)) {
11836 CheckPtrComparisonWithNullChar(LHS, RHS);
11837 CheckPtrComparisonWithNullChar(RHS, LHS);
11838 }
11839
11840 // Handle vector comparisons separately.
11841 if (LHS.get()->getType()->isVectorType() ||
11842 RHS.get()->getType()->isVectorType())
11843 return CheckVectorCompareOperands(LHS, RHS, Loc, Opc);
11844
11845 diagnoseLogicalNotOnLHSofCheck(*this, LHS, RHS, Loc, Opc);
11846 diagnoseTautologicalComparison(*this, Loc, LHS.get(), RHS.get(), Opc);
11847
11848 QualType LHSType = LHS.get()->getType();
11849 QualType RHSType = RHS.get()->getType();
11850 if ((LHSType->isArithmeticType() || LHSType->isEnumeralType()) &&
11851 (RHSType->isArithmeticType() || RHSType->isEnumeralType()))
11852 return checkArithmeticOrEnumeralCompare(*this, LHS, RHS, Loc, Opc);
11853
11854 const Expr::NullPointerConstantKind LHSNullKind =
11855 LHS.get()->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull);
11856 const Expr::NullPointerConstantKind RHSNullKind =
11857 RHS.get()->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull);
11858 bool LHSIsNull = LHSNullKind != Expr::NPCK_NotNull;
11859 bool RHSIsNull = RHSNullKind != Expr::NPCK_NotNull;
11860
11861 auto computeResultTy = [&]() {
11862 if (Opc != BO_Cmp)
11863 return Context.getLogicalOperationType();
11864 assert(getLangOpts().CPlusPlus)(static_cast<void> (0));
11865 assert(Context.hasSameType(LHS.get()->getType(), RHS.get()->getType()))(static_cast<void> (0));
11866
11867 QualType CompositeTy = LHS.get()->getType();
11868 assert(!CompositeTy->isReferenceType())(static_cast<void> (0));
11869
11870 Optional<ComparisonCategoryType> CCT =
11871 getComparisonCategoryForBuiltinCmp(CompositeTy);
11872 if (!CCT)
11873 return InvalidOperands(Loc, LHS, RHS);
11874
11875 if (CompositeTy->isPointerType() && LHSIsNull != RHSIsNull) {
11876 // P0946R0: Comparisons between a null pointer constant and an object
11877 // pointer result in std::strong_equality, which is ill-formed under
11878 // P1959R0.
11879 Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero)
11880 << (LHSIsNull ? LHS.get()->getSourceRange()
11881 : RHS.get()->getSourceRange());
11882 return QualType();
11883 }
11884
11885 return CheckComparisonCategoryType(
11886 *CCT, Loc, ComparisonCategoryUsage::OperatorInExpression);
11887 };
11888
11889 if (!IsOrdered && LHSIsNull != RHSIsNull) {
11890 bool IsEquality = Opc == BO_EQ;
11891 if (RHSIsNull)
11892 DiagnoseAlwaysNonNullPointer(LHS.get(), RHSNullKind, IsEquality,
11893 RHS.get()->getSourceRange());
11894 else
11895 DiagnoseAlwaysNonNullPointer(RHS.get(), LHSNullKind, IsEquality,
11896 LHS.get()->getSourceRange());
11897 }
11898
11899 if (IsOrdered && LHSType->isFunctionPointerType() &&
11900 RHSType->isFunctionPointerType()) {
11901 // Valid unless a relational comparison of function pointers
11902 bool IsError = Opc == BO_Cmp;
11903 auto DiagID =
11904 IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers
11905 : getLangOpts().CPlusPlus
11906 ? diag::warn_typecheck_ordered_comparison_of_function_pointers
11907 : diag::ext_typecheck_ordered_comparison_of_function_pointers;
11908 Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange()
11909 << RHS.get()->getSourceRange();
11910 if (IsError)
11911 return QualType();
11912 }
11913
11914 if ((LHSType->isIntegerType() && !LHSIsNull) ||
11915 (RHSType->isIntegerType() && !RHSIsNull)) {
11916 // Skip normal pointer conversion checks in this case; we have better
11917 // diagnostics for this below.
11918 } else if (getLangOpts().CPlusPlus) {
11919 // Equality comparison of a function pointer to a void pointer is invalid,
11920 // but we allow it as an extension.
11921 // FIXME: If we really want to allow this, should it be part of composite
11922 // pointer type computation so it works in conditionals too?
11923 if (!IsOrdered &&
11924 ((LHSType->isFunctionPointerType() && RHSType->isVoidPointerType()) ||
11925 (RHSType->isFunctionPointerType() && LHSType->isVoidPointerType()))) {
11926 // This is a gcc extension compatibility comparison.
11927 // In a SFINAE context, we treat this as a hard error to maintain
11928 // conformance with the C++ standard.
11929 diagnoseFunctionPointerToVoidComparison(
11930 *this, Loc, LHS, RHS, /*isError*/ (bool)isSFINAEContext());
11931
11932 if (isSFINAEContext())
11933 return QualType();
11934
11935 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast);
11936 return computeResultTy();
11937 }
11938
11939 // C++ [expr.eq]p2:
11940 // If at least one operand is a pointer [...] bring them to their
11941 // composite pointer type.
11942 // C++ [expr.spaceship]p6
11943 // If at least one of the operands is of pointer type, [...] bring them
11944 // to their composite pointer type.
11945 // C++ [expr.rel]p2:
11946 // If both operands are pointers, [...] bring them to their composite
11947 // pointer type.
11948 // For <=>, the only valid non-pointer types are arrays and functions, and
11949 // we already decayed those, so this is really the same as the relational
11950 // comparison rule.
11951 if ((int)LHSType->isPointerType() + (int)RHSType->isPointerType() >=
11952 (IsOrdered ? 2 : 1) &&
11953 (!LangOpts.ObjCAutoRefCount || !(LHSType->isObjCObjectPointerType() ||
11954 RHSType->isObjCObjectPointerType()))) {
11955 if (convertPointersToCompositeType(*this, Loc, LHS, RHS))
11956 return QualType();
11957 return computeResultTy();
11958 }
11959 } else if (LHSType->isPointerType() &&
11960 RHSType->isPointerType()) { // C99 6.5.8p2
11961 // All of the following pointer-related warnings are GCC extensions, except
11962 // when handling null pointer constants.
11963 QualType LCanPointeeTy =
11964 LHSType->castAs<PointerType>()->getPointeeType().getCanonicalType();
11965 QualType RCanPointeeTy =
11966 RHSType->castAs<PointerType>()->getPointeeType().getCanonicalType();
11967
11968 // C99 6.5.9p2 and C99 6.5.8p2
11969 if (Context.typesAreCompatible(LCanPointeeTy.getUnqualifiedType(),
11970 RCanPointeeTy.getUnqualifiedType())) {
11971 if (IsRelational) {
11972 // Pointers both need to point to complete or incomplete types
11973 if ((LCanPointeeTy->isIncompleteType() !=
11974 RCanPointeeTy->isIncompleteType()) &&
11975 !getLangOpts().C11) {
11976 Diag(Loc, diag::ext_typecheck_compare_complete_incomplete_pointers)
11977 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange()
11978 << LHSType << RHSType << LCanPointeeTy->isIncompleteType()
11979 << RCanPointeeTy->isIncompleteType();
11980 }
11981 }
11982 } else if (!IsRelational &&
11983 (LCanPointeeTy->isVoidType() || RCanPointeeTy->isVoidType())) {
11984 // Valid unless comparison between non-null pointer and function pointer
11985 if ((LCanPointeeTy->isFunctionType() || RCanPointeeTy->isFunctionType())
11986 && !LHSIsNull && !RHSIsNull)
11987 diagnoseFunctionPointerToVoidComparison(*this, Loc, LHS, RHS,
11988 /*isError*/false);
11989 } else {
11990 // Invalid
11991 diagnoseDistinctPointerComparison(*this, Loc, LHS, RHS, /*isError*/false);
11992 }
11993 if (LCanPointeeTy != RCanPointeeTy) {
11994 // Treat NULL constant as a special case in OpenCL.
11995 if (getLangOpts().OpenCL && !LHSIsNull && !RHSIsNull) {
11996 if (!LCanPointeeTy.isAddressSpaceOverlapping(RCanPointeeTy)) {
11997 Diag(Loc,
11998 diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
11999 << LHSType << RHSType << 0 /* comparison */
12000 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
12001 }
12002 }
12003 LangAS AddrSpaceL = LCanPointeeTy.getAddressSpace();
12004 LangAS AddrSpaceR = RCanPointeeTy.getAddressSpace();
12005 CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
12006 : CK_BitCast;
12007 if (LHSIsNull && !RHSIsNull)
12008 LHS = ImpCastExprToType(LHS.get(), RHSType, Kind);
12009 else
12010 RHS = ImpCastExprToType(RHS.get(), LHSType, Kind);
12011 }
12012 return computeResultTy();
12013 }
12014
12015 if (getLangOpts().CPlusPlus) {
12016 // C++ [expr.eq]p4:
12017 // Two operands of type std::nullptr_t or one operand of type
12018 // std::nullptr_t and the other a null pointer constant compare equal.
12019 if (!IsOrdered && LHSIsNull && RHSIsNull) {
12020 if (LHSType->isNullPtrType()) {
12021 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
12022 return computeResultTy();
12023 }
12024 if (RHSType->isNullPtrType()) {
12025 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_NullToPointer);
12026 return computeResultTy();
12027 }
12028 }
12029
12030 // Comparison of Objective-C pointers and block pointers against nullptr_t.
12031 // These aren't covered by the composite pointer type rules.
12032 if (!IsOrdered && RHSType->isNullPtrType() &&
12033 (LHSType->isObjCObjectPointerType() || LHSType->isBlockPointerType())) {
12034 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
12035 return computeResultTy();
12036 }
12037 if (!IsOrdered && LHSType->isNullPtrType() &&
12038 (RHSType->isObjCObjectPointerType() || RHSType->isBlockPointerType())) {
12039 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_NullToPointer);
12040 return computeResultTy();
12041 }
12042
12043 if (IsRelational &&
12044 ((LHSType->isNullPtrType() && RHSType->isPointerType()) ||
12045 (RHSType->isNullPtrType() && LHSType->isPointerType()))) {
12046 // HACK: Relational comparison of nullptr_t against a pointer type is
12047 // invalid per DR583, but we allow it within std::less<> and friends,
12048 // since otherwise common uses of it break.
12049 // FIXME: Consider removing this hack once LWG fixes std::less<> and
12050 // friends to have std::nullptr_t overload candidates.
12051 DeclContext *DC = CurContext;
12052 if (isa<FunctionDecl>(DC))
12053 DC = DC->getParent();
12054 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
12055 if (CTSD->isInStdNamespace() &&
12056 llvm::StringSwitch<bool>(CTSD->getName())
12057 .Cases("less", "less_equal", "greater", "greater_equal", true)
12058 .Default(false)) {
12059 if (RHSType->isNullPtrType())
12060 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
12061 else
12062 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_NullToPointer);
12063 return computeResultTy();
12064 }
12065 }
12066 }
12067
12068 // C++ [expr.eq]p2:
12069 // If at least one operand is a pointer to member, [...] bring them to
12070 // their composite pointer type.
12071 if (!IsOrdered &&
12072 (LHSType->isMemberPointerType() || RHSType->isMemberPointerType())) {
12073 if (convertPointersToCompositeType(*this, Loc, LHS, RHS))
12074 return QualType();
12075 else
12076 return computeResultTy();
12077 }
12078 }
12079
12080 // Handle block pointer types.
12081 if (!IsOrdered && LHSType->isBlockPointerType() &&
12082 RHSType->isBlockPointerType()) {
12083 QualType lpointee = LHSType->castAs<BlockPointerType>()->getPointeeType();
12084 QualType rpointee = RHSType->castAs<BlockPointerType>()->getPointeeType();
12085
12086 if (!LHSIsNull && !RHSIsNull &&
12087 !Context.typesAreCompatible(lpointee, rpointee)) {
12088 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12089 << LHSType << RHSType << LHS.get()->getSourceRange()
12090 << RHS.get()->getSourceRange();
12091 }
12092 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast);
12093 return computeResultTy();
12094 }
12095
12096 // Allow block pointers to be compared with null pointer constants.
12097 if (!IsOrdered
12098 && ((LHSType->isBlockPointerType() && RHSType->isPointerType())
12099 || (LHSType->isPointerType() && RHSType->isBlockPointerType()))) {
12100 if (!LHSIsNull && !RHSIsNull) {
12101 if (!((RHSType->isPointerType() && RHSType->castAs<PointerType>()
12102 ->getPointeeType()->isVoidType())
12103 || (LHSType->isPointerType() && LHSType->castAs<PointerType>()
12104 ->getPointeeType()->isVoidType())))
12105 Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
12106 << LHSType << RHSType << LHS.get()->getSourceRange()
12107 << RHS.get()->getSourceRange();
12108 }
12109 if (LHSIsNull && !RHSIsNull)
12110 LHS = ImpCastExprToType(LHS.get(), RHSType,
12111 RHSType->isPointerType() ? CK_BitCast
12112 : CK_AnyPointerToBlockPointerCast);
12113 else
12114 RHS = ImpCastExprToType(RHS.get(), LHSType,
12115 LHSType->isPointerType() ? CK_BitCast
12116 : CK_AnyPointerToBlockPointerCast);
12117 return computeResultTy();
12118 }
12119
12120 if (LHSType->isObjCObjectPointerType() ||
12121 RHSType->isObjCObjectPointerType()) {
12122 const PointerType *LPT = LHSType->getAs<PointerType>();
12123 const PointerType *RPT = RHSType->getAs<PointerType>();
12124 if (LPT || RPT) {
12125 bool LPtrToVoid = LPT ? LPT->getPointeeType()->isVoidType() : false;
12126 bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() : false;
12127
12128 if (!LPtrToVoid && !RPtrToVoid &&
12129 !Context.typesAreCompatible(LHSType, RHSType)) {
12130 diagnoseDistinctPointerComparison(*this, Loc, LHS, RHS,
12131 /*isError*/false);
12132 }
12133 // FIXME: If LPtrToVoid, we should presumably convert the LHS rather than
12134 // the RHS, but we have test coverage for this behavior.
12135 // FIXME: Consider using convertPointersToCompositeType in C++.
12136 if (LHSIsNull && !RHSIsNull) {
12137 Expr *E = LHS.get();
12138 if (getLangOpts().ObjCAutoRefCount)
12139 CheckObjCConversion(SourceRange(), RHSType, E,
12140 CCK_ImplicitConversion);
12141 LHS = ImpCastExprToType(E, RHSType,
12142 RPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12143 }
12144 else {
12145 Expr *E = RHS.get();
12146 if (getLangOpts().ObjCAutoRefCount)
12147 CheckObjCConversion(SourceRange(), LHSType, E, CCK_ImplicitConversion,
12148 /*Diagnose=*/true,
12149 /*DiagnoseCFAudited=*/false, Opc);
12150 RHS = ImpCastExprToType(E, LHSType,
12151 LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
12152 }
12153 return computeResultTy();
12154 }
12155 if (LHSType->isObjCObjectPointerType() &&
12156 RHSType->isObjCObjectPointerType()) {
12157 if (!Context.areComparableObjCPointerTypes(LHSType, RHSType))
12158 diagnoseDistinctPointerComparison(*this, Loc, LHS, RHS,
12159 /*isError*/false);
12160 if (isObjCObjectLiteral(LHS) || isObjCObjectLiteral(RHS))
12161 diagnoseObjCLiteralComparison(*this, Loc, LHS, RHS, Opc);
12162
12163 if (LHSIsNull && !RHSIsNull)
12164 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_BitCast);
12165 else
12166 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_BitCast);
12167 return computeResultTy();
12168 }
12169
12170 if (!IsOrdered && LHSType->isBlockPointerType() &&
12171 RHSType->isBlockCompatibleObjCPointerType(Context)) {
12172 LHS = ImpCastExprToType(LHS.get(), RHSType,
12173 CK_BlockPointerToObjCPointerCast);
12174 return computeResultTy();
12175 } else if (!IsOrdered &&
12176 LHSType->isBlockCompatibleObjCPointerType(Context) &&
12177 RHSType->isBlockPointerType()) {
12178 RHS = ImpCastExprToType(RHS.get(), LHSType,
12179 CK_BlockPointerToObjCPointerCast);
12180 return computeResultTy();
12181 }
12182 }
12183 if ((LHSType->isAnyPointerType() && RHSType->isIntegerType()) ||
12184 (LHSType->isIntegerType() && RHSType->isAnyPointerType())) {
12185 unsigned DiagID = 0;
12186 bool isError = false;
12187 if (LangOpts.DebuggerSupport) {
12188 // Under a debugger, allow the comparison of pointers to integers,
12189 // since users tend to want to compare addresses.
12190 } else if ((LHSIsNull && LHSType->isIntegerType()) ||
12191 (RHSIsNull && RHSType->isIntegerType())) {
12192 if (IsOrdered) {
12193 isError = getLangOpts().CPlusPlus;
12194 DiagID =
12195 isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero
12196 : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;
12197 }
12198 } else if (getLangOpts().CPlusPlus) {
12199 DiagID = diag::err_typecheck_comparison_of_pointer_integer;
12200 isError = true;
12201 } else if (IsOrdered)
12202 DiagID = diag::ext_typecheck_ordered_comparison_of_pointer_integer;
12203 else
12204 DiagID = diag::ext_typecheck_comparison_of_pointer_integer;
12205
12206 if (DiagID) {
12207 Diag(Loc, DiagID)
12208 << LHSType << RHSType << LHS.get()->getSourceRange()
12209 << RHS.get()->getSourceRange();
12210 if (isError)
12211 return QualType();
12212 }
12213
12214 if (LHSType->isIntegerType())
12215 LHS = ImpCastExprToType(LHS.get(), RHSType,
12216 LHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12217 else
12218 RHS = ImpCastExprToType(RHS.get(), LHSType,
12219 RHSIsNull ? CK_NullToPointer : CK_IntegralToPointer);
12220 return computeResultTy();
12221 }
12222
12223 // Handle block pointers.
12224 if (!IsOrdered && RHSIsNull
12225 && LHSType->isBlockPointerType() && RHSType->isIntegerType()) {
12226 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
12227 return computeResultTy();
12228 }
12229 if (!IsOrdered && LHSIsNull
12230 && LHSType->isIntegerType() && RHSType->isBlockPointerType()) {
12231 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_NullToPointer);
12232 return computeResultTy();
12233 }
12234
12235 if (getLangOpts().getOpenCLCompatibleVersion() >= 200) {
12236 if (LHSType->isClkEventT() && RHSType->isClkEventT()) {
12237 return computeResultTy();
12238 }
12239
12240 if (LHSType->isQueueT() && RHSType->isQueueT()) {
12241 return computeResultTy();
12242 }
12243
12244 if (LHSIsNull && RHSType->isQueueT()) {
12245 LHS = ImpCastExprToType(LHS.get(), RHSType, CK_NullToPointer);
12246 return computeResultTy();
12247 }
12248
12249 if (LHSType->isQueueT() && RHSIsNull) {
12250 RHS = ImpCastExprToType(RHS.get(), LHSType, CK_NullToPointer);
12251 return computeResultTy();
12252 }
12253 }
12254
12255 return InvalidOperands(Loc, LHS, RHS);
12256}
12257
12258// Return a signed ext_vector_type that is of identical size and number of
12259// elements. For floating point vectors, return an integer type of identical
12260// size and number of elements. In the non ext_vector_type case, search from
12261// the largest type to the smallest type to avoid cases where long long == long,
12262// where long gets picked over long long.
12263QualType Sema::GetSignedVectorType(QualType V) {
12264 const VectorType *VTy = V->castAs<VectorType>();
12265 unsigned TypeSize = Context.getTypeSize(VTy->getElementType());
12266
12267 if (isa<ExtVectorType>(VTy)) {
12268 if (TypeSize == Context.getTypeSize(Context.CharTy))
12269 return Context.getExtVectorType(Context.CharTy, VTy->getNumElements());
12270 else if (TypeSize == Context.getTypeSize(Context.ShortTy))
12271 return Context.getExtVectorType(Context.ShortTy, VTy->getNumElements());
12272 else if (TypeSize == Context.getTypeSize(Context.IntTy))
12273 return Context.getExtVectorType(Context.IntTy, VTy->getNumElements());
12274 else if (TypeSize == Context.getTypeSize(Context.LongTy))
12275 return Context.getExtVectorType(Context.LongTy, VTy->getNumElements());
12276 assert(TypeSize == Context.getTypeSize(Context.LongLongTy) &&(static_cast<void> (0))
12277 "Unhandled vector element size in vector compare")(static_cast<void> (0));
12278 return Context.getExtVectorType(Context.LongLongTy, VTy->getNumElements());
12279 }
12280
12281 if (TypeSize == Context.getTypeSize(Context.LongLongTy))
12282 return Context.getVectorType(Context.LongLongTy, VTy->getNumElements(),
12283 VectorType::GenericVector);
12284 else if (TypeSize == Context.getTypeSize(Context.LongTy))
12285 return Context.getVectorType(Context.LongTy, VTy->getNumElements(),
12286 VectorType::GenericVector);
12287 else if (TypeSize == Context.getTypeSize(Context.IntTy))
12288 return Context.getVectorType(Context.IntTy, VTy->getNumElements(),
12289 VectorType::GenericVector);
12290 else if (TypeSize == Context.getTypeSize(Context.ShortTy))
12291 return Context.getVectorType(Context.ShortTy, VTy->getNumElements(),
12292 VectorType::GenericVector);
12293 assert(TypeSize == Context.getTypeSize(Context.CharTy) &&(static_cast<void> (0))
12294 "Unhandled vector element size in vector compare")(static_cast<void> (0));
12295 return Context.getVectorType(Context.CharTy, VTy->getNumElements(),
12296 VectorType::GenericVector);
12297}
12298
12299/// CheckVectorCompareOperands - vector comparisons are a clang extension that
12300/// operates on extended vector types. Instead of producing an IntTy result,
12301/// like a scalar comparison, a vector comparison produces a vector of integer
12302/// types.
12303QualType Sema::CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
12304 SourceLocation Loc,
12305 BinaryOperatorKind Opc) {
12306 if (Opc == BO_Cmp) {
12307 Diag(Loc, diag::err_three_way_vector_comparison);
12308 return QualType();
12309 }
12310
12311 // Check to make sure we're operating on vectors of the same type and width,
12312 // Allowing one side to be a scalar of element type.
12313 QualType vType = CheckVectorOperands(LHS, RHS, Loc, /*isCompAssign*/false,
12314 /*AllowBothBool*/true,
12315 /*AllowBoolConversions*/getLangOpts().ZVector);
12316 if (vType.isNull())
12317 return vType;
12318
12319 QualType LHSType = LHS.get()->getType();
12320
12321 // Determine the return type of a vector compare. By default clang will return
12322 // a scalar for all vector compares except vector bool and vector pixel.
12323 // With the gcc compiler we will always return a vector type and with the xl
12324 // compiler we will always return a scalar type. This switch allows choosing
12325 // which behavior is prefered.
12326 if (getLangOpts().AltiVec) {
12327 switch (getLangOpts().getAltivecSrcCompat()) {
12328 case LangOptions::AltivecSrcCompatKind::Mixed:
12329 // If AltiVec, the comparison results in a numeric type, i.e.
12330 // bool for C++, int for C
12331 if (vType->castAs<VectorType>()->getVectorKind() ==
12332 VectorType::AltiVecVector)
12333 return Context.getLogicalOperationType();
12334 else
12335 Diag(Loc, diag::warn_deprecated_altivec_src_compat);
12336 break;
12337 case LangOptions::AltivecSrcCompatKind::GCC:
12338 // For GCC we always return the vector type.
12339 break;
12340 case LangOptions::AltivecSrcCompatKind::XL:
12341 return Context.getLogicalOperationType();
12342 break;
12343 }
12344 }
12345
12346 // For non-floating point types, check for self-comparisons of the form
12347 // x == x, x != x, x < x, etc. These always evaluate to a constant, and
12348 // often indicate logic errors in the program.
12349 diagnoseTautologicalComparison(*this, Loc, LHS.get(), RHS.get(), Opc);
12350
12351 // Check for comparisons of floating point operands using != and ==.
12352 if (BinaryOperator::isEqualityOp(Opc) &&
12353 LHSType->hasFloatingRepresentation()) {
12354 assert(RHS.get()->getType()->hasFloatingRepresentation())(static_cast<void> (0));
12355 CheckFloatComparison(Loc, LHS.get(), RHS.get());
12356 }
12357
12358 // Return a signed type for the vector.
12359 return GetSignedVectorType(vType);
12360}
12361
12362static void diagnoseXorMisusedAsPow(Sema &S, const ExprResult &XorLHS,
12363 const ExprResult &XorRHS,
12364 const SourceLocation Loc) {
12365 // Do not diagnose macros.
12366 if (Loc.isMacroID())
12367 return;
12368
12369 // Do not diagnose if both LHS and RHS are macros.
12370 if (XorLHS.get()->getExprLoc().isMacroID() &&
12371 XorRHS.get()->getExprLoc().isMacroID())
12372 return;
12373
12374 bool Negative = false;
12375 bool ExplicitPlus = false;
12376 const auto *LHSInt = dyn_cast<IntegerLiteral>(XorLHS.get());
12377 const auto *RHSInt = dyn_cast<IntegerLiteral>(XorRHS.get());
12378
12379 if (!LHSInt)
12380 return;
12381 if (!RHSInt) {
12382 // Check negative literals.
12383 if (const auto *UO = dyn_cast<UnaryOperator>(XorRHS.get())) {
12384 UnaryOperatorKind Opc = UO->getOpcode();
12385 if (Opc != UO_Minus && Opc != UO_Plus)
12386 return;
12387 RHSInt = dyn_cast<IntegerLiteral>(UO->getSubExpr());
12388 if (!RHSInt)
12389 return;
12390 Negative = (Opc == UO_Minus);
12391 ExplicitPlus = !Negative;
12392 } else {
12393 return;
12394 }
12395 }
12396
12397 const llvm::APInt &LeftSideValue = LHSInt->getValue();
12398 llvm::APInt RightSideValue = RHSInt->getValue();
12399 if (LeftSideValue != 2 && LeftSideValue != 10)
12400 return;
12401
12402 if (LeftSideValue.getBitWidth() != RightSideValue.getBitWidth())
12403 return;
12404
12405 CharSourceRange ExprRange = CharSourceRange::getCharRange(
12406 LHSInt->getBeginLoc(), S.getLocForEndOfToken(RHSInt->getLocation()));
12407 llvm::StringRef ExprStr =
12408 Lexer::getSourceText(ExprRange, S.getSourceManager(), S.getLangOpts());
12409
12410 CharSourceRange XorRange =
12411 CharSourceRange::getCharRange(Loc, S.getLocForEndOfToken(Loc));
12412 llvm::StringRef XorStr =
12413 Lexer::getSourceText(XorRange, S.getSourceManager(), S.getLangOpts());
12414 // Do not diagnose if xor keyword/macro is used.
12415 if (XorStr == "xor")
12416 return;
12417
12418 std::string LHSStr = std::string(Lexer::getSourceText(
12419 CharSourceRange::getTokenRange(LHSInt->getSourceRange()),
12420 S.getSourceManager(), S.getLangOpts()));
12421 std::string RHSStr = std::string(Lexer::getSourceText(
12422 CharSourceRange::getTokenRange(RHSInt->getSourceRange()),
12423 S.getSourceManager(), S.getLangOpts()));
12424
12425 if (Negative) {
12426 RightSideValue = -RightSideValue;
12427 RHSStr = "-" + RHSStr;
12428 } else if (ExplicitPlus) {
12429 RHSStr = "+" + RHSStr;
12430 }
12431
12432 StringRef LHSStrRef = LHSStr;
12433 StringRef RHSStrRef = RHSStr;
12434 // Do not diagnose literals with digit separators, binary, hexadecimal, octal
12435 // literals.
12436 if (LHSStrRef.startswith("0b") || LHSStrRef.startswith("0B") ||
12437 RHSStrRef.startswith("0b") || RHSStrRef.startswith("0B") ||
12438 LHSStrRef.startswith("0x") || LHSStrRef.startswith("0X") ||
12439 RHSStrRef.startswith("0x") || RHSStrRef.startswith("0X") ||
12440 (LHSStrRef.size() > 1 && LHSStrRef.startswith("0")) ||
12441 (RHSStrRef.size() > 1 && RHSStrRef.startswith("0")) ||
12442 LHSStrRef.find('\'') != StringRef::npos ||
12443 RHSStrRef.find('\'') != StringRef::npos)
12444 return;
12445
12446 bool SuggestXor =
12447 S.getLangOpts().CPlusPlus || S.getPreprocessor().isMacroDefined("xor");
12448 const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
12449 int64_t RightSideIntValue = RightSideValue.getSExtValue();
12450 if (LeftSideValue == 2 && RightSideIntValue >= 0) {
12451 std::string SuggestedExpr = "1 << " + RHSStr;
12452 bool Overflow = false;
12453 llvm::APInt One = (LeftSideValue - 1);
12454 llvm::APInt PowValue = One.sshl_ov(RightSideValue, Overflow);
12455 if (Overflow) {
12456 if (RightSideIntValue < 64)
12457 S.Diag(Loc, diag::warn_xor_used_as_pow_base)
12458 << ExprStr << toString(XorValue, 10, true) << ("1LL << " + RHSStr)
12459 << FixItHint::CreateReplacement(ExprRange, "1LL << " + RHSStr);
12460 else if (RightSideIntValue == 64)
12461 S.Diag(Loc, diag::warn_xor_used_as_pow)
12462 << ExprStr << toString(XorValue, 10, true);
12463 else
12464 return;
12465 } else {
12466 S.Diag(Loc, diag::warn_xor_used_as_pow_base_extra)
12467 << ExprStr << toString(XorValue, 10, true) << SuggestedExpr
12468 << toString(PowValue, 10, true)
12469 << FixItHint::CreateReplacement(
12470 ExprRange, (RightSideIntValue == 0) ? "1" : SuggestedExpr);
12471 }
12472
12473 S.Diag(Loc, diag::note_xor_used_as_pow_silence)
12474 << ("0x2 ^ " + RHSStr) << SuggestXor;
12475 } else if (LeftSideValue == 10) {
12476 std::string SuggestedValue = "1e" + std::to_string(RightSideIntValue);
12477 S.Diag(Loc, diag::warn_xor_used_as_pow_base)
12478 << ExprStr << toString(XorValue, 10, true) << SuggestedValue
12479 << FixItHint::CreateReplacement(ExprRange, SuggestedValue);
12480 S.Diag(Loc, diag::note_xor_used_as_pow_silence)
12481 << ("0xA ^ " + RHSStr) << SuggestXor;
12482 }
12483}
12484
12485QualType Sema::CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS,
12486 SourceLocation Loc) {
12487 // Ensure that either both operands are of the same vector type, or
12488 // one operand is of a vector type and the other is of its element type.
12489 QualType vType = CheckVectorOperands(LHS, RHS, Loc, false,
12490 /*AllowBothBool*/true,
12491 /*AllowBoolConversions*/false);
12492 if (vType.isNull())
12493 return InvalidOperands(Loc, LHS, RHS);
12494 if (getLangOpts().OpenCL &&
12495 getLangOpts().getOpenCLCompatibleVersion() < 120 &&
12496 vType->hasFloatingRepresentation())
12497 return InvalidOperands(Loc, LHS, RHS);
12498 // FIXME: The check for C++ here is for GCC compatibility. GCC rejects the
12499 // usage of the logical operators && and || with vectors in C. This
12500 // check could be notionally dropped.
12501 if (!getLangOpts().CPlusPlus &&
12502 !(isa<ExtVectorType>(vType->getAs<VectorType>())))
12503 return InvalidLogicalVectorOperands(Loc, LHS, RHS);
12504
12505 return GetSignedVectorType(LHS.get()->getType());
12506}
12507
12508QualType Sema::CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS,
12509 SourceLocation Loc,
12510 bool IsCompAssign) {
12511 if (!IsCompAssign) {
12512 LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
12513 if (LHS.isInvalid())
12514 return QualType();
12515 }
12516 RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
12517 if (RHS.isInvalid())
12518 return QualType();
12519
12520 // For conversion purposes, we ignore any qualifiers.
12521 // For example, "const float" and "float" are equivalent.
12522 QualType LHSType = LHS.get()->getType().getUnqualifiedType();
12523 QualType RHSType = RHS.get()->getType().getUnqualifiedType();
12524
12525 const MatrixType *LHSMatType = LHSType->getAs<MatrixType>();
12526 const MatrixType *RHSMatType = RHSType->getAs<MatrixType>();
12527 assert((LHSMatType || RHSMatType) && "At least one operand must be a matrix")(static_cast<void> (0));
12528
12529 if (Context.hasSameType(LHSType, RHSType))
12530 return LHSType;
12531
12532 // Type conversion may change LHS/RHS. Keep copies to the original results, in
12533 // case we have to return InvalidOperands.
12534 ExprResult OriginalLHS = LHS;
12535 ExprResult OriginalRHS = RHS;
12536 if (LHSMatType && !RHSMatType) {
12537 RHS = tryConvertExprToType(RHS.get(), LHSMatType->getElementType());
12538 if (!RHS.isInvalid())
12539 return LHSType;
12540
12541 return InvalidOperands(Loc, OriginalLHS, OriginalRHS);
12542 }
12543
12544 if (!LHSMatType && RHSMatType) {
12545 LHS = tryConvertExprToType(LHS.get(), RHSMatType->getElementType());
12546 if (!LHS.isInvalid())
12547 return RHSType;
12548 return InvalidOperands(Loc, OriginalLHS, OriginalRHS);
12549 }
12550
12551 return InvalidOperands(Loc, LHS, RHS);
12552}
12553
12554QualType Sema::CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS,
12555 SourceLocation Loc,
12556 bool IsCompAssign) {
12557 if (!IsCompAssign) {
12558 LHS = DefaultFunctionArrayLvalueConversion(LHS.get());
12559 if (LHS.isInvalid())
12560 return QualType();
12561 }
12562 RHS = DefaultFunctionArrayLvalueConversion(RHS.get());
12563 if (RHS.isInvalid())
12564 return QualType();
12565
12566 auto *LHSMatType = LHS.get()->getType()->getAs<ConstantMatrixType>();
12567 auto *RHSMatType = RHS.get()->getType()->getAs<ConstantMatrixType>();
12568 assert((LHSMatType || RHSMatType) && "At least one operand must be a matrix")(static_cast<void> (0));
12569
12570 if (LHSMatType && RHSMatType) {
12571 if (LHSMatType->getNumColumns() != RHSMatType->getNumRows())
12572 return InvalidOperands(Loc, LHS, RHS);
12573
12574 if (!Context.hasSameType(LHSMatType->getElementType(),
12575 RHSMatType->getElementType()))
12576 return InvalidOperands(Loc, LHS, RHS);
12577
12578 return Context.getConstantMatrixType(LHSMatType->getElementType(),
12579 LHSMatType->getNumRows(),
12580 RHSMatType->getNumColumns());
12581 }
12582 return CheckMatrixElementwiseOperands(LHS, RHS, Loc, IsCompAssign);
12583}
12584
12585inline QualType Sema::CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS,
12586 SourceLocation Loc,
12587 BinaryOperatorKind Opc) {
12588 checkArithmeticNull(*this, LHS, RHS, Loc, /*IsCompare=*/false);
12589
12590 bool IsCompAssign =
12591 Opc == BO_AndAssign || Opc == BO_OrAssign || Opc == BO_XorAssign;
12592
12593 if (LHS.get()->getType()->isVectorType() ||
12594 RHS.get()->getType()->isVectorType()) {
12595 if (LHS.get()->getType()->hasIntegerRepresentation() &&
12596 RHS.get()->getType()->hasIntegerRepresentation())
12597 return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign,
12598 /*AllowBothBool*/true,
12599 /*AllowBoolConversions*/getLangOpts().ZVector);
12600 return InvalidOperands(Loc, LHS, RHS);
12601 }
12602
12603 if (Opc == BO_And)
12604 diagnoseLogicalNotOnLHSofCheck(*this, LHS, RHS, Loc, Opc);
12605
12606 if (LHS.get()->getType()->hasFloatingRepresentation() ||
12607 RHS.get()->getType()->hasFloatingRepresentation())
12608 return InvalidOperands(Loc, LHS, RHS);
12609
12610 ExprResult LHSResult = LHS, RHSResult = RHS;
12611 QualType compType = UsualArithmeticConversions(
12612 LHSResult, RHSResult, Loc, IsCompAssign ? ACK_CompAssign : ACK_BitwiseOp);
12613 if (LHSResult.isInvalid() || RHSResult.isInvalid())
12614 return QualType();
12615 LHS = LHSResult.get();
12616 RHS = RHSResult.get();
12617
12618 if (Opc == BO_Xor)
12619 diagnoseXorMisusedAsPow(*this, LHS, RHS, Loc);
12620
12621 if (!compType.isNull() && compType->isIntegralOrUnscopedEnumerationType())
12622 return compType;
12623 return InvalidOperands(Loc, LHS, RHS);
12624}
12625
12626// C99 6.5.[13,14]
12627inline QualType Sema::CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS,
12628 SourceLocation Loc,
12629 BinaryOperatorKind Opc) {
12630 // Check vector operands differently.
12631 if (LHS.get()->getType()->isVectorType() || RHS.get()->getType()->isVectorType())
12632 return CheckVectorLogicalOperands(LHS, RHS, Loc);
12633
12634 bool EnumConstantInBoolContext = false;
12635 for (const ExprResult &HS : {LHS, RHS}) {
12636 if (const auto *DREHS = dyn_cast<DeclRefExpr>(HS.get())) {
12637 const auto *ECDHS = dyn_cast<EnumConstantDecl>(DREHS->getDecl());
12638 if (ECDHS && ECDHS->getInitVal() != 0 && ECDHS->getInitVal() != 1)
12639 EnumConstantInBoolContext = true;
12640 }
12641 }
12642
12643 if (EnumConstantInBoolContext)
12644 Diag(Loc, diag::warn_enum_constant_in_bool_context);
12645
12646 // Diagnose cases where the user write a logical and/or but probably meant a
12647 // bitwise one. We do this when the LHS is a non-bool integer and the RHS
12648 // is a constant.
12649 if (!EnumConstantInBoolContext && LHS.get()->getType()->isIntegerType() &&
12650 !LHS.get()->getType()->isBooleanType() &&
12651 RHS.get()->getType()->isIntegerType() && !RHS.get()->isValueDependent() &&
12652 // Don't warn in macros or template instantiations.
12653 !Loc.isMacroID() && !inTemplateInstantiation()) {
12654 // If the RHS can be constant folded, and if it constant folds to something
12655 // that isn't 0 or 1 (which indicate a potential logical operation that
12656 // happened to fold to true/false) then warn.
12657 // Parens on the RHS are ignored.
12658 Expr::EvalResult EVResult;
12659 if (RHS.get()->EvaluateAsInt(EVResult, Context)) {
12660 llvm::APSInt Result = EVResult.Val.getInt();
12661 if ((getLangOpts().Bool && !RHS.get()->getType()->isBooleanType() &&
12662 !RHS.get()->getExprLoc().isMacroID()) ||
12663 (Result != 0 && Result != 1)) {
12664 Diag(Loc, diag::warn_logical_instead_of_bitwise)
12665 << RHS.get()->getSourceRange()
12666 << (Opc == BO_LAnd ? "&&" : "||");
12667 // Suggest replacing the logical operator with the bitwise version
12668 Diag(Loc, diag::note_logical_instead_of_bitwise_change_operator)
12669 << (Opc == BO_LAnd ? "&" : "|")
12670 << FixItHint::CreateReplacement(SourceRange(
12671 Loc, getLocForEndOfToken(Loc)),
12672 Opc == BO_LAnd ? "&" : "|");
12673 if (Opc == BO_LAnd)
12674 // Suggest replacing "Foo() && kNonZero" with "Foo()"
12675 Diag(Loc, diag::note_logical_instead_of_bitwise_remove_constant)
12676 << FixItHint::CreateRemoval(
12677 SourceRange(getLocForEndOfToken(LHS.get()->getEndLoc()),
12678 RHS.get()->getEndLoc()));
12679 }
12680 }
12681 }
12682
12683 if (!Context.getLangOpts().CPlusPlus) {
12684 // OpenCL v1.1 s6.3.g: The logical operators and (&&), or (||) do
12685 // not operate on the built-in scalar and vector float types.
12686 if (Context.getLangOpts().OpenCL &&
12687 Context.getLangOpts().OpenCLVersion < 120) {
12688 if (LHS.get()->getType()->isFloatingType() ||
12689 RHS.get()->getType()->isFloatingType())
12690 return InvalidOperands(Loc, LHS, RHS);
12691 }
12692
12693 LHS = UsualUnaryConversions(LHS.get());
12694 if (LHS.isInvalid())
12695 return QualType();
12696
12697 RHS = UsualUnaryConversions(RHS.get());
12698 if (RHS.isInvalid())
12699 return QualType();
12700
12701 if (!LHS.get()->getType()->isScalarType() ||
12702 !RHS.get()->getType()->isScalarType())
12703 return InvalidOperands(Loc, LHS, RHS);
12704
12705 return Context.IntTy;
12706 }
12707
12708 // The following is safe because we only use this method for
12709 // non-overloadable operands.
12710
12711 // C++ [expr.log.and]p1
12712 // C++ [expr.log.or]p1
12713 // The operands are both contextually converted to type bool.
12714 ExprResult LHSRes = PerformContextuallyConvertToBool(LHS.get());
12715 if (LHSRes.isInvalid())
12716 return InvalidOperands(Loc, LHS, RHS);
12717 LHS = LHSRes;
12718
12719 ExprResult RHSRes = PerformContextuallyConvertToBool(RHS.get());
12720 if (RHSRes.isInvalid())
12721 return InvalidOperands(Loc, LHS, RHS);
12722 RHS = RHSRes;
12723
12724 // C++ [expr.log.and]p2
12725 // C++ [expr.log.or]p2
12726 // The result is a bool.
12727 return Context.BoolTy;
12728}
12729
12730static bool IsReadonlyMessage(Expr *E, Sema &S) {
12731 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
12732 if (!ME) return false;
12733 if (!isa<FieldDecl>(ME->getMemberDecl())) return false;
12734 ObjCMessageExpr *Base = dyn_cast<ObjCMessageExpr>(
12735 ME->getBase()->IgnoreImplicit()->IgnoreParenImpCasts());
12736 if (!Base) return false;
12737 return Base->getMethodDecl() != nullptr;
12738}
12739
12740/// Is the given expression (which must be 'const') a reference to a
12741/// variable which was originally non-const, but which has become
12742/// 'const' due to being captured within a block?
12743enum NonConstCaptureKind { NCCK_None, NCCK_Block, NCCK_Lambda };
12744static NonConstCaptureKind isReferenceToNonConstCapture(Sema &S, Expr *E) {
12745 assert(E->isLValue() && E->getType().isConstQualified())(static_cast<void> (0));
12746 E = E->IgnoreParens();
12747
12748 // Must be a reference to a declaration from an enclosing scope.
12749 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
12750 if (!DRE) return NCCK_None;
12751 if (!DRE->refersToEnclosingVariableOrCapture()) return NCCK_None;
12752
12753 // The declaration must be a variable which is not declared 'const'.
12754 VarDecl *var = dyn_cast<VarDecl>(DRE->getDecl());
12755 if (!var) return NCCK_None;
12756 if (var->getType().isConstQualified()) return NCCK_None;
12757 assert(var->hasLocalStorage() && "capture added 'const' to non-local?")(static_cast<void> (0));
12758
12759 // Decide whether the first capture was for a block or a lambda.
12760 DeclContext *DC = S.CurContext, *Prev = nullptr;
12761 // Decide whether the first capture was for a block or a lambda.
12762 while (DC) {
12763 // For init-capture, it is possible that the variable belongs to the
12764 // template pattern of the current context.
12765 if (auto *FD = dyn_cast<FunctionDecl>(DC))
12766 if (var->isInitCapture() &&
12767 FD->getTemplateInstantiationPattern() == var->getDeclContext())
12768 break;
12769 if (DC == var->getDeclContext())
12770 break;
12771 Prev = DC;
12772 DC = DC->getParent();
12773 }
12774 // Unless we have an init-capture, we've gone one step too far.
12775 if (!var->isInitCapture())
12776 DC = Prev;
12777 return (isa<BlockDecl>(DC) ? NCCK_Block : NCCK_Lambda);
12778}
12779
12780static bool IsTypeModifiable(QualType Ty, bool IsDereference) {
12781 Ty = Ty.getNonReferenceType();
12782 if (IsDereference && Ty->isPointerType())
12783 Ty = Ty->getPointeeType();
12784 return !Ty.isConstQualified();
12785}
12786
12787// Update err_typecheck_assign_const and note_typecheck_assign_const
12788// when this enum is changed.
12789enum {
12790 ConstFunction,
12791 ConstVariable,
12792 ConstMember,
12793 ConstMethod,
12794 NestedConstMember,
12795 ConstUnknown, // Keep as last element
12796};
12797
12798/// Emit the "read-only variable not assignable" error and print notes to give
12799/// more information about why the variable is not assignable, such as pointing
12800/// to the declaration of a const variable, showing that a method is const, or
12801/// that the function is returning a const reference.
12802static void DiagnoseConstAssignment(Sema &S, const Expr *E,
12803 SourceLocation Loc) {
12804 SourceRange ExprRange = E->getSourceRange();
12805
12806 // Only emit one error on the first const found. All other consts will emit
12807 // a note to the error.
12808 bool DiagnosticEmitted = false;
12809
12810 // Track if the current expression is the result of a dereference, and if the
12811 // next checked expression is the result of a dereference.
12812 bool IsDereference = false;
12813 bool NextIsDereference = false;
12814
12815 // Loop to process MemberExpr chains.
12816 while (true) {
12817 IsDereference = NextIsDereference;
12818
12819 E = E->IgnoreImplicit()->IgnoreParenImpCasts();
12820 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
12821 NextIsDereference = ME->isArrow();
12822 const ValueDecl *VD = ME->getMemberDecl();
12823 if (const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {
12824 // Mutable fields can be modified even if the class is const.
12825 if (Field->isMutable()) {
12826 assert(DiagnosticEmitted && "Expected diagnostic not emitted.")(static_cast<void> (0));
12827 break;
12828 }
12829
12830 if (!IsTypeModifiable(Field->getType(), IsDereference)) {
12831 if (!DiagnosticEmitted) {
12832 S.Diag(Loc, diag::err_typecheck_assign_const)
12833 << ExprRange << ConstMember << false /*static*/ << Field
12834 << Field->getType();
12835 DiagnosticEmitted = true;
12836 }
12837 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
12838 << ConstMember << false /*static*/ << Field << Field->getType()
12839 << Field->getSourceRange();
12840 }
12841 E = ME->getBase();
12842 continue;
12843 } else if (const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {
12844 if (VDecl->getType().isConstQualified()) {
12845 if (!DiagnosticEmitted) {
12846 S.Diag(Loc, diag::err_typecheck_assign_const)
12847 << ExprRange << ConstMember << true /*static*/ << VDecl
12848 << VDecl->getType();
12849 DiagnosticEmitted = true;
12850 }
12851 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
12852 << ConstMember << true /*static*/ << VDecl << VDecl->getType()
12853 << VDecl->getSourceRange();
12854 }
12855 // Static fields do not inherit constness from parents.
12856 break;
12857 }
12858 break; // End MemberExpr
12859 } else if (const ArraySubscriptExpr *ASE =
12860 dyn_cast<ArraySubscriptExpr>(E)) {
12861 E = ASE->getBase()->IgnoreParenImpCasts();
12862 continue;
12863 } else if (const ExtVectorElementExpr *EVE =
12864 dyn_cast<ExtVectorElementExpr>(E)) {
12865 E = EVE->getBase()->IgnoreParenImpCasts();
12866 continue;
12867 }
12868 break;
12869 }
12870
12871 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
12872 // Function calls
12873 const FunctionDecl *FD = CE->getDirectCallee();
12874 if (FD && !IsTypeModifiable(FD->getReturnType(), IsDereference)) {
12875 if (!DiagnosticEmitted) {
12876 S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
12877 << ConstFunction << FD;
12878 DiagnosticEmitted = true;
12879 }
12880 S.Diag(FD->getReturnTypeSourceRange().getBegin(),
12881 diag::note_typecheck_assign_const)
12882 << ConstFunction << FD << FD->getReturnType()
12883 << FD->getReturnTypeSourceRange();
12884 }
12885 } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
12886 // Point to variable declaration.
12887 if (const ValueDecl *VD = DRE->getDecl()) {
12888 if (!IsTypeModifiable(VD->getType(), IsDereference)) {
12889 if (!DiagnosticEmitted) {
12890 S.Diag(Loc, diag::err_typecheck_assign_const)
12891 << ExprRange << ConstVariable << VD << VD->getType();
12892 DiagnosticEmitted = true;
12893 }
12894 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
12895 << ConstVariable << VD << VD->getType() << VD->getSourceRange();
12896 }
12897 }
12898 } else if (isa<CXXThisExpr>(E)) {
12899 if (const DeclContext *DC = S.getFunctionLevelDeclContext()) {
12900 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {
12901 if (MD->isConst()) {
12902 if (!DiagnosticEmitted) {
12903 S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange
12904 << ConstMethod << MD;
12905 DiagnosticEmitted = true;
12906 }
12907 S.Diag(MD->getLocation(), diag::note_typecheck_assign_const)
12908 << ConstMethod << MD << MD->getSourceRange();
12909 }
12910 }
12911 }
12912 }
12913
12914 if (DiagnosticEmitted)
12915 return;
12916
12917 // Can't determine a more specific message, so display the generic error.
12918 S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstUnknown;
12919}
12920
12921enum OriginalExprKind {
12922 OEK_Variable,
12923 OEK_Member,
12924 OEK_LValue
12925};
12926
12927static void DiagnoseRecursiveConstFields(Sema &S, const ValueDecl *VD,
12928 const RecordType *Ty,
12929 SourceLocation Loc, SourceRange Range,
12930 OriginalExprKind OEK,
12931 bool &DiagnosticEmitted) {
12932 std::vector<const RecordType *> RecordTypeList;
12933 RecordTypeList.push_back(Ty);
12934 unsigned NextToCheckIndex = 0;
12935 // We walk the record hierarchy breadth-first to ensure that we print
12936 // diagnostics in field nesting order.
12937 while (RecordTypeList.size() > NextToCheckIndex) {
12938 bool IsNested = NextToCheckIndex > 0;
12939 for (const FieldDecl *Field :
12940 RecordTypeList[NextToCheckIndex]->getDecl()->fields()) {
12941 // First, check every field for constness.
12942 QualType FieldTy = Field->getType();
12943 if (FieldTy.isConstQualified()) {
12944 if (!DiagnosticEmitted) {
12945 S.Diag(Loc, diag::err_typecheck_assign_const)
12946 << Range << NestedConstMember << OEK << VD
12947 << IsNested << Field;
12948 DiagnosticEmitted = true;
12949 }
12950 S.Diag(Field->getLocation(), diag::note_typecheck_assign_const)
12951 << NestedConstMember << IsNested << Field
12952 << FieldTy << Field->getSourceRange();
12953 }
12954
12955 // Then we append it to the list to check next in order.
12956 FieldTy = FieldTy.getCanonicalType();
12957 if (const auto *FieldRecTy = FieldTy->getAs<RecordType>()) {
12958 if (llvm::find(RecordTypeList, FieldRecTy) == RecordTypeList.end())
12959 RecordTypeList.push_back(FieldRecTy);
12960 }
12961 }
12962 ++NextToCheckIndex;
12963 }
12964}
12965
12966/// Emit an error for the case where a record we are trying to assign to has a
12967/// const-qualified field somewhere in its hierarchy.
12968static void DiagnoseRecursiveConstFields(Sema &S, const Expr *E,
12969 SourceLocation Loc) {
12970 QualType Ty = E->getType();
12971 assert(Ty->isRecordType() && "lvalue was not record?")(static_cast<void> (0));
12972 SourceRange Range = E->getSourceRange();
12973 const RecordType *RTy = Ty.getCanonicalType()->getAs<RecordType>();
12974 bool DiagEmitted = false;
12975
12976 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
12977 DiagnoseRecursiveConstFields(S, ME->getMemberDecl(), RTy, Loc,
12978 Range, OEK_Member, DiagEmitted);
12979 else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
12980 DiagnoseRecursiveConstFields(S, DRE->getDecl(), RTy, Loc,
12981 Range, OEK_Variable, DiagEmitted);
12982 else
12983 DiagnoseRecursiveConstFields(S, nullptr, RTy, Loc,
12984 Range, OEK_LValue, DiagEmitted);
12985 if (!DiagEmitted)
12986 DiagnoseConstAssignment(S, E, Loc);
12987}
12988
12989/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue. If not,
12990/// emit an error and return true. If so, return false.
12991static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
12992 assert(!E->hasPlaceholderType(BuiltinType::PseudoObject))(static_cast<void> (0));
12993
12994 S.CheckShadowingDeclModification(E, Loc);
12995
12996 SourceLocation OrigLoc = Loc;
12997 Expr::isModifiableLvalueResult IsLV = E->isModifiableLvalue(S.Context,
12998 &Loc);
12999 if (IsLV == Expr::MLV_ClassTemporary && IsReadonlyMessage(E, S))
13000 IsLV = Expr::MLV_InvalidMessageExpression;
13001 if (IsLV == Expr::MLV_Valid)
13002 return false;
13003
13004 unsigned DiagID = 0;
13005 bool NeedType = false;
13006 switch (IsLV) { // C99 6.5.16p2
13007 case Expr::MLV_ConstQualified:
13008 // Use a specialized diagnostic when we're assigning to an object
13009 // from an enclosing function or block.
13010 if (NonConstCaptureKind NCCK = isReferenceToNonConstCapture(S, E)) {
13011 if (NCCK == NCCK_Block)
13012 DiagID = diag::err_block_decl_ref_not_modifiable_lvalue;
13013 else
13014 DiagID = diag::err_lambda_decl_ref_not_modifiable_lvalue;
13015 break;
13016 }
13017
13018 // In ARC, use some specialized diagnostics for occasions where we
13019 // infer 'const'. These are always pseudo-strong variables.
13020 if (S.getLangOpts().ObjCAutoRefCount) {
13021 DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(E->IgnoreParenCasts());
13022 if (declRef && isa<VarDecl>(declRef->getDecl())) {
13023 VarDecl *var = cast<VarDecl>(declRef->getDecl());
13024
13025 // Use the normal diagnostic if it's pseudo-__strong but the
13026 // user actually wrote 'const'.
13027 if (var->isARCPseudoStrong() &&
13028 (!var->getTypeSourceInfo() ||
13029 !var->getTypeSourceInfo()->getType().isConstQualified())) {
13030 // There are three pseudo-strong cases:
13031 // - self
13032 ObjCMethodDecl *method = S.getCurMethodDecl();
13033 if (method && var == method->getSelfDecl()) {
13034 DiagID = method->isClassMethod()
13035 ? diag::err_typecheck_arc_assign_self_class_method
13036 : diag::err_typecheck_arc_assign_self;
13037
13038 // - Objective-C externally_retained attribute.
13039 } else if (var->hasAttr<ObjCExternallyRetainedAttr>() ||
13040 isa<ParmVarDecl>(var)) {
13041 DiagID = diag::err_typecheck_arc_assign_externally_retained;
13042
13043 // - fast enumeration variables
13044 } else {
13045 DiagID = diag::err_typecheck_arr_assign_enumeration;
13046 }
13047
13048 SourceRange Assign;
13049 if (Loc != OrigLoc)
13050 Assign = SourceRange(OrigLoc, OrigLoc);
13051 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
13052 // We need to preserve the AST regardless, so migration tool
13053 // can do its job.
13054 return false;
13055 }
13056 }
13057 }
13058
13059 // If none of the special cases above are triggered, then this is a
13060 // simple const assignment.
13061 if (DiagID == 0) {
13062 DiagnoseConstAssignment(S, E, Loc);
13063 return true;
13064 }
13065
13066 break;
13067 case Expr::MLV_ConstAddrSpace:
13068 DiagnoseConstAssignment(S, E, Loc);
13069 return true;
13070 case Expr::MLV_ConstQualifiedField:
13071 DiagnoseRecursiveConstFields(S, E, Loc);
13072 return true;
13073 case Expr::MLV_ArrayType:
13074 case Expr::MLV_ArrayTemporary:
13075 DiagID = diag::err_typecheck_array_not_modifiable_lvalue;
13076 NeedType = true;
13077 break;
13078 case Expr::MLV_NotObjectType:
13079 DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;
13080 NeedType = true;
13081 break;
13082 case Expr::MLV_LValueCast:
13083 DiagID = diag::err_typecheck_lvalue_casts_not_supported;
13084 break;
13085 case Expr::MLV_Valid:
13086 llvm_unreachable("did not take early return for MLV_Valid")__builtin_unreachable();
13087 case Expr::MLV_InvalidExpression:
13088 case Expr::MLV_MemberFunction:
13089 case Expr::MLV_ClassTemporary:
13090 DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;
13091 break;
13092 case Expr::MLV_IncompleteType:
13093 case Expr::MLV_IncompleteVoidType:
13094 return S.RequireCompleteType(Loc, E->getType(),
13095 diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);
13096 case Expr::MLV_DuplicateVectorComponents:
13097 DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;
13098 break;
13099 case Expr::MLV_NoSetterProperty:
13100 llvm_unreachable("readonly properties should be processed differently")__builtin_unreachable();
13101 case Expr::MLV_InvalidMessageExpression:
13102 DiagID = diag::err_readonly_message_assignment;
13103 break;
13104 case Expr::MLV_SubObjCPropertySetting:
13105 DiagID = diag::err_no_subobject_property_setting;
13106 break;
13107 }
13108
13109 SourceRange Assign;
13110 if (Loc != OrigLoc)
13111 Assign = SourceRange(OrigLoc, OrigLoc);
13112 if (NeedType)
13113 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
13114 else
13115 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
13116 return true;
13117}
13118
13119static void CheckIdentityFieldAssignment(Expr *LHSExpr, Expr *RHSExpr,
13120 SourceLocation Loc,
13121 Sema &Sema) {
13122 if (Sema.inTemplateInstantiation())
13123 return;
13124 if (Sema.isUnevaluatedContext())
13125 return;
13126 if (Loc.isInvalid() || Loc.isMacroID())
13127 return;
13128 if (LHSExpr->getExprLoc().isMacroID() || RHSExpr->getExprLoc().isMacroID())
13129 return;
13130
13131 // C / C++ fields
13132 MemberExpr *ML = dyn_cast<MemberExpr>(LHSExpr);
13133 MemberExpr *MR = dyn_cast<MemberExpr>(RHSExpr);
13134 if (ML && MR) {
13135 if (!(isa<CXXThisExpr>(ML->getBase()) && isa<CXXThisExpr>(MR->getBase())))
13136 return;
13137 const ValueDecl *LHSDecl =
13138 cast<ValueDecl>(ML->getMemberDecl()->getCanonicalDecl());
13139 const ValueDecl *RHSDecl =
13140 cast<ValueDecl>(MR->getMemberDecl()->getCanonicalDecl());
13141 if (LHSDecl != RHSDecl)
13142 return;
13143 if (LHSDecl->getType().isVolatileQualified())
13144 return;
13145 if (const ReferenceType *RefTy = LHSDecl->getType()->getAs<ReferenceType>())
13146 if (RefTy->getPointeeType().isVolatileQualified())
13147 return;
13148
13149 Sema.Diag(Loc, diag::warn_identity_field_assign) << 0;
13150 }
13151
13152 // Objective-C instance variables
13153 ObjCIvarRefExpr *OL = dyn_cast<ObjCIvarRefExpr>(LHSExpr);
13154 ObjCIvarRefExpr *OR = dyn_cast<ObjCIvarRefExpr>(RHSExpr);
13155 if (OL && OR && OL->getDecl() == OR->getDecl()) {
13156 DeclRefExpr *RL = dyn_cast<DeclRefExpr>(OL->getBase()->IgnoreImpCasts());
13157 DeclRefExpr *RR = dyn_cast<DeclRefExpr>(OR->getBase()->IgnoreImpCasts());
13158 if (RL && RR && RL->getDecl() == RR->getDecl())
13159 Sema.Diag(Loc, diag::warn_identity_field_assign) << 1;
13160 }
13161}
13162
13163// C99 6.5.16.1
13164QualType Sema::CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS,
13165 SourceLocation Loc,
13166 QualType CompoundType) {
13167 assert(!LHSExpr->hasPlaceholderType(BuiltinType::PseudoObject))(static_cast<void> (0));
13168
13169 // Verify that LHS is a modifiable lvalue, and emit error if not.
13170 if (CheckForModifiableLvalue(LHSExpr, Loc, *this))
13171 return QualType();
13172
13173 QualType LHSType = LHSExpr->getType();
13174 QualType RHSType = CompoundType.isNull() ? RHS.get()->getType() :
13175 CompoundType;
13176 // OpenCL v1.2 s6.1.1.1 p2:
13177 // The half data type can only be used to declare a pointer to a buffer that
13178 // contains half values
13179 if (getLangOpts().OpenCL &&
13180 !getOpenCLOptions().isAvailableOption("cl_khr_fp16", getLangOpts()) &&
13181 LHSType->isHalfType()) {
13182 Diag(Loc, diag::err_opencl_half_load_store) << 1
13183 << LHSType.getUnqualifiedType();
13184 return QualType();
13185 }
13186
13187 AssignConvertType ConvTy;
13188 if (CompoundType.isNull()) {
13189 Expr *RHSCheck = RHS.get();
13190
13191 CheckIdentityFieldAssignment(LHSExpr, RHSCheck, Loc, *this);
13192
13193 QualType LHSTy(LHSType);
13194 ConvTy = CheckSingleAssignmentConstraints(LHSTy, RHS);
13195 if (RHS.isInvalid())
13196 return QualType();
13197 // Special case of NSObject attributes on c-style pointer types.
13198 if (ConvTy == IncompatiblePointer &&
13199 ((Context.isObjCNSObjectType(LHSType) &&
13200 RHSType->isObjCObjectPointerType()) ||
13201 (Context.isObjCNSObjectType(RHSType) &&
13202 LHSType->isObjCObjectPointerType())))
13203 ConvTy = Compatible;
13204
13205 if (ConvTy == Compatible &&
13206 LHSType->isObjCObjectType())
13207 Diag(Loc, diag::err_objc_object_assignment)
13208 << LHSType;
13209
13210 // If the RHS is a unary plus or minus, check to see if they = and + are
13211 // right next to each other. If so, the user may have typo'd "x =+ 4"
13212 // instead of "x += 4".
13213 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(RHSCheck))
13214 RHSCheck = ICE->getSubExpr();
13215 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(RHSCheck)) {
13216 if ((UO->getOpcode() == UO_Plus || UO->getOpcode() == UO_Minus) &&
13217 Loc.isFileID() && UO->getOperatorLoc().isFileID() &&
13218 // Only if the two operators are exactly adjacent.
13219 Loc.getLocWithOffset(1) == UO->getOperatorLoc() &&
13220 // And there is a space or other character before the subexpr of the
13221 // unary +/-. We don't want to warn on "x=-1".
13222 Loc.getLocWithOffset(2) != UO->getSubExpr()->getBeginLoc() &&
13223 UO->getSubExpr()->getBeginLoc().isFileID()) {
13224 Diag(Loc, diag::warn_not_compound_assign)
13225 << (UO->getOpcode() == UO_Plus ? "+" : "-")
13226 << SourceRange(UO->getOperatorLoc(), UO->getOperatorLoc());
13227 }
13228 }
13229
13230 if (ConvTy == Compatible) {
13231 if (LHSType.getObjCLifetime() == Qualifiers::OCL_Strong) {
13232 // Warn about retain cycles where a block captures the LHS, but
13233 // not if the LHS is a simple variable into which the block is
13234 // being stored...unless that variable can be captured by reference!
13235 const Expr *InnerLHS = LHSExpr->IgnoreParenCasts();
13236 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InnerLHS);
13237 if (!DRE || DRE->getDecl()->hasAttr<BlocksAttr>())
13238 checkRetainCycles(LHSExpr, RHS.get());
13239 }
13240
13241 if (LHSType.getObjCLifetime() == Qualifiers::OCL_Strong ||
13242 LHSType.isNonWeakInMRRWithObjCWeak(Context)) {
13243 // It is safe to assign a weak reference into a strong variable.
13244 // Although this code can still have problems:
13245 // id x = self.weakProp;
13246 // id y = self.weakProp;
13247 // we do not warn to warn spuriously when 'x' and 'y' are on separate
13248 // paths through the function. This should be revisited if
13249 // -Wrepeated-use-of-weak is made flow-sensitive.
13250 // For ObjCWeak only, we do not warn if the assign is to a non-weak
13251 // variable, which will be valid for the current autorelease scope.
13252 if (!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
13253 RHS.get()->getBeginLoc()))
13254 getCurFunction()->markSafeWeakUse(RHS.get());
13255
13256 } else if (getLangOpts().ObjCAutoRefCount || getLangOpts().ObjCWeak) {
13257 checkUnsafeExprAssigns(Loc, LHSExpr, RHS.get());
13258 }
13259 }
13260 } else {
13261 // Compound assignment "x += y"
13262 ConvTy = CheckAssignmentConstraints(Loc, LHSType, RHSType);
13263 }
13264
13265 if (DiagnoseAssignmentResult(ConvTy, Loc, LHSType, RHSType,
13266 RHS.get(), AA_Assigning))
13267 return QualType();
13268
13269 CheckForNullPointerDereference(*this, LHSExpr);
13270
13271 if (getLangOpts().CPlusPlus20 && LHSType.isVolatileQualified()) {
13272 if (CompoundType.isNull()) {
13273 // C++2a [expr.ass]p5:
13274 // A simple-assignment whose left operand is of a volatile-qualified
13275 // type is deprecated unless the assignment is either a discarded-value
13276 // expression or an unevaluated operand
13277 ExprEvalContexts.back().VolatileAssignmentLHSs.push_back(LHSExpr);
13278 } else {
13279 // C++2a [expr.ass]p6:
13280 // [Compound-assignment] expressions are deprecated if E1 has
13281 // volatile-qualified type
13282 Diag(Loc, diag::warn_deprecated_compound_assign_volatile) << LHSType;
13283 }
13284 }
13285
13286 // C99 6.5.16p3: The type of an assignment expression is the type of the
13287 // left operand unless the left operand has qualified type, in which case
13288 // it is the unqualified version of the type of the left operand.
13289 // C99 6.5.16.1p2: In simple assignment, the value of the right operand
13290 // is converted to the type of the assignment expression (above).
13291 // C++ 5.17p1: the type of the assignment expression is that of its left
13292 // operand.
13293 return (getLangOpts().CPlusPlus
13294 ? LHSType : LHSType.getUnqualifiedType());
13295}
13296
13297// Only ignore explicit casts to void.
13298static bool IgnoreCommaOperand(const Expr *E) {
13299 E = E->IgnoreParens();
13300
13301 if (const CastExpr *CE = dyn_cast<CastExpr>(E)) {
13302 if (CE->getCastKind() == CK_ToVoid) {
13303 return true;
13304 }
13305
13306 // static_cast<void> on a dependent type will not show up as CK_ToVoid.
13307 if (CE->getCastKind() == CK_Dependent && E->getType()->isVoidType() &&
13308 CE->getSubExpr()->getType()->isDependentType()) {
13309 return true;
13310 }
13311 }
13312
13313 return false;
13314}
13315
13316// Look for instances where it is likely the comma operator is confused with
13317// another operator. There is an explicit list of acceptable expressions for
13318// the left hand side of the comma operator, otherwise emit a warning.
13319void Sema::DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc) {
13320 // No warnings in macros
13321 if (Loc.isMacroID())
13322 return;
13323
13324 // Don't warn in template instantiations.
13325 if (inTemplateInstantiation())
13326 return;
13327
13328 // Scope isn't fine-grained enough to explicitly list the specific cases, so
13329 // instead, skip more than needed, then call back into here with the
13330 // CommaVisitor in SemaStmt.cpp.
13331 // The listed locations are the initialization and increment portions
13332 // of a for loop. The additional checks are on the condition of
13333 // if statements, do/while loops, and for loops.
13334 // Differences in scope flags for C89 mode requires the extra logic.
13335 const unsigned ForIncrementFlags =
13336 getLangOpts().C99 || getLangOpts().CPlusPlus
13337 ? Scope::ControlScope | Scope::ContinueScope | Scope::BreakScope
13338 : Scope::ContinueScope | Scope::BreakScope;
13339 const unsigned ForInitFlags = Scope::ControlScope | Scope::DeclScope;
13340 const unsigned ScopeFlags = getCurScope()->getFlags();
13341 if ((ScopeFlags & ForIncrementFlags) == ForIncrementFlags ||
13342 (ScopeFlags & ForInitFlags) == ForInitFlags)
13343 return;
13344
13345 // If there are multiple comma operators used together, get the RHS of the
13346 // of the comma operator as the LHS.
13347 while (const BinaryOperator *BO = dyn_cast<BinaryOperator>(LHS)) {
13348 if (BO->getOpcode() != BO_Comma)
13349 break;
13350 LHS = BO->getRHS();
13351 }
13352
13353 // Only allow some expressions on LHS to not warn.
13354 if (IgnoreCommaOperand(LHS))
13355 return;
13356
13357 Diag(Loc, diag::warn_comma_operator);
13358 Diag(LHS->getBeginLoc(), diag::note_cast_to_void)
13359 << LHS->getSourceRange()
13360 << FixItHint::CreateInsertion(LHS->getBeginLoc(),
13361 LangOpts.CPlusPlus ? "static_cast<void>("
13362 : "(void)(")
13363 << FixItHint::CreateInsertion(PP.getLocForEndOfToken(LHS->getEndLoc()),
13364 ")");
13365}
13366
13367// C99 6.5.17
13368static QualType CheckCommaOperands(Sema &S, ExprResult &LHS, ExprResult &RHS,
13369 SourceLocation Loc) {
13370 LHS = S.CheckPlaceholderExpr(LHS.get());
13371 RHS = S.CheckPlaceholderExpr(RHS.get());
13372 if (LHS.isInvalid() || RHS.isInvalid())
13373 return QualType();
13374
13375 // C's comma performs lvalue conversion (C99 6.3.2.1) on both its
13376 // operands, but not unary promotions.
13377 // C++'s comma does not do any conversions at all (C++ [expr.comma]p1).
13378
13379 // So we treat the LHS as a ignored value, and in C++ we allow the
13380 // containing site to determine what should be done with the RHS.
13381 LHS = S.IgnoredValueConversions(LHS.get());
13382 if (LHS.isInvalid())
13383 return QualType();
13384
13385 S.DiagnoseUnusedExprResult(LHS.get());
13386
13387 if (!S.getLangOpts().CPlusPlus) {
13388 RHS = S.DefaultFunctionArrayLvalueConversion(RHS.get());
13389 if (RHS.isInvalid())
13390 return QualType();
13391 if (!RHS.get()->getType()->isVoidType())
13392 S.RequireCompleteType(Loc, RHS.get()->getType(),
13393 diag::err_incomplete_type);
13394 }
13395
13396 if (!S.getDiagnostics().isIgnored(diag::warn_comma_operator, Loc))
13397 S.DiagnoseCommaOperator(LHS.get(), Loc);
13398
13399 return RHS.get()->getType();
13400}
13401
13402/// CheckIncrementDecrementOperand - unlike most "Check" methods, this routine
13403/// doesn't need to call UsualUnaryConversions or UsualArithmeticConversions.
13404static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
13405 ExprValueKind &VK,
13406 ExprObjectKind &OK,
13407 SourceLocation OpLoc,
13408 bool IsInc, bool IsPrefix) {
13409 if (Op->isTypeDependent())
13410 return S.Context.DependentTy;
13411
13412 QualType ResType = Op->getType();
13413 // Atomic types can be used for increment / decrement where the non-atomic
13414 // versions can, so ignore the _Atomic() specifier for the purpose of
13415 // checking.
13416 if (const AtomicType *ResAtomicType = ResType->getAs<AtomicType>())
13417 ResType = ResAtomicType->getValueType();
13418
13419 assert(!ResType.isNull() && "no type for increment/decrement expression")(static_cast<void> (0));
13420
13421 if (S.getLangOpts().CPlusPlus && ResType->isBooleanType()) {
13422 // Decrement of bool is not allowed.
13423 if (!IsInc) {
13424 S.Diag(OpLoc, diag::err_decrement_bool) << Op->getSourceRange();
13425 return QualType();
13426 }
13427 // Increment of bool sets it to true, but is deprecated.
13428 S.Diag(OpLoc, S.getLangOpts().CPlusPlus17 ? diag::ext_increment_bool
13429 : diag::warn_increment_bool)
13430 << Op->getSourceRange();
13431 } else if (S.getLangOpts().CPlusPlus && ResType->isEnumeralType()) {
13432 // Error on enum increments and decrements in C++ mode
13433 S.Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
13434 return QualType();
13435 } else if (ResType->isRealType()) {
13436 // OK!
13437 } else if (ResType->isPointerType()) {
13438 // C99 6.5.2.4p2, 6.5.6p2
13439 if (!checkArithmeticOpPointerOperand(S, OpLoc, Op))
13440 return QualType();
13441 } else if (ResType->isObjCObjectPointerType()) {
13442 // On modern runtimes, ObjC pointer arithmetic is forbidden.
13443 // Otherwise, we just need a complete type.
13444 if (checkArithmeticIncompletePointerType(S, OpLoc, Op) ||
13445 checkArithmeticOnObjCPointer(S, OpLoc, Op))
13446 return QualType();
13447 } else if (ResType->isAnyComplexType()) {
13448 // C99 does not support ++/-- on complex types, we allow as an extension.
13449 S.Diag(OpLoc, diag::ext_integer_increment_complex)
13450 << ResType << Op->getSourceRange();
13451 } else if (ResType->isPlaceholderType()) {
13452 ExprResult PR = S.CheckPlaceholderExpr(Op);
13453 if (PR.isInvalid()) return QualType();
13454 return CheckIncrementDecrementOperand(S, PR.get(), VK, OK, OpLoc,
13455 IsInc, IsPrefix);
13456 } else if (S.getLangOpts().AltiVec && ResType->isVectorType()) {
13457 // OK! ( C/C++ Language Extensions for CBEA(Version 2.6) 10.3 )
13458 } else if (S.getLangOpts().ZVector && ResType->isVectorType() &&
13459 (ResType->castAs<VectorType>()->getVectorKind() !=
13460 VectorType::AltiVecBool)) {
13461 // The z vector extensions allow ++ and -- for non-bool vectors.
13462 } else if(S.getLangOpts().OpenCL && ResType->isVectorType() &&
13463 ResType->castAs<VectorType>()->getElementType()->isIntegerType()) {
13464 // OpenCL V1.2 6.3 says dec/inc ops operate on integer vector types.
13465 } else {
13466 S.Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
13467 << ResType << int(IsInc) << Op->getSourceRange();
13468 return QualType();
13469 }
13470 // At this point, we know we have a real, complex or pointer type.
13471 // Now make sure the operand is a modifiable lvalue.
13472 if (CheckForModifiableLvalue(Op, OpLoc, S))
13473 return QualType();
13474 if (S.getLangOpts().CPlusPlus20 && ResType.isVolatileQualified()) {
13475 // C++2a [expr.pre.inc]p1, [expr.post.inc]p1:
13476 // An operand with volatile-qualified type is deprecated
13477 S.Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile)
13478 << IsInc << ResType;
13479 }
13480 // In C++, a prefix increment is the same type as the operand. Otherwise
13481 // (in C or with postfix), the increment is the unqualified type of the
13482 // operand.
13483 if (IsPrefix && S.getLangOpts().CPlusPlus) {
13484 VK = VK_LValue;
13485 OK = Op->getObjectKind();
13486 return ResType;
13487 } else {
13488 VK = VK_PRValue;
13489 return ResType.getUnqualifiedType();
13490 }
13491}
13492
13493
13494/// getPrimaryDecl - Helper function for CheckAddressOfOperand().
13495/// This routine allows us to typecheck complex/recursive expressions
13496/// where the declaration is needed for type checking. We only need to
13497/// handle cases when the expression references a function designator
13498/// or is an lvalue. Here are some examples:
13499/// - &(x) => x
13500/// - &*****f => f for f a function designator.
13501/// - &s.xx => s
13502/// - &s.zz[1].yy -> s, if zz is an array
13503/// - *(x + 1) -> x, if x is an array
13504/// - &"123"[2] -> 0
13505/// - & __real__ x -> x
13506///
13507/// FIXME: We don't recurse to the RHS of a comma, nor handle pointers to
13508/// members.
13509static ValueDecl *getPrimaryDecl(Expr *E) {
13510 switch (E->getStmtClass()) {
13511 case Stmt::DeclRefExprClass:
13512 return cast<DeclRefExpr>(E)->getDecl();
13513 case Stmt::MemberExprClass:
13514 // If this is an arrow operator, the address is an offset from
13515 // the base's value, so the object the base refers to is
13516 // irrelevant.
13517 if (cast<MemberExpr>(E)->isArrow())
13518 return nullptr;
13519 // Otherwise, the expression refers to a part of the base
13520 return getPrimaryDecl(cast<MemberExpr>(E)->getBase());
13521 case Stmt::ArraySubscriptExprClass: {
13522 // FIXME: This code shouldn't be necessary! We should catch the implicit
13523 // promotion of register arrays earlier.
13524 Expr* Base = cast<ArraySubscriptExpr>(E)->getBase();
13525 if (ImplicitCastExpr* ICE = dyn_cast<ImplicitCastExpr>(Base)) {
13526 if (ICE->getSubExpr()->getType()->isArrayType())
13527 return getPrimaryDecl(ICE->getSubExpr());
13528 }
13529 return nullptr;
13530 }
13531 case Stmt::UnaryOperatorClass: {
13532 UnaryOperator *UO = cast<UnaryOperator>(E);
13533
13534 switch(UO->getOpcode()) {
13535 case UO_Real:
13536 case UO_Imag:
13537 case UO_Extension:
13538 return getPrimaryDecl(UO->getSubExpr());
13539 default:
13540 return nullptr;
13541 }
13542 }
13543 case Stmt::ParenExprClass:
13544 return getPrimaryDecl(cast<ParenExpr>(E)->getSubExpr());
13545 case Stmt::ImplicitCastExprClass:
13546 // If the result of an implicit cast is an l-value, we care about
13547 // the sub-expression; otherwise, the result here doesn't matter.
13548 return getPrimaryDecl(cast<ImplicitCastExpr>(E)->getSubExpr());
13549 case Stmt::CXXUuidofExprClass:
13550 return cast<CXXUuidofExpr>(E)->getGuidDecl();
13551 default:
13552 return nullptr;
13553 }
13554}
13555
13556namespace {
13557enum {
13558 AO_Bit_Field = 0,
13559 AO_Vector_Element = 1,
13560 AO_Property_Expansion = 2,
13561 AO_Register_Variable = 3,
13562 AO_Matrix_Element = 4,
13563 AO_No_Error = 5
13564};
13565}
13566/// Diagnose invalid operand for address of operations.
13567///
13568/// \param Type The type of operand which cannot have its address taken.
13569static void diagnoseAddressOfInvalidType(Sema &S, SourceLocation Loc,
13570 Expr *E, unsigned Type) {
13571 S.Diag(Loc, diag::err_typecheck_address_of) << Type << E->getSourceRange();
13572}
13573
13574/// CheckAddressOfOperand - The operand of & must be either a function
13575/// designator or an lvalue designating an object. If it is an lvalue, the
13576/// object cannot be declared with storage class register or be a bit field.
13577/// Note: The usual conversions are *not* applied to the operand of the &
13578/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
13579/// In C++, the operand might be an overloaded function name, in which case
13580/// we allow the '&' but retain the overloaded-function type.
13581QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {
13582 if (const BuiltinType *PTy = OrigOp.get()->getType()->getAsPlaceholderType()){
13583 if (PTy->getKind() == BuiltinType::Overload) {
13584 Expr *E = OrigOp.get()->IgnoreParens();
13585 if (!isa<OverloadExpr>(E)) {
13586 assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf)(static_cast<void> (0));
13587 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function)
13588 << OrigOp.get()->getSourceRange();
13589 return QualType();
13590 }
13591
13592 OverloadExpr *Ovl = cast<OverloadExpr>(E);
13593 if (isa<UnresolvedMemberExpr>(Ovl))
13594 if (!ResolveSingleFunctionTemplateSpecialization(Ovl)) {
13595 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
13596 << OrigOp.get()->getSourceRange();
13597 return QualType();
13598 }
13599
13600 return Context.OverloadTy;
13601 }
13602
13603 if (PTy->getKind() == BuiltinType::UnknownAny)
13604 return Context.UnknownAnyTy;
13605
13606 if (PTy->getKind() == BuiltinType::BoundMember) {
13607 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
13608 << OrigOp.get()->getSourceRange();
13609 return QualType();
13610 }
13611
13612 OrigOp = CheckPlaceholderExpr(OrigOp.get());
13613 if (OrigOp.isInvalid()) return QualType();
13614 }
13615
13616 if (OrigOp.get()->isTypeDependent())
13617 return Context.DependentTy;
13618
13619 assert(!OrigOp.get()->getType()->isPlaceholderType())(static_cast<void> (0));
13620
13621 // Make sure to ignore parentheses in subsequent checks
13622 Expr *op = OrigOp.get()->IgnoreParens();
13623
13624 // In OpenCL captures for blocks called as lambda functions
13625 // are located in the private address space. Blocks used in
13626 // enqueue_kernel can be located in a different address space
13627 // depending on a vendor implementation. Thus preventing
13628 // taking an address of the capture to avoid invalid AS casts.
13629 if (LangOpts.OpenCL) {
13630 auto* VarRef = dyn_cast<DeclRefExpr>(op);
13631 if (VarRef && VarRef->refersToEnclosingVariableOrCapture()) {
13632 Diag(op->getExprLoc(), diag::err_opencl_taking_address_capture);
13633 return QualType();
13634 }
13635 }
13636
13637 if (getLangOpts().C99) {
13638 // Implement C99-only parts of addressof rules.
13639 if (UnaryOperator* uOp = dyn_cast<UnaryOperator>(op)) {
13640 if (uOp->getOpcode() == UO_Deref)
13641 // Per C99 6.5.3.2, the address of a deref always returns a valid result
13642 // (assuming the deref expression is valid).
13643 return uOp->getSubExpr()->getType();
13644 }
13645 // Technically, there should be a check for array subscript
13646 // expressions here, but the result of one is always an lvalue anyway.
13647 }
13648 ValueDecl *dcl = getPrimaryDecl(op);
13649
13650 if (auto *FD = dyn_cast_or_null<FunctionDecl>(dcl))
13651 if (!checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
13652 op->getBeginLoc()))
13653 return QualType();
13654
13655 Expr::LValueClassification lval = op->ClassifyLValue(Context);
13656 unsigned AddressOfError = AO_No_Error;
13657
13658 if (lval == Expr::LV_ClassTemporary || lval == Expr::LV_ArrayTemporary) {
13659 bool sfinae = (bool)isSFINAEContext();
13660 Diag(OpLoc, isSFINAEContext() ? diag::err_typecheck_addrof_temporary
13661 : diag::ext_typecheck_addrof_temporary)
13662 << op->getType() << op->getSourceRange();
13663 if (sfinae)
13664 return QualType();
13665 // Materialize the temporary as an lvalue so that we can take its address.
13666 OrigOp = op =
13667 CreateMaterializeTemporaryExpr(op->getType(), OrigOp.get(), true);
13668 } else if (isa<ObjCSelectorExpr>(op)) {
13669 return Context.getPointerType(op->getType());
13670 } else if (lval == Expr::LV_MemberFunction) {
13671 // If it's an instance method, make a member pointer.
13672 // The expression must have exactly the form &A::foo.
13673
13674 // If the underlying expression isn't a decl ref, give up.
13675 if (!isa<DeclRefExpr>(op)) {
13676 Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
13677 << OrigOp.get()->getSourceRange();
13678 return QualType();
13679 }
13680 DeclRefExpr *DRE = cast<DeclRefExpr>(op);
13681 CXXMethodDecl *MD = cast<CXXMethodDecl>(DRE->getDecl());
13682
13683 // The id-expression was parenthesized.
13684 if (OrigOp.get() != DRE) {
13685 Diag(OpLoc, diag::err_parens_pointer_member_function)
13686 << OrigOp.get()->getSourceRange();
13687
13688 // The method was named without a qualifier.
13689 } else if (!DRE->getQualifier()) {
13690 if (MD->getParent()->getName().empty())
13691 Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13692 << op->getSourceRange();
13693 else {
13694 SmallString<32> Str;
13695 StringRef Qual = (MD->getParent()->getName() + "::").toStringRef(Str);
13696 Diag(OpLoc, diag::err_unqualified_pointer_member_function)
13697 << op->getSourceRange()
13698 << FixItHint::CreateInsertion(op->getSourceRange().getBegin(), Qual);
13699 }
13700 }
13701
13702 // Taking the address of a dtor is illegal per C++ [class.dtor]p2.
13703 if (isa<CXXDestructorDecl>(MD))
13704 Diag(OpLoc, diag::err_typecheck_addrof_dtor) << op->getSourceRange();
13705
13706 QualType MPTy = Context.getMemberPointerType(
13707 op->getType(), Context.getTypeDeclType(MD->getParent()).getTypePtr());
13708 // Under the MS ABI, lock down the inheritance model now.
13709 if (Context.getTargetInfo().getCXXABI().isMicrosoft())
13710 (void)isCompleteType(OpLoc, MPTy);
13711 return MPTy;
13712 } else if (lval != Expr::LV_Valid && lval != Expr::LV_IncompleteVoidType) {
13713 // C99 6.5.3.2p1
13714 // The operand must be either an l-value or a function designator
13715 if (!op->getType()->isFunctionType()) {
13716 // Use a special diagnostic for loads from property references.
13717 if (isa<PseudoObjectExpr>(op)) {
13718 AddressOfError = AO_Property_Expansion;
13719 } else {
13720 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
13721 << op->getType() << op->getSourceRange();
13722 return QualType();
13723 }
13724 }
13725 } else if (op->getObjectKind() == OK_BitField) { // C99 6.5.3.2p1
13726 // The operand cannot be a bit-field
13727 AddressOfError = AO_Bit_Field;
13728 } else if (op->getObjectKind() == OK_VectorComponent) {
13729 // The operand cannot be an element of a vector
13730 AddressOfError = AO_Vector_Element;
13731 } else if (op->getObjectKind() == OK_MatrixComponent) {
13732 // The operand cannot be an element of a matrix.
13733 AddressOfError = AO_Matrix_Element;
13734 } else if (dcl) { // C99 6.5.3.2p1
13735 // We have an lvalue with a decl. Make sure the decl is not declared
13736 // with the register storage-class specifier.
13737 if (const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
13738 // in C++ it is not error to take address of a register
13739 // variable (c++03 7.1.1P3)
13740 if (vd->getStorageClass() == SC_Register &&
13741 !getLangOpts().CPlusPlus) {
13742 AddressOfError = AO_Register_Variable;
13743 }
13744 } else if (isa<MSPropertyDecl>(dcl)) {
13745 AddressOfError = AO_Property_Expansion;
13746 } else if (isa<FunctionTemplateDecl>(dcl)) {
13747 return Context.OverloadTy;
13748 } else if (isa<FieldDecl>(dcl) || isa<IndirectFieldDecl>(dcl)) {
13749 // Okay: we can take the address of a field.
13750 // Could be a pointer to member, though, if there is an explicit
13751 // scope qualifier for the class.
13752 if (isa<DeclRefExpr>(op) && cast<DeclRefExpr>(op)->getQualifier()) {
13753 DeclContext *Ctx = dcl->getDeclContext();
13754 if (Ctx && Ctx->isRecord()) {
13755 if (dcl->getType()->isReferenceType()) {
13756 Diag(OpLoc,
13757 diag::err_cannot_form_pointer_to_member_of_reference_type)
13758 << dcl->getDeclName() << dcl->getType();
13759 return QualType();
13760 }
13761
13762 while (cast<RecordDecl>(Ctx)->isAnonymousStructOrUnion())
13763 Ctx = Ctx->getParent();
13764
13765 QualType MPTy = Context.getMemberPointerType(
13766 op->getType(),
13767 Context.getTypeDeclType(cast<RecordDecl>(Ctx)).getTypePtr());
13768 // Under the MS ABI, lock down the inheritance model now.
13769 if (Context.getTargetInfo().getCXXABI().isMicrosoft())
13770 (void)isCompleteType(OpLoc, MPTy);
13771 return MPTy;
13772 }
13773 }
13774 } else if (!isa<FunctionDecl>(dcl) && !isa<NonTypeTemplateParmDecl>(dcl) &&
13775 !isa<BindingDecl>(dcl) && !isa<MSGuidDecl>(dcl))
13776 llvm_unreachable("Unknown/unexpected decl type")__builtin_unreachable();
13777 }
13778
13779 if (AddressOfError != AO_No_Error) {
13780 diagnoseAddressOfInvalidType(*this, OpLoc, op, AddressOfError);
13781 return QualType();
13782 }
13783
13784 if (lval == Expr::LV_IncompleteVoidType) {
13785 // Taking the address of a void variable is technically illegal, but we
13786 // allow it in cases which are otherwise valid.
13787 // Example: "extern void x; void* y = &x;".
13788 Diag(OpLoc, diag::ext_typecheck_addrof_void) << op->getSourceRange();
13789 }
13790
13791 // If the operand has type "type", the result has type "pointer to type".
13792 if (op->getType()->isObjCObjectType())
13793 return Context.getObjCObjectPointerType(op->getType());
13794
13795 CheckAddressOfPackedMember(op);
13796
13797 return Context.getPointerType(op->getType());
13798}
13799
13800static void RecordModifiableNonNullParam(Sema &S, const Expr *Exp) {
13801 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Exp);
13802 if (!DRE)
13803 return;
13804 const Decl *D = DRE->getDecl();
13805 if (!D)
13806 return;
13807 const ParmVarDecl *Param = dyn_cast<ParmVarDecl>(D);
13808 if (!Param)
13809 return;
13810 if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
13811 if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
13812 return;
13813 if (FunctionScopeInfo *FD = S.getCurFunction())
13814 if (!FD->ModifiedNonNullParams.count(Param))
13815 FD->ModifiedNonNullParams.insert(Param);
13816}
13817
13818/// CheckIndirectionOperand - Type check unary indirection (prefix '*').
13819static QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK,
13820 SourceLocation OpLoc) {
13821 if (Op->isTypeDependent())
13822 return S.Context.DependentTy;
13823
13824 ExprResult ConvResult = S.UsualUnaryConversions(Op);
13825 if (ConvResult.isInvalid())
13826 return QualType();
13827 Op = ConvResult.get();
13828 QualType OpTy = Op->getType();
13829 QualType Result;
13830
13831 if (isa<CXXReinterpretCastExpr>(Op)) {
13832 QualType OpOrigType = Op->IgnoreParenCasts()->getType();
13833 S.CheckCompatibleReinterpretCast(OpOrigType, OpTy, /*IsDereference*/true,
13834 Op->getSourceRange());
13835 }
13836
13837 if (const PointerType *PT = OpTy->getAs<PointerType>())
13838 {
13839 Result = PT->getPointeeType();
13840 }
13841 else if (const ObjCObjectPointerType *OPT =
13842 OpTy->getAs<ObjCObjectPointerType>())
13843 Result = OPT->getPointeeType();
13844 else {
13845 ExprResult PR = S.CheckPlaceholderExpr(Op);
13846 if (PR.isInvalid()) return QualType();
13847 if (PR.get() != Op)
13848 return CheckIndirectionOperand(S, PR.get(), VK, OpLoc);
13849 }
13850
13851 if (Result.isNull()) {
13852 S.Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer)
13853 << OpTy << Op->getSourceRange();
13854 return QualType();
13855 }
13856
13857 // Note that per both C89 and C99, indirection is always legal, even if Result
13858 // is an incomplete type or void. It would be possible to warn about
13859 // dereferencing a void pointer, but it's completely well-defined, and such a
13860 // warning is unlikely to catch any mistakes. In C++, indirection is not valid
13861 // for pointers to 'void' but is fine for any other pointer type:
13862 //
13863 // C++ [expr.unary.op]p1:
13864 // [...] the expression to which [the unary * operator] is applied shall
13865 // be a pointer to an object type, or a pointer to a function type
13866 if (S.getLangOpts().CPlusPlus && Result->isVoidType())
13867 S.Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
13868 << OpTy << Op->getSourceRange();
13869
13870 // Dereferences are usually l-values...
13871 VK = VK_LValue;
13872
13873 // ...except that certain expressions are never l-values in C.
13874 if (!S.getLangOpts().CPlusPlus && Result.isCForbiddenLValueType())
13875 VK = VK_PRValue;
13876
13877 return Result;
13878}
13879
13880BinaryOperatorKind Sema::ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind) {
13881 BinaryOperatorKind Opc;
13882 switch (Kind) {
13883 default: llvm_unreachable("Unknown binop!")__builtin_unreachable();
13884 case tok::periodstar: Opc = BO_PtrMemD; break;
13885 case tok::arrowstar: Opc = BO_PtrMemI; break;
13886 case tok::star: Opc = BO_Mul; break;
13887 case tok::slash: Opc = BO_Div; break;
13888 case tok::percent: Opc = BO_Rem; break;
13889 case tok::plus: Opc = BO_Add; break;
13890 case tok::minus: Opc = BO_Sub; break;
13891 case tok::lessless: Opc = BO_Shl; break;
13892 case tok::greatergreater: Opc = BO_Shr; break;
13893 case tok::lessequal: Opc = BO_LE; break;
13894 case tok::less: Opc = BO_LT; break;
13895 case tok::greaterequal: Opc = BO_GE; break;
13896 case tok::greater: Opc = BO_GT; break;
13897 case tok::exclaimequal: Opc = BO_NE; break;
13898 case tok::equalequal: Opc = BO_EQ; break;
13899 case tok::spaceship: Opc = BO_Cmp; break;
13900 case tok::amp: Opc = BO_And; break;
13901 case tok::caret: Opc = BO_Xor; break;
13902 case tok::pipe: Opc = BO_Or; break;
13903 case tok::ampamp: Opc = BO_LAnd; break;
13904 case tok::pipepipe: Opc = BO_LOr; break;
13905 case tok::equal: Opc = BO_Assign; break;
13906 case tok::starequal: Opc = BO_MulAssign; break;
13907 case tok::slashequal: Opc = BO_DivAssign; break;
13908 case tok::percentequal: Opc = BO_RemAssign; break;
13909 case tok::plusequal: Opc = BO_AddAssign; break;
13910 case tok::minusequal: Opc = BO_SubAssign; break;
13911 case tok::lesslessequal: Opc = BO_ShlAssign; break;
13912 case tok::greatergreaterequal: Opc = BO_ShrAssign; break;
13913 case tok::ampequal: Opc = BO_AndAssign; break;
13914 case tok::caretequal: Opc = BO_XorAssign; break;
13915 case tok::pipeequal: Opc = BO_OrAssign; break;
13916 case tok::comma: Opc = BO_Comma; break;
13917 }
13918 return Opc;
13919}
13920
13921static inline UnaryOperatorKind ConvertTokenKindToUnaryOpcode(
13922 tok::TokenKind Kind) {
13923 UnaryOperatorKind Opc;
13924 switch (Kind) {
13925 default: llvm_unreachable("Unknown unary op!")__builtin_unreachable();
13926 case tok::plusplus: Opc = UO_PreInc; break;
13927 case tok::minusminus: Opc = UO_PreDec; break;
13928 case tok::amp: Opc = UO_AddrOf; break;
13929 case tok::star: Opc = UO_Deref; break;
13930 case tok::plus: Opc = UO_Plus; break;
13931 case tok::minus: Opc = UO_Minus; break;
13932 case tok::tilde: Opc = UO_Not; break;
13933 case tok::exclaim: Opc = UO_LNot; break;
13934 case tok::kw___real: Opc = UO_Real; break;
13935 case tok::kw___imag: Opc = UO_Imag; break;
13936 case tok::kw___extension__: Opc = UO_Extension; break;
13937 }
13938 return Opc;
13939}
13940
13941/// DiagnoseSelfAssignment - Emits a warning if a value is assigned to itself.
13942/// This warning suppressed in the event of macro expansions.
13943static void DiagnoseSelfAssignment(Sema &S, Expr *LHSExpr, Expr *RHSExpr,
13944 SourceLocation OpLoc, bool IsBuiltin) {
13945 if (S.inTemplateInstantiation())
13946 return;
13947 if (S.isUnevaluatedContext())
13948 return;
13949 if (OpLoc.isInvalid() || OpLoc.isMacroID())
13950 return;
13951 LHSExpr = LHSExpr->IgnoreParenImpCasts();
13952 RHSExpr = RHSExpr->IgnoreParenImpCasts();
13953 const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr);
13954 const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr);
13955 if (!LHSDeclRef || !RHSDeclRef ||
13956 LHSDeclRef->getLocation().isMacroID() ||
13957 RHSDeclRef->getLocation().isMacroID())
13958 return;
13959 const ValueDecl *LHSDecl =
13960 cast<ValueDecl>(LHSDeclRef->getDecl()->getCanonicalDecl());
13961 const ValueDecl *RHSDecl =
13962 cast<ValueDecl>(RHSDeclRef->getDecl()->getCanonicalDecl());
13963 if (LHSDecl != RHSDecl)
13964 return;
13965 if (LHSDecl->getType().isVolatileQualified())
13966 return;
13967 if (const ReferenceType *RefTy = LHSDecl->getType()->getAs<ReferenceType>())
13968 if (RefTy->getPointeeType().isVolatileQualified())
13969 return;
13970
13971 S.Diag(OpLoc, IsBuiltin ? diag::warn_self_assignment_builtin
13972 : diag::warn_self_assignment_overloaded)
13973 << LHSDeclRef->getType() << LHSExpr->getSourceRange()
13974 << RHSExpr->getSourceRange();
13975}
13976
13977/// Check if a bitwise-& is performed on an Objective-C pointer. This
13978/// is usually indicative of introspection within the Objective-C pointer.
13979static void checkObjCPointerIntrospection(Sema &S, ExprResult &L, ExprResult &R,
13980 SourceLocation OpLoc) {
13981 if (!S.getLangOpts().ObjC)
13982 return;
13983
13984 const Expr *ObjCPointerExpr = nullptr, *OtherExpr = nullptr;
13985 const Expr *LHS = L.get();
13986 const Expr *RHS = R.get();
13987
13988 if (LHS->IgnoreParenCasts()->getType()->isObjCObjectPointerType()) {
13989 ObjCPointerExpr = LHS;
13990 OtherExpr = RHS;
13991 }
13992 else if (RHS->IgnoreParenCasts()->getType()->isObjCObjectPointerType()) {
13993 ObjCPointerExpr = RHS;
13994 OtherExpr = LHS;
13995 }
13996
13997 // This warning is deliberately made very specific to reduce false
13998 // positives with logic that uses '&' for hashing. This logic mainly
13999 // looks for code trying to introspect into tagged pointers, which
14000 // code should generally never do.
14001 if (ObjCPointerExpr && isa<IntegerLiteral>(OtherExpr->IgnoreParenCasts())) {
14002 unsigned Diag = diag::warn_objc_pointer_masking;
14003 // Determine if we are introspecting the result of performSelectorXXX.
14004 const Expr *Ex = ObjCPointerExpr->IgnoreParenCasts();
14005 // Special case messages to -performSelector and friends, which
14006 // can return non-pointer values boxed in a pointer value.
14007 // Some clients may wish to silence warnings in this subcase.
14008 if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(Ex)) {
14009 Selector S = ME->getSelector();
14010 StringRef SelArg0 = S.getNameForSlot(0);
14011 if (SelArg0.startswith("performSelector"))
14012 Diag = diag::warn_objc_pointer_masking_performSelector;
14013 }
14014
14015 S.Diag(OpLoc, Diag)
14016 << ObjCPointerExpr->getSourceRange();
14017 }
14018}
14019
14020static NamedDecl *getDeclFromExpr(Expr *E) {
14021 if (!E)
14022 return nullptr;
14023 if (auto *DRE = dyn_cast<DeclRefExpr>(E))
14024 return DRE->getDecl();
14025 if (auto *ME = dyn_cast<MemberExpr>(E))
14026 return ME->getMemberDecl();
14027 if (auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
14028 return IRE->getDecl();
14029 return nullptr;
14030}
14031
14032// This helper function promotes a binary operator's operands (which are of a
14033// half vector type) to a vector of floats and then truncates the result to
14034// a vector of either half or short.
14035static ExprResult convertHalfVecBinOp(Sema &S, ExprResult LHS, ExprResult RHS,
14036 BinaryOperatorKind Opc, QualType ResultTy,
14037 ExprValueKind VK, ExprObjectKind OK,
14038 bool IsCompAssign, SourceLocation OpLoc,
14039 FPOptionsOverride FPFeatures) {
14040 auto &Context = S.getASTContext();
14041 assert((isVector(ResultTy, Context.HalfTy) ||(static_cast<void> (0))
14042 isVector(ResultTy, Context.ShortTy)) &&(static_cast<void> (0))
14043 "Result must be a vector of half or short")(static_cast<void> (0));
14044 assert(isVector(LHS.get()->getType(), Context.HalfTy) &&(static_cast<void> (0))
14045 isVector(RHS.get()->getType(), Context.HalfTy) &&(static_cast<void> (0))
14046 "both operands expected to be a half vector")(static_cast<void> (0));
14047
14048 RHS = convertVector(RHS.get(), Context.FloatTy, S);
14049 QualType BinOpResTy = RHS.get()->getType();
14050
14051 // If Opc is a comparison, ResultType is a vector of shorts. In that case,
14052 // change BinOpResTy to a vector of ints.
14053 if (isVector(ResultTy, Context.ShortTy))
14054 BinOpResTy = S.GetSignedVectorType(BinOpResTy);
14055
14056 if (IsCompAssign)
14057 return CompoundAssignOperator::Create(Context, LHS.get(), RHS.get(), Opc,
14058 ResultTy, VK, OK, OpLoc, FPFeatures,
14059 BinOpResTy, BinOpResTy);
14060
14061 LHS = convertVector(LHS.get(), Context.FloatTy, S);
14062 auto *BO = BinaryOperator::Create(Context, LHS.get(), RHS.get(), Opc,
14063 BinOpResTy, VK, OK, OpLoc, FPFeatures);
14064 return convertVector(BO, ResultTy->castAs<VectorType>()->getElementType(), S);
14065}
14066
14067static std::pair<ExprResult, ExprResult>
14068CorrectDelayedTyposInBinOp(Sema &S, BinaryOperatorKind Opc, Expr *LHSExpr,
14069 Expr *RHSExpr) {
14070 ExprResult LHS = LHSExpr, RHS = RHSExpr;
14071 if (!S.Context.isDependenceAllowed()) {
14072 // C cannot handle TypoExpr nodes on either side of a binop because it
14073 // doesn't handle dependent types properly, so make sure any TypoExprs have
14074 // been dealt with before checking the operands.
14075 LHS = S.CorrectDelayedTyposInExpr(LHS);
14076 RHS = S.CorrectDelayedTyposInExpr(
14077 RHS, /*InitDecl=*/nullptr, /*RecoverUncorrectedTypos=*/false,
14078 [Opc, LHS](Expr *E) {
14079 if (Opc != BO_Assign)
14080 return ExprResult(E);
14081 // Avoid correcting the RHS to the same Expr as the LHS.
14082 Decl *D = getDeclFromExpr(E);
14083 return (D && D == getDeclFromExpr(LHS.get())) ? ExprError() : E;
14084 });
14085 }
14086 return std::make_pair(LHS, RHS);
14087}
14088
14089/// Returns true if conversion between vectors of halfs and vectors of floats
14090/// is needed.
14091static bool needsConversionOfHalfVec(bool OpRequiresConversion, ASTContext &Ctx,
14092 Expr *E0, Expr *E1 = nullptr) {
14093 if (!OpRequiresConversion || Ctx.getLangOpts().NativeHalfType ||
14094 Ctx.getTargetInfo().useFP16ConversionIntrinsics())
14095 return false;
14096
14097 auto HasVectorOfHalfType = [&Ctx](Expr *E) {
14098 QualType Ty = E->IgnoreImplicit()->getType();
14099
14100 // Don't promote half precision neon vectors like float16x4_t in arm_neon.h
14101 // to vectors of floats. Although the element type of the vectors is __fp16,
14102 // the vectors shouldn't be treated as storage-only types. See the
14103 // discussion here: https://reviews.llvm.org/rG825235c140e7
14104 if (const VectorType *VT = Ty->getAs<VectorType>()) {
14105 if (VT->getVectorKind() == VectorType::NeonVector)
14106 return false;
14107 return VT->getElementType().getCanonicalType() == Ctx.HalfTy;
14108 }
14109 return false;
14110 };
14111
14112 return HasVectorOfHalfType(E0) && (!E1 || HasVectorOfHalfType(E1));
14113}
14114
14115/// CreateBuiltinBinOp - Creates a new built-in binary operation with
14116/// operator @p Opc at location @c TokLoc. This routine only supports
14117/// built-in operations; ActOnBinOp handles overloaded operators.
14118ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc,
14119 BinaryOperatorKind Opc,
14120 Expr *LHSExpr, Expr *RHSExpr) {
14121 if (getLangOpts().CPlusPlus11 && isa<InitListExpr>(RHSExpr)) {
14122 // The syntax only allows initializer lists on the RHS of assignment,
14123 // so we don't need to worry about accepting invalid code for
14124 // non-assignment operators.
14125 // C++11 5.17p9:
14126 // The meaning of x = {v} [...] is that of x = T(v) [...]. The meaning
14127 // of x = {} is x = T().
14128 InitializationKind Kind = InitializationKind::CreateDirectList(
14129 RHSExpr->getBeginLoc(), RHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
14130 InitializedEntity Entity =
14131 InitializedEntity::InitializeTemporary(LHSExpr->getType());
14132 InitializationSequence InitSeq(*this, Entity, Kind, RHSExpr);
14133 ExprResult Init = InitSeq.Perform(*this, Entity, Kind, RHSExpr);
14134 if (Init.isInvalid())
14135 return Init;
14136 RHSExpr = Init.get();
14137 }
14138
14139 ExprResult LHS = LHSExpr, RHS = RHSExpr;
14140 QualType ResultTy; // Result type of the binary operator.
14141 // The following two variables are used for compound assignment operators
14142 QualType CompLHSTy; // Type of LHS after promotions for computation
14143 QualType CompResultTy; // Type of computation result
14144 ExprValueKind VK = VK_PRValue;
14145 ExprObjectKind OK = OK_Ordinary;
14146 bool ConvertHalfVec = false;
14147
14148 std::tie(LHS, RHS) = CorrectDelayedTyposInBinOp(*this, Opc, LHSExpr, RHSExpr);
14149 if (!LHS.isUsable() || !RHS.isUsable())
14150 return ExprError();
14151
14152 if (getLangOpts().OpenCL) {
14153 QualType LHSTy = LHSExpr->getType();
14154 QualType RHSTy = RHSExpr->getType();
14155 // OpenCLC v2.0 s6.13.11.1 allows atomic variables to be initialized by
14156 // the ATOMIC_VAR_INIT macro.
14157 if (LHSTy->isAtomicType() || RHSTy->isAtomicType()) {
14158 SourceRange SR(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
14159 if (BO_Assign == Opc)
14160 Diag(OpLoc, diag::err_opencl_atomic_init) << 0 << SR;
14161 else
14162 ResultTy = InvalidOperands(OpLoc, LHS, RHS);
14163 return ExprError();
14164 }
14165
14166 // OpenCL special types - image, sampler, pipe, and blocks are to be used
14167 // only with a builtin functions and therefore should be disallowed here.
14168 if (LHSTy->isImageType() || RHSTy->isImageType() ||
14169 LHSTy->isSamplerT() || RHSTy->isSamplerT() ||
14170 LHSTy->isPipeType() || RHSTy->isPipeType() ||
14171 LHSTy->isBlockPointerType() || RHSTy->isBlockPointerType()) {
14172 ResultTy = InvalidOperands(OpLoc, LHS, RHS);
14173 return ExprError();
14174 }
14175 }
14176
14177 switch (Opc) {
14178 case BO_Assign:
14179 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, QualType());
14180 if (getLangOpts().CPlusPlus &&
14181 LHS.get()->getObjectKind() != OK_ObjCProperty) {
14182 VK = LHS.get()->getValueKind();
14183 OK = LHS.get()->getObjectKind();
14184 }
14185 if (!ResultTy.isNull()) {
14186 DiagnoseSelfAssignment(*this, LHS.get(), RHS.get(), OpLoc, true);
14187 DiagnoseSelfMove(LHS.get(), RHS.get(), OpLoc);
14188
14189 // Avoid copying a block to the heap if the block is assigned to a local
14190 // auto variable that is declared in the same scope as the block. This
14191 // optimization is unsafe if the local variable is declared in an outer
14192 // scope. For example:
14193 //
14194 // BlockTy b;
14195 // {
14196 // b = ^{...};
14197 // }
14198 // // It is unsafe to invoke the block here if it wasn't copied to the
14199 // // heap.
14200 // b();
14201
14202 if (auto *BE = dyn_cast<BlockExpr>(RHS.get()->IgnoreParens()))
14203 if (auto *DRE = dyn_cast<DeclRefExpr>(LHS.get()->IgnoreParens()))
14204 if (auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
14205 if (VD->hasLocalStorage() && getCurScope()->isDeclScope(VD))
14206 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14207
14208 if (LHS.get()->getType().hasNonTrivialToPrimitiveCopyCUnion())
14209 checkNonTrivialCUnion(LHS.get()->getType(), LHS.get()->getExprLoc(),
14210 NTCUC_Assignment, NTCUK_Copy);
14211 }
14212 RecordModifiableNonNullParam(*this, LHS.get());
14213 break;
14214 case BO_PtrMemD:
14215 case BO_PtrMemI:
14216 ResultTy = CheckPointerToMemberOperands(LHS, RHS, VK, OpLoc,
14217 Opc == BO_PtrMemI);
14218 break;
14219 case BO_Mul:
14220 case BO_Div:
14221 ConvertHalfVec = true;
14222 ResultTy = CheckMultiplyDivideOperands(LHS, RHS, OpLoc, false,
14223 Opc == BO_Div);
14224 break;
14225 case BO_Rem:
14226 ResultTy = CheckRemainderOperands(LHS, RHS, OpLoc);
14227 break;
14228 case BO_Add:
14229 ConvertHalfVec = true;
14230 ResultTy = CheckAdditionOperands(LHS, RHS, OpLoc, Opc);
14231 break;
14232 case BO_Sub:
14233 ConvertHalfVec = true;
14234 ResultTy = CheckSubtractionOperands(LHS, RHS, OpLoc);
14235 break;
14236 case BO_Shl:
14237 case BO_Shr:
14238 ResultTy = CheckShiftOperands(LHS, RHS, OpLoc, Opc);
14239 break;
14240 case BO_LE:
14241 case BO_LT:
14242 case BO_GE:
14243 case BO_GT:
14244 ConvertHalfVec = true;
14245 ResultTy = CheckCompareOperands(LHS, RHS, OpLoc, Opc);
14246 break;
14247 case BO_EQ:
14248 case BO_NE:
14249 ConvertHalfVec = true;
14250 ResultTy = CheckCompareOperands(LHS, RHS, OpLoc, Opc);
14251 break;
14252 case BO_Cmp:
14253 ConvertHalfVec = true;
14254 ResultTy = CheckCompareOperands(LHS, RHS, OpLoc, Opc);
14255 assert(ResultTy.isNull() || ResultTy->getAsCXXRecordDecl())(static_cast<void> (0));
14256 break;
14257 case BO_And:
14258 checkObjCPointerIntrospection(*this, LHS, RHS, OpLoc);
14259 LLVM_FALLTHROUGH[[gnu::fallthrough]];
14260 case BO_Xor:
14261 case BO_Or:
14262 ResultTy = CheckBitwiseOperands(LHS, RHS, OpLoc, Opc);
14263 break;
14264 case BO_LAnd:
14265 case BO_LOr:
14266 ConvertHalfVec = true;
14267 ResultTy = CheckLogicalOperands(LHS, RHS, OpLoc, Opc);
14268 break;
14269 case BO_MulAssign:
14270 case BO_DivAssign:
14271 ConvertHalfVec = true;
14272 CompResultTy = CheckMultiplyDivideOperands(LHS, RHS, OpLoc, true,
14273 Opc == BO_DivAssign);
14274 CompLHSTy = CompResultTy;
14275 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14276 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14277 break;
14278 case BO_RemAssign:
14279 CompResultTy = CheckRemainderOperands(LHS, RHS, OpLoc, true);
14280 CompLHSTy = CompResultTy;
14281 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14282 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14283 break;
14284 case BO_AddAssign:
14285 ConvertHalfVec = true;
14286 CompResultTy = CheckAdditionOperands(LHS, RHS, OpLoc, Opc, &CompLHSTy);
14287 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14288 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14289 break;
14290 case BO_SubAssign:
14291 ConvertHalfVec = true;
14292 CompResultTy = CheckSubtractionOperands(LHS, RHS, OpLoc, &CompLHSTy);
14293 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14294 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14295 break;
14296 case BO_ShlAssign:
14297 case BO_ShrAssign:
14298 CompResultTy = CheckShiftOperands(LHS, RHS, OpLoc, Opc, true);
14299 CompLHSTy = CompResultTy;
14300 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14301 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14302 break;
14303 case BO_AndAssign:
14304 case BO_OrAssign: // fallthrough
14305 DiagnoseSelfAssignment(*this, LHS.get(), RHS.get(), OpLoc, true);
14306 LLVM_FALLTHROUGH[[gnu::fallthrough]];
14307 case BO_XorAssign:
14308 CompResultTy = CheckBitwiseOperands(LHS, RHS, OpLoc, Opc);
14309 CompLHSTy = CompResultTy;
14310 if (!CompResultTy.isNull() && !LHS.isInvalid() && !RHS.isInvalid())
14311 ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, CompResultTy);
14312 break;
14313 case BO_Comma:
14314 ResultTy = CheckCommaOperands(*this, LHS, RHS, OpLoc);
14315 if (getLangOpts().CPlusPlus && !RHS.isInvalid()) {
14316 VK = RHS.get()->getValueKind();
14317 OK = RHS.get()->getObjectKind();
14318 }
14319 break;
14320 }
14321 if (ResultTy.isNull() || LHS.isInvalid() || RHS.isInvalid())
14322 return ExprError();
14323
14324 // Some of the binary operations require promoting operands of half vector to
14325 // float vectors and truncating the result back to half vector. For now, we do
14326 // this only when HalfArgsAndReturn is set (that is, when the target is arm or
14327 // arm64).
14328 assert((static_cast<void> (0))
14329 (Opc == BO_Comma || isVector(RHS.get()->getType(), Context.HalfTy) ==(static_cast<void> (0))
14330 isVector(LHS.get()->getType(), Context.HalfTy)) &&(static_cast<void> (0))
14331 "both sides are half vectors or neither sides are")(static_cast<void> (0));
14332 ConvertHalfVec =
14333 needsConversionOfHalfVec(ConvertHalfVec, Context, LHS.get(), RHS.get());
14334
14335 // Check for array bounds violations for both sides of the BinaryOperator
14336 CheckArrayAccess(LHS.get());
14337 CheckArrayAccess(RHS.get());
14338
14339 if (const ObjCIsaExpr *OISA = dyn_cast<ObjCIsaExpr>(LHS.get()->IgnoreParenCasts())) {
14340 NamedDecl *ObjectSetClass = LookupSingleName(TUScope,
14341 &Context.Idents.get("object_setClass"),
14342 SourceLocation(), LookupOrdinaryName);
14343 if (ObjectSetClass && isa<ObjCIsaExpr>(LHS.get())) {
14344 SourceLocation RHSLocEnd = getLocForEndOfToken(RHS.get()->getEndLoc());
14345 Diag(LHS.get()->getExprLoc(), diag::warn_objc_isa_assign)
14346 << FixItHint::CreateInsertion(LHS.get()->getBeginLoc(),
14347 "object_setClass(")
14348 << FixItHint::CreateReplacement(SourceRange(OISA->getOpLoc(), OpLoc),
14349 ",")
14350 << FixItHint::CreateInsertion(RHSLocEnd, ")");
14351 }
14352 else
14353 Diag(LHS.get()->getExprLoc(), diag::warn_objc_isa_assign);
14354 }
14355 else if (const ObjCIvarRefExpr *OIRE =
14356 dyn_cast<ObjCIvarRefExpr>(LHS.get()->IgnoreParenCasts()))
14357 DiagnoseDirectIsaAccess(*this, OIRE, OpLoc, RHS.get());
14358
14359 // Opc is not a compound assignment if CompResultTy is null.
14360 if (CompResultTy.isNull()) {
14361 if (ConvertHalfVec)
14362 return convertHalfVecBinOp(*this, LHS, RHS, Opc, ResultTy, VK, OK, false,
14363 OpLoc, CurFPFeatureOverrides());
14364 return BinaryOperator::Create(Context, LHS.get(), RHS.get(), Opc, ResultTy,
14365 VK, OK, OpLoc, CurFPFeatureOverrides());
14366 }
14367
14368 // Handle compound assignments.
14369 if (getLangOpts().CPlusPlus && LHS.get()->getObjectKind() !=
14370 OK_ObjCProperty) {
14371 VK = VK_LValue;
14372 OK = LHS.get()->getObjectKind();
14373 }
14374
14375 // The LHS is not converted to the result type for fixed-point compound
14376 // assignment as the common type is computed on demand. Reset the CompLHSTy
14377 // to the LHS type we would have gotten after unary conversions.
14378 if (CompResultTy->isFixedPointType())
14379 CompLHSTy = UsualUnaryConversions(LHS.get()).get()->getType();
14380
14381 if (ConvertHalfVec)
14382 return convertHalfVecBinOp(*this, LHS, RHS, Opc, ResultTy, VK, OK, true,
14383 OpLoc, CurFPFeatureOverrides());
14384
14385 return CompoundAssignOperator::Create(
14386 Context, LHS.get(), RHS.get(), Opc, ResultTy, VK, OK, OpLoc,
14387 CurFPFeatureOverrides(), CompLHSTy, CompResultTy);
14388}
14389
14390/// DiagnoseBitwisePrecedence - Emit a warning when bitwise and comparison
14391/// operators are mixed in a way that suggests that the programmer forgot that
14392/// comparison operators have higher precedence. The most typical example of
14393/// such code is "flags & 0x0020 != 0", which is equivalent to "flags & 1".
14394static void DiagnoseBitwisePrecedence(Sema &Self, BinaryOperatorKind Opc,
14395 SourceLocation OpLoc, Expr *LHSExpr,
14396 Expr *RHSExpr) {
14397 BinaryOperator *LHSBO = dyn_cast<BinaryOperator>(LHSExpr);
14398 BinaryOperator *RHSBO = dyn_cast<BinaryOperator>(RHSExpr);
14399
14400 // Check that one of the sides is a comparison operator and the other isn't.
14401 bool isLeftComp = LHSBO && LHSBO->isComparisonOp();
14402 bool isRightComp = RHSBO && RHSBO->isComparisonOp();
14403 if (isLeftComp == isRightComp)
14404 return;
14405
14406 // Bitwise operations are sometimes used as eager logical ops.
14407 // Don't diagnose this.
14408 bool isLeftBitwise = LHSBO && LHSBO->isBitwiseOp();
14409 bool isRightBitwise = RHSBO && RHSBO->isBitwiseOp();
14410 if (isLeftBitwise || isRightBitwise)
14411 return;
14412
14413 SourceRange DiagRange = isLeftComp
14414 ? SourceRange(LHSExpr->getBeginLoc(), OpLoc)
14415 : SourceRange(OpLoc, RHSExpr->getEndLoc());
14416 StringRef OpStr = isLeftComp ? LHSBO->getOpcodeStr() : RHSBO->getOpcodeStr();
14417 SourceRange ParensRange =
14418 isLeftComp
14419 ? SourceRange(LHSBO->getRHS()->getBeginLoc(), RHSExpr->getEndLoc())
14420 : SourceRange(LHSExpr->getBeginLoc(), RHSBO->getLHS()->getEndLoc());
14421
14422 Self.Diag(OpLoc, diag::warn_precedence_bitwise_rel)
14423 << DiagRange << BinaryOperator::getOpcodeStr(Opc) << OpStr;
14424 SuggestParentheses(Self, OpLoc,
14425 Self.PDiag(diag::note_precedence_silence) << OpStr,
14426 (isLeftComp ? LHSExpr : RHSExpr)->getSourceRange());
14427 SuggestParentheses(Self, OpLoc,
14428 Self.PDiag(diag::note_precedence_bitwise_first)
14429 << BinaryOperator::getOpcodeStr(Opc),
14430 ParensRange);
14431}
14432
14433/// It accepts a '&&' expr that is inside a '||' one.
14434/// Emit a diagnostic together with a fixit hint that wraps the '&&' expression
14435/// in parentheses.
14436static void
14437EmitDiagnosticForLogicalAndInLogicalOr(Sema &Self, SourceLocation OpLoc,
14438 BinaryOperator *Bop) {
14439 assert(Bop->getOpcode() == BO_LAnd)(static_cast<void> (0));
14440 Self.Diag(Bop->getOperatorLoc(), diag::warn_logical_and_in_logical_or)
14441 << Bop->getSourceRange() << OpLoc;
14442 SuggestParentheses(Self, Bop->getOperatorLoc(),
14443 Self.PDiag(diag::note_precedence_silence)
14444 << Bop->getOpcodeStr(),
14445 Bop->getSourceRange());
14446}
14447
14448/// Returns true if the given expression can be evaluated as a constant
14449/// 'true'.
14450static bool EvaluatesAsTrue(Sema &S, Expr *E) {
14451 bool Res;
14452 return !E->isValueDependent() &&
14453 E->EvaluateAsBooleanCondition(Res, S.getASTContext()) && Res;
14454}
14455
14456/// Returns true if the given expression can be evaluated as a constant
14457/// 'false'.
14458static bool EvaluatesAsFalse(Sema &S, Expr *E) {
14459 bool Res;
14460 return !E->isValueDependent() &&
14461 E->EvaluateAsBooleanCondition(Res, S.getASTContext()) && !Res;
14462}
14463
14464/// Look for '&&' in the left hand of a '||' expr.
14465static void DiagnoseLogicalAndInLogicalOrLHS(Sema &S, SourceLocation OpLoc,
14466 Expr *LHSExpr, Expr *RHSExpr) {
14467 if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(LHSExpr)) {
14468 if (Bop->getOpcode() == BO_LAnd) {
14469 // If it's "a && b || 0" don't warn since the precedence doesn't matter.
14470 if (EvaluatesAsFalse(S, RHSExpr))
14471 return;
14472 // If it's "1 && a || b" don't warn since the precedence doesn't matter.
14473 if (!EvaluatesAsTrue(S, Bop->getLHS()))
14474 return EmitDiagnosticForLogicalAndInLogicalOr(S, OpLoc, Bop);
14475 } else if (Bop->getOpcode() == BO_LOr) {
14476 if (BinaryOperator *RBop = dyn_cast<BinaryOperator>(Bop->getRHS())) {
14477 // If it's "a || b && 1 || c" we didn't warn earlier for
14478 // "a || b && 1", but warn now.
14479 if (RBop->getOpcode() == BO_LAnd && EvaluatesAsTrue(S, RBop->getRHS()))
14480 return EmitDiagnosticForLogicalAndInLogicalOr(S, OpLoc, RBop);
14481 }
14482 }
14483 }
14484}
14485
14486/// Look for '&&' in the right hand of a '||' expr.
14487static void DiagnoseLogicalAndInLogicalOrRHS(Sema &S, SourceLocation OpLoc,
14488 Expr *LHSExpr, Expr *RHSExpr) {
14489 if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(RHSExpr)) {
14490 if (Bop->getOpcode() == BO_LAnd) {
14491 // If it's "0 || a && b" don't warn since the precedence doesn't matter.
14492 if (EvaluatesAsFalse(S, LHSExpr))
14493 return;
14494 // If it's "a || b && 1" don't warn since the precedence doesn't matter.
14495 if (!EvaluatesAsTrue(S, Bop->getRHS()))
14496 return EmitDiagnosticForLogicalAndInLogicalOr(S, OpLoc, Bop);
14497 }
14498 }
14499}
14500
14501/// Look for bitwise op in the left or right hand of a bitwise op with
14502/// lower precedence and emit a diagnostic together with a fixit hint that wraps
14503/// the '&' expression in parentheses.
14504static void DiagnoseBitwiseOpInBitwiseOp(Sema &S, BinaryOperatorKind Opc,
14505 SourceLocation OpLoc, Expr *SubExpr) {
14506 if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(SubExpr)) {
14507 if (Bop->isBitwiseOp() && Bop->getOpcode() < Opc) {
14508 S.Diag(Bop->getOperatorLoc(), diag::warn_bitwise_op_in_bitwise_op)
14509 << Bop->getOpcodeStr() << BinaryOperator::getOpcodeStr(Opc)
14510 << Bop->getSourceRange() << OpLoc;
14511 SuggestParentheses(S, Bop->getOperatorLoc(),
14512 S.PDiag(diag::note_precedence_silence)
14513 << Bop->getOpcodeStr(),
14514 Bop->getSourceRange());
14515 }
14516 }
14517}
14518
14519static void DiagnoseAdditionInShift(Sema &S, SourceLocation OpLoc,
14520 Expr *SubExpr, StringRef Shift) {
14521 if (BinaryOperator *Bop = dyn_cast<BinaryOperator>(SubExpr)) {
14522 if (Bop->getOpcode() == BO_Add || Bop->getOpcode() == BO_Sub) {
14523 StringRef Op = Bop->getOpcodeStr();
14524 S.Diag(Bop->getOperatorLoc(), diag::warn_addition_in_bitshift)
14525 << Bop->getSourceRange() << OpLoc << Shift << Op;
14526 SuggestParentheses(S, Bop->getOperatorLoc(),
14527 S.PDiag(diag::note_precedence_silence) << Op,
14528 Bop->getSourceRange());
14529 }
14530 }
14531}
14532
14533static void DiagnoseShiftCompare(Sema &S, SourceLocation OpLoc,
14534 Expr *LHSExpr, Expr *RHSExpr) {
14535 CXXOperatorCallExpr *OCE = dyn_cast<CXXOperatorCallExpr>(LHSExpr);
14536 if (!OCE)
14537 return;
14538
14539 FunctionDecl *FD = OCE->getDirectCallee();
14540 if (!FD || !FD->isOverloadedOperator())
14541 return;
14542
14543 OverloadedOperatorKind Kind = FD->getOverloadedOperator();
14544 if (Kind != OO_LessLess && Kind != OO_GreaterGreater)
14545 return;
14546
14547 S.Diag(OpLoc, diag::warn_overloaded_shift_in_comparison)
14548 << LHSExpr->getSourceRange() << RHSExpr->getSourceRange()
14549 << (Kind == OO_LessLess);
14550 SuggestParentheses(S, OCE->getOperatorLoc(),
14551 S.PDiag(diag::note_precedence_silence)
14552 << (Kind == OO_LessLess ? "<<" : ">>"),
14553 OCE->getSourceRange());
14554 SuggestParentheses(
14555 S, OpLoc, S.PDiag(diag::note_evaluate_comparison_first),
14556 SourceRange(OCE->getArg(1)->getBeginLoc(), RHSExpr->getEndLoc()));
14557}
14558
14559/// DiagnoseBinOpPrecedence - Emit warnings for expressions with tricky
14560/// precedence.
14561static void DiagnoseBinOpPrecedence(Sema &Self, BinaryOperatorKind Opc,
14562 SourceLocation OpLoc, Expr *LHSExpr,
14563 Expr *RHSExpr){
14564 // Diagnose "arg1 'bitwise' arg2 'eq' arg3".
14565 if (BinaryOperator::isBitwiseOp(Opc))
14566 DiagnoseBitwisePrecedence(Self, Opc, OpLoc, LHSExpr, RHSExpr);
14567
14568 // Diagnose "arg1 & arg2 | arg3"
14569 if ((Opc == BO_Or || Opc == BO_Xor) &&
14570 !OpLoc.isMacroID()/* Don't warn in macros. */) {
14571 DiagnoseBitwiseOpInBitwiseOp(Self, Opc, OpLoc, LHSExpr);
14572 DiagnoseBitwiseOpInBitwiseOp(Self, Opc, OpLoc, RHSExpr);
14573 }
14574
14575 // Warn about arg1 || arg2 && arg3, as GCC 4.3+ does.
14576 // We don't warn for 'assert(a || b && "bad")' since this is safe.
14577 if (Opc == BO_LOr && !OpLoc.isMacroID()/* Don't warn in macros. */) {
14578 DiagnoseLogicalAndInLogicalOrLHS(Self, OpLoc, LHSExpr, RHSExpr);
14579 DiagnoseLogicalAndInLogicalOrRHS(Self, OpLoc, LHSExpr, RHSExpr);
14580 }
14581
14582 if ((Opc == BO_Shl && LHSExpr->getType()->isIntegralType(Self.getASTContext()))
14583 || Opc == BO_Shr) {
14584 StringRef Shift = BinaryOperator::getOpcodeStr(Opc);
14585 DiagnoseAdditionInShift(Self, OpLoc, LHSExpr, Shift);
14586 DiagnoseAdditionInShift(Self, OpLoc, RHSExpr, Shift);
14587 }
14588
14589 // Warn on overloaded shift operators and comparisons, such as:
14590 // cout << 5 == 4;
14591 if (BinaryOperator::isComparisonOp(Opc))
14592 DiagnoseShiftCompare(Self, OpLoc, LHSExpr, RHSExpr);
14593}
14594
14595// Binary Operators. 'Tok' is the token for the operator.
14596ExprResult Sema::ActOnBinOp(Scope *S, SourceLocation TokLoc,
14597 tok::TokenKind Kind,
14598 Expr *LHSExpr, Expr *RHSExpr) {
14599 BinaryOperatorKind Opc = ConvertTokenKindToBinaryOpcode(Kind);
14600 assert(LHSExpr && "ActOnBinOp(): missing left expression")(static_cast<void> (0));
14601 assert(RHSExpr && "ActOnBinOp(): missing right expression")(static_cast<void> (0));
14602
14603 // Emit warnings for tricky precedence issues, e.g. "bitfield & 0x4 == 0"
14604 DiagnoseBinOpPrecedence(*this, Opc, TokLoc, LHSExpr, RHSExpr);
14605
14606 return BuildBinOp(S, TokLoc, Opc, LHSExpr, RHSExpr);
14607}
14608
14609void Sema::LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc,
14610 UnresolvedSetImpl &Functions) {
14611 OverloadedOperatorKind OverOp = BinaryOperator::getOverloadedOperator(Opc);
14612 if (OverOp != OO_None && OverOp != OO_Equal)
14613 LookupOverloadedOperatorName(OverOp, S, Functions);
14614
14615 // In C++20 onwards, we may have a second operator to look up.
14616 if (getLangOpts().CPlusPlus20) {
14617 if (OverloadedOperatorKind ExtraOp = getRewrittenOverloadedOperator(OverOp))
14618 LookupOverloadedOperatorName(ExtraOp, S, Functions);
14619 }
14620}
14621
14622/// Build an overloaded binary operator expression in the given scope.
14623static ExprResult BuildOverloadedBinOp(Sema &S, Scope *Sc, SourceLocation OpLoc,
14624 BinaryOperatorKind Opc,
14625 Expr *LHS, Expr *RHS) {
14626 switch (Opc) {
14627 case BO_Assign:
14628 case BO_DivAssign:
14629 case BO_RemAssign:
14630 case BO_SubAssign:
14631 case BO_AndAssign:
14632 case BO_OrAssign:
14633 case BO_XorAssign:
14634 DiagnoseSelfAssignment(S, LHS, RHS, OpLoc, false);
14635 CheckIdentityFieldAssignment(LHS, RHS, OpLoc, S);
14636 break;
14637 default:
14638 break;
14639 }
14640
14641 // Find all of the overloaded operators visible from this point.
14642 UnresolvedSet<16> Functions;
14643 S.LookupBinOp(Sc, OpLoc, Opc, Functions);
14644
14645 // Build the (potentially-overloaded, potentially-dependent)
14646 // binary operation.
14647 return S.CreateOverloadedBinOp(OpLoc, Opc, Functions, LHS, RHS);
14648}
14649
14650ExprResult Sema::BuildBinOp(Scope *S, SourceLocation OpLoc,
14651 BinaryOperatorKind Opc,
14652 Expr *LHSExpr, Expr *RHSExpr) {
14653 ExprResult LHS, RHS;
14654 std::tie(LHS, RHS) = CorrectDelayedTyposInBinOp(*this, Opc, LHSExpr, RHSExpr);
14655 if (!LHS.isUsable() || !RHS.isUsable())
14656 return ExprError();
14657 LHSExpr = LHS.get();
14658 RHSExpr = RHS.get();
14659
14660 // We want to end up calling one of checkPseudoObjectAssignment
14661 // (if the LHS is a pseudo-object), BuildOverloadedBinOp (if
14662 // both expressions are overloadable or either is type-dependent),
14663 // or CreateBuiltinBinOp (in any other case). We also want to get
14664 // any placeholder types out of the way.
14665
14666 // Handle pseudo-objects in the LHS.
14667 if (const BuiltinType *pty = LHSExpr->getType()->getAsPlaceholderType()) {
14668 // Assignments with a pseudo-object l-value need special analysis.
14669 if (pty->getKind() == BuiltinType::PseudoObject &&
14670 BinaryOperator::isAssignmentOp(Opc))
14671 return checkPseudoObjectAssignment(S, OpLoc, Opc, LHSExpr, RHSExpr);
14672
14673 // Don't resolve overloads if the other type is overloadable.
14674 if (getLangOpts().CPlusPlus && pty->getKind() == BuiltinType::Overload) {
14675 // We can't actually test that if we still have a placeholder,
14676 // though. Fortunately, none of the exceptions we see in that
14677 // code below are valid when the LHS is an overload set. Note
14678 // that an overload set can be dependently-typed, but it never
14679 // instantiates to having an overloadable type.
14680 ExprResult resolvedRHS = CheckPlaceholderExpr(RHSExpr);
14681 if (resolvedRHS.isInvalid()) return ExprError();
14682 RHSExpr = resolvedRHS.get();
14683
14684 if (RHSExpr->isTypeDependent() ||
14685 RHSExpr->getType()->isOverloadableType())
14686 return BuildOverloadedBinOp(*this, S, OpLoc, Opc, LHSExpr, RHSExpr);
14687 }
14688
14689 // If we're instantiating "a.x < b" or "A::x < b" and 'x' names a function
14690 // template, diagnose the missing 'template' keyword instead of diagnosing
14691 // an invalid use of a bound member function.
14692 //
14693 // Note that "A::x < b" might be valid if 'b' has an overloadable type due
14694 // to C++1z [over.over]/1.4, but we already checked for that case above.
14695 if (Opc == BO_LT && inTemplateInstantiation() &&
14696 (pty->getKind() == BuiltinType::BoundMember ||
14697 pty->getKind() == BuiltinType::Overload)) {
14698 auto *OE = dyn_cast<OverloadExpr>(LHSExpr);
14699 if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() &&
14700 std::any_of(OE->decls_begin(), OE->decls_end(), [](NamedDecl *ND) {
14701 return isa<FunctionTemplateDecl>(ND);
14702 })) {
14703 Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc()
14704 : OE->getNameLoc(),
14705 diag::err_template_kw_missing)
14706 << OE->getName().getAsString() << "";
14707 return ExprError();
14708 }
14709 }
14710
14711 ExprResult LHS = CheckPlaceholderExpr(LHSExpr);
14712 if (LHS.isInvalid()) return ExprError();
14713 LHSExpr = LHS.get();
14714 }
14715
14716 // Handle pseudo-objects in the RHS.
14717 if (const BuiltinType *pty = RHSExpr->getType()->getAsPlaceholderType()) {
14718 // An overload in the RHS can potentially be resolved by the type
14719 // being assigned to.
14720 if (Opc == BO_Assign && pty->getKind() == BuiltinType::Overload) {
14721 if (getLangOpts().CPlusPlus &&
14722 (LHSExpr->isTypeDependent() || RHSExpr->isTypeDependent() ||
14723 LHSExpr->getType()->isOverloadableType()))
14724 return BuildOverloadedBinOp(*this, S, OpLoc, Opc, LHSExpr, RHSExpr);
14725
14726 return CreateBuiltinBinOp(OpLoc, Opc, LHSExpr, RHSExpr);
14727 }
14728
14729 // Don't resolve overloads if the other type is overloadable.
14730 if (getLangOpts().CPlusPlus && pty->getKind() == BuiltinType::Overload &&
14731 LHSExpr->getType()->isOverloadableType())
14732 return BuildOverloadedBinOp(*this, S, OpLoc, Opc, LHSExpr, RHSExpr);
14733
14734 ExprResult resolvedRHS = CheckPlaceholderExpr(RHSExpr);
14735 if (!resolvedRHS.isUsable()) return ExprError();
14736 RHSExpr = resolvedRHS.get();
14737 }
14738
14739 if (getLangOpts().CPlusPlus) {
14740 // If either expression is type-dependent, always build an
14741 // overloaded op.
14742 if (LHSExpr->isTypeDependent() || RHSExpr->isTypeDependent())
14743 return BuildOverloadedBinOp(*this, S, OpLoc, Opc, LHSExpr, RHSExpr);
14744
14745 // Otherwise, build an overloaded op if either expression has an
14746 // overloadable type.
14747 if (LHSExpr->getType()->isOverloadableType() ||
14748 RHSExpr->getType()->isOverloadableType())
14749 return BuildOverloadedBinOp(*this, S, OpLoc, Opc, LHSExpr, RHSExpr);
14750 }
14751
14752 if (getLangOpts().RecoveryAST &&
14753 (LHSExpr->isTypeDependent() || RHSExpr->isTypeDependent())) {
14754 assert(!getLangOpts().CPlusPlus)(static_cast<void> (0));
14755 assert((LHSExpr->containsErrors() || RHSExpr->containsErrors()) &&(static_cast<void> (0))
14756 "Should only occur in error-recovery path.")(static_cast<void> (0));
14757 if (BinaryOperator::isCompoundAssignmentOp(Opc))
14758 // C [6.15.16] p3:
14759 // An assignment expression has the value of the left operand after the
14760 // assignment, but is not an lvalue.
14761 return CompoundAssignOperator::Create(
14762 Context, LHSExpr, RHSExpr, Opc,
14763 LHSExpr->getType().getUnqualifiedType(), VK_PRValue, OK_Ordinary,
14764 OpLoc, CurFPFeatureOverrides());
14765 QualType ResultType;
14766 switch (Opc) {
14767 case BO_Assign:
14768 ResultType = LHSExpr->getType().getUnqualifiedType();
14769 break;
14770 case BO_LT:
14771 case BO_GT:
14772 case BO_LE:
14773 case BO_GE:
14774 case BO_EQ:
14775 case BO_NE:
14776 case BO_LAnd:
14777 case BO_LOr:
14778 // These operators have a fixed result type regardless of operands.
14779 ResultType = Context.IntTy;
14780 break;
14781 case BO_Comma:
14782 ResultType = RHSExpr->getType();
14783 break;
14784 default:
14785 ResultType = Context.DependentTy;
14786 break;
14787 }
14788 return BinaryOperator::Create(Context, LHSExpr, RHSExpr, Opc, ResultType,
14789 VK_PRValue, OK_Ordinary, OpLoc,
14790 CurFPFeatureOverrides());
14791 }
14792
14793 // Build a built-in binary operation.
14794 return CreateBuiltinBinOp(OpLoc, Opc, LHSExpr, RHSExpr);
14795}
14796
14797static bool isOverflowingIntegerType(ASTContext &Ctx, QualType T) {
14798 if (T.isNull() || T->isDependentType())
14799 return false;
14800
14801 if (!T->isPromotableIntegerType())
14802 return true;
14803
14804 return Ctx.getIntWidth(T) >= Ctx.getIntWidth(Ctx.IntTy);
14805}
14806
14807ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc,
14808 UnaryOperatorKind Opc,
14809 Expr *InputExpr) {
14810 ExprResult Input = InputExpr;
14811 ExprValueKind VK = VK_PRValue;
14812 ExprObjectKind OK = OK_Ordinary;
14813 QualType resultType;
14814 bool CanOverflow = false;
14815
14816 bool ConvertHalfVec = false;
14817 if (getLangOpts().OpenCL) {
14818 QualType Ty = InputExpr->getType();
14819 // The only legal unary operation for atomics is '&'.
14820 if ((Opc != UO_AddrOf && Ty->isAtomicType()) ||
14821 // OpenCL special types - image, sampler, pipe, and blocks are to be used
14822 // only with a builtin functions and therefore should be disallowed here.
14823 (Ty->isImageType() || Ty->isSamplerT() || Ty->isPipeType()
14824 || Ty->isBlockPointerType())) {
14825 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14826 << InputExpr->getType()
14827 << Input.get()->getSourceRange());
14828 }
14829 }
14830
14831 switch (Opc) {
14832 case UO_PreInc:
14833 case UO_PreDec:
14834 case UO_PostInc:
14835 case UO_PostDec:
14836 resultType = CheckIncrementDecrementOperand(*this, Input.get(), VK, OK,
14837 OpLoc,
14838 Opc == UO_PreInc ||
14839 Opc == UO_PostInc,
14840 Opc == UO_PreInc ||
14841 Opc == UO_PreDec);
14842 CanOverflow = isOverflowingIntegerType(Context, resultType);
14843 break;
14844 case UO_AddrOf:
14845 resultType = CheckAddressOfOperand(Input, OpLoc);
14846 CheckAddressOfNoDeref(InputExpr);
14847 RecordModifiableNonNullParam(*this, InputExpr);
14848 break;
14849 case UO_Deref: {
14850 Input = DefaultFunctionArrayLvalueConversion(Input.get());
14851 if (Input.isInvalid()) return ExprError();
14852 resultType = CheckIndirectionOperand(*this, Input.get(), VK, OpLoc);
14853 break;
14854 }
14855 case UO_Plus:
14856 case UO_Minus:
14857 CanOverflow = Opc == UO_Minus &&
14858 isOverflowingIntegerType(Context, Input.get()->getType());
14859 Input = UsualUnaryConversions(Input.get());
14860 if (Input.isInvalid()) return ExprError();
14861 // Unary plus and minus require promoting an operand of half vector to a
14862 // float vector and truncating the result back to a half vector. For now, we
14863 // do this only when HalfArgsAndReturns is set (that is, when the target is
14864 // arm or arm64).
14865 ConvertHalfVec = needsConversionOfHalfVec(true, Context, Input.get());
14866
14867 // If the operand is a half vector, promote it to a float vector.
14868 if (ConvertHalfVec)
14869 Input = convertVector(Input.get(), Context.FloatTy, *this);
14870 resultType = Input.get()->getType();
14871 if (resultType->isDependentType())
14872 break;
14873 if (resultType->isArithmeticType()) // C99 6.5.3.3p1
14874 break;
14875 else if (resultType->isVectorType() &&
14876 // The z vector extensions don't allow + or - with bool vectors.
14877 (!Context.getLangOpts().ZVector ||
14878 resultType->castAs<VectorType>()->getVectorKind() !=
14879 VectorType::AltiVecBool))
14880 break;
14881 else if (getLangOpts().CPlusPlus && // C++ [expr.unary.op]p6
14882 Opc == UO_Plus &&
14883 resultType->isPointerType())
14884 break;
14885
14886 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14887 << resultType << Input.get()->getSourceRange());
14888
14889 case UO_Not: // bitwise complement
14890 Input = UsualUnaryConversions(Input.get());
14891 if (Input.isInvalid())
14892 return ExprError();
14893 resultType = Input.get()->getType();
14894 if (resultType->isDependentType())
14895 break;
14896 // C99 6.5.3.3p1. We allow complex int and float as a GCC extension.
14897 if (resultType->isComplexType() || resultType->isComplexIntegerType())
14898 // C99 does not support '~' for complex conjugation.
14899 Diag(OpLoc, diag::ext_integer_complement_complex)
14900 << resultType << Input.get()->getSourceRange();
14901 else if (resultType->hasIntegerRepresentation())
14902 break;
14903 else if (resultType->isExtVectorType() && Context.getLangOpts().OpenCL) {
14904 // OpenCL v1.1 s6.3.f: The bitwise operator not (~) does not operate
14905 // on vector float types.
14906 QualType T = resultType->castAs<ExtVectorType>()->getElementType();
14907 if (!T->isIntegerType())
14908 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14909 << resultType << Input.get()->getSourceRange());
14910 } else {
14911 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14912 << resultType << Input.get()->getSourceRange());
14913 }
14914 break;
14915
14916 case UO_LNot: // logical negation
14917 // Unlike +/-/~, integer promotions aren't done here (C99 6.5.3.3p5).
14918 Input = DefaultFunctionArrayLvalueConversion(Input.get());
14919 if (Input.isInvalid()) return ExprError();
14920 resultType = Input.get()->getType();
14921
14922 // Though we still have to promote half FP to float...
14923 if (resultType->isHalfType() && !Context.getLangOpts().NativeHalfType) {
14924 Input = ImpCastExprToType(Input.get(), Context.FloatTy, CK_FloatingCast).get();
14925 resultType = Context.FloatTy;
14926 }
14927
14928 if (resultType->isDependentType())
14929 break;
14930 if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) {
14931 // C99 6.5.3.3p1: ok, fallthrough;
14932 if (Context.getLangOpts().CPlusPlus) {
14933 // C++03 [expr.unary.op]p8, C++0x [expr.unary.op]p9:
14934 // operand contextually converted to bool.
14935 Input = ImpCastExprToType(Input.get(), Context.BoolTy,
14936 ScalarTypeToBooleanCastKind(resultType));
14937 } else if (Context.getLangOpts().OpenCL &&
14938 Context.getLangOpts().OpenCLVersion < 120) {
14939 // OpenCL v1.1 6.3.h: The logical operator not (!) does not
14940 // operate on scalar float types.
14941 if (!resultType->isIntegerType() && !resultType->isPointerType())
14942 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14943 << resultType << Input.get()->getSourceRange());
14944 }
14945 } else if (resultType->isExtVectorType()) {
14946 if (Context.getLangOpts().OpenCL &&
14947 Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {
14948 // OpenCL v1.1 6.3.h: The logical operator not (!) does not
14949 // operate on vector float types.
14950 QualType T = resultType->castAs<ExtVectorType>()->getElementType();
14951 if (!T->isIntegerType())
14952 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14953 << resultType << Input.get()->getSourceRange());
14954 }
14955 // Vector logical not returns the signed variant of the operand type.
14956 resultType = GetSignedVectorType(resultType);
14957 break;
14958 } else if (Context.getLangOpts().CPlusPlus && resultType->isVectorType()) {
14959 const VectorType *VTy = resultType->castAs<VectorType>();
14960 if (VTy->getVectorKind() != VectorType::GenericVector)
14961 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14962 << resultType << Input.get()->getSourceRange());
14963
14964 // Vector logical not returns the signed variant of the operand type.
14965 resultType = GetSignedVectorType(resultType);
14966 break;
14967 } else {
14968 return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
14969 << resultType << Input.get()->getSourceRange());
14970 }
14971
14972 // LNot always has type int. C99 6.5.3.3p5.
14973 // In C++, it's bool. C++ 5.3.1p8
14974 resultType = Context.getLogicalOperationType();
14975 break;
14976 case UO_Real:
14977 case UO_Imag:
14978 resultType = CheckRealImagOperand(*this, Input, OpLoc, Opc == UO_Real);
14979 // _Real maps ordinary l-values into ordinary l-values. _Imag maps ordinary
14980 // complex l-values to ordinary l-values and all other values to r-values.
14981 if (Input.isInvalid()) return ExprError();
14982 if (Opc == UO_Real || Input.get()->getType()->isAnyComplexType()) {
14983 if (Input.get()->isGLValue() &&
14984 Input.get()->getObjectKind() == OK_Ordinary)
14985 VK = Input.get()->getValueKind();
14986 } else if (!getLangOpts().CPlusPlus) {
14987 // In C, a volatile scalar is read by __imag. In C++, it is not.
14988 Input = DefaultLvalueConversion(Input.get());
14989 }
14990 break;
14991 case UO_Extension:
14992 resultType = Input.get()->getType();
14993 VK = Input.get()->getValueKind();
14994 OK = Input.get()->getObjectKind();
14995 break;
14996 case UO_Coawait:
14997 // It's unnecessary to represent the pass-through operator co_await in the
14998 // AST; just return the input expression instead.
14999 assert(!Input.get()->getType()->isDependentType() &&(static_cast<void> (0))
15000 "the co_await expression must be non-dependant before "(static_cast<void> (0))
15001 "building operator co_await")(static_cast<void> (0));
15002 return Input;
15003 }
15004 if (resultType.isNull() || Input.isInvalid())
15005 return ExprError();
15006
15007 // Check for array bounds violations in the operand of the UnaryOperator,
15008 // except for the '*' and '&' operators that have to be handled specially
15009 // by CheckArrayAccess (as there are special cases like &array[arraysize]
15010 // that are explicitly defined as valid by the standard).
15011 if (Opc != UO_AddrOf && Opc != UO_Deref)
15012 CheckArrayAccess(Input.get());
15013
15014 auto *UO =
15015 UnaryOperator::Create(Context, Input.get(), Opc, resultType, VK, OK,
15016 OpLoc, CanOverflow, CurFPFeatureOverrides());
15017
15018 if (Opc == UO_Deref && UO->getType()->hasAttr(attr::NoDeref) &&
15019 !isa<ArrayType>(UO->getType().getDesugaredType(Context)) &&
15020 !isUnevaluatedContext())
15021 ExprEvalContexts.back().PossibleDerefs.insert(UO);
15022
15023 // Convert the result back to a half vector.
15024 if (ConvertHalfVec)
15025 return convertVector(UO, Context.HalfTy, *this);
15026 return UO;
15027}
15028
15029/// Determine whether the given expression is a qualified member
15030/// access expression, of a form that could be turned into a pointer to member
15031/// with the address-of operator.
15032bool Sema::isQualifiedMemberAccess(Expr *E) {
15033 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
15034 if (!DRE->getQualifier())
15035 return false;
15036
15037 ValueDecl *VD = DRE->getDecl();
15038 if (!VD->isCXXClassMember())
15039 return false;
15040
15041 if (isa<FieldDecl>(VD) || isa<IndirectFieldDecl>(VD))
15042 return true;
15043 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(VD))
15044 return Method->isInstance();
15045
15046 return false;
15047 }
15048
15049 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {
15050 if (!ULE->getQualifier())
15051 return false;
15052
15053 for (NamedDecl *D : ULE->decls()) {
15054 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
15055 if (Method->isInstance())
15056 return true;
15057 } else {
15058 // Overload set does not contain methods.
15059 break;
15060 }
15061 }
15062
15063 return false;
15064 }
15065
15066 return false;
15067}
15068
15069ExprResult Sema::BuildUnaryOp(Scope *S, SourceLocation OpLoc,
15070 UnaryOperatorKind Opc, Expr *Input) {
15071 // First things first: handle placeholders so that the
15072 // overloaded-operator check considers the right type.
15073 if (const BuiltinType *pty = Input->getType()->getAsPlaceholderType()) {
15074 // Increment and decrement of pseudo-object references.
15075 if (pty->getKind() == BuiltinType::PseudoObject &&
15076 UnaryOperator::isIncrementDecrementOp(Opc))
15077 return checkPseudoObjectIncDec(S, OpLoc, Opc, Input);
15078
15079 // extension is always a builtin operator.
15080 if (Opc == UO_Extension)
15081 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
15082
15083 // & gets special logic for several kinds of placeholder.
15084 // The builtin code knows what to do.
15085 if (Opc == UO_AddrOf &&
15086 (pty->getKind() == BuiltinType::Overload ||
15087 pty->getKind() == BuiltinType::UnknownAny ||
15088 pty->getKind() == BuiltinType::BoundMember))
15089 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
15090
15091 // Anything else needs to be handled now.
15092 ExprResult Result = CheckPlaceholderExpr(Input);
15093 if (Result.isInvalid()) return ExprError();
15094 Input = Result.get();
15095 }
15096
15097 if (getLangOpts().CPlusPlus && Input->getType()->isOverloadableType() &&
15098 UnaryOperator::getOverloadedOperator(Opc) != OO_None &&
15099 !(Opc == UO_AddrOf && isQualifiedMemberAccess(Input))) {
15100 // Find all of the overloaded operators visible from this point.
15101 UnresolvedSet<16> Functions;
15102 OverloadedOperatorKind OverOp = UnaryOperator::getOverloadedOperator(Opc);
15103 if (S && OverOp != OO_None)
15104 LookupOverloadedOperatorName(OverOp, S, Functions);
15105
15106 return CreateOverloadedUnaryOp(OpLoc, Opc, Functions, Input);
15107 }
15108
15109 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
15110}
15111
15112// Unary Operators. 'Tok' is the token for the operator.
15113ExprResult Sema::ActOnUnaryOp(Scope *S, SourceLocation OpLoc,
15114 tok::TokenKind Op, Expr *Input) {
15115 return BuildUnaryOp(S, OpLoc, ConvertTokenKindToUnaryOpcode(Op), Input);
15116}
15117
15118/// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
15119ExprResult Sema::ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc,
15120 LabelDecl *TheDecl) {
15121 TheDecl->markUsed(Context);
15122 // Create the AST node. The address of a label always has type 'void*'.
15123 return new (Context) AddrLabelExpr(OpLoc, LabLoc, TheDecl,
15124 Context.getPointerType(Context.VoidTy));
15125}
15126
15127void Sema::ActOnStartStmtExpr() {
15128 PushExpressionEvaluationContext(ExprEvalContexts.back().Context);
15129}
15130
15131void Sema::ActOnStmtExprError() {
15132 // Note that function is also called by TreeTransform when leaving a
15133 // StmtExpr scope without rebuilding anything.
15134
15135 DiscardCleanupsInEvaluationContext();
15136 PopExpressionEvaluationContext();
15137}
15138
15139ExprResult Sema::ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
15140 SourceLocation RPLoc) {
15141 return BuildStmtExpr(LPLoc, SubStmt, RPLoc, getTemplateDepth(S));
15142}
15143
15144ExprResult Sema::BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt,
15145 SourceLocation RPLoc, unsigned TemplateDepth) {
15146 assert(SubStmt && isa<CompoundStmt>(SubStmt) && "Invalid action invocation!")(static_cast<void> (0));
15147 CompoundStmt *Compound = cast<CompoundStmt>(SubStmt);
15148
15149 if (hasAnyUnrecoverableErrorsInThisFunction())
15150 DiscardCleanupsInEvaluationContext();
15151 assert(!Cleanup.exprNeedsCleanups() &&(static_cast<void> (0))
15152 "cleanups within StmtExpr not correctly bound!")(static_cast<void> (0));
15153 PopExpressionEvaluationContext();
15154
15155 // FIXME: there are a variety of strange constraints to enforce here, for
15156 // example, it is not possible to goto into a stmt expression apparently.
15157 // More semantic analysis is needed.
15158
15159 // If there are sub-stmts in the compound stmt, take the type of the last one
15160 // as the type of the stmtexpr.
15161 QualType Ty = Context.VoidTy;
15162 bool StmtExprMayBindToTemp = false;
15163 if (!Compound->body_empty()) {
15164 // For GCC compatibility we get the last Stmt excluding trailing NullStmts.
15165 if (const auto *LastStmt =
15166 dyn_cast<ValueStmt>(Compound->getStmtExprResult())) {
15167 if (const Expr *Value = LastStmt->getExprStmt()) {
15168 StmtExprMayBindToTemp = true;
15169 Ty = Value->getType();
15170 }
15171 }
15172 }
15173
15174 // FIXME: Check that expression type is complete/non-abstract; statement
15175 // expressions are not lvalues.
15176 Expr *ResStmtExpr =
15177 new (Context) StmtExpr(Compound, Ty, LPLoc, RPLoc, TemplateDepth);
15178 if (StmtExprMayBindToTemp)
15179 return MaybeBindToTemporary(ResStmtExpr);
15180 return ResStmtExpr;
15181}
15182
15183ExprResult Sema::ActOnStmtExprResult(ExprResult ER) {
15184 if (ER.isInvalid())
15185 return ExprError();
15186
15187 // Do function/array conversion on the last expression, but not
15188 // lvalue-to-rvalue. However, initialize an unqualified type.
15189 ER = DefaultFunctionArrayConversion(ER.get());
15190 if (ER.isInvalid())
15191 return ExprError();
15192 Expr *E = ER.get();
15193
15194 if (E->isTypeDependent())
15195 return E;
15196
15197 // In ARC, if the final expression ends in a consume, splice
15198 // the consume out and bind it later. In the alternate case
15199 // (when dealing with a retainable type), the result
15200 // initialization will create a produce. In both cases the
15201 // result will be +1, and we'll need to balance that out with
15202 // a bind.
15203 auto *Cast = dyn_cast<ImplicitCastExpr>(E);
15204 if (Cast && Cast->getCastKind() == CK_ARCConsumeObject)
15205 return Cast->getSubExpr();
15206
15207 // FIXME: Provide a better location for the initialization.
15208 return PerformCopyInitialization(
15209 InitializedEntity::InitializeStmtExprResult(
15210 E->getBeginLoc(), E->getType().getUnqualifiedType()),
15211 SourceLocation(), E);
15212}
15213
15214ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc,
15215 TypeSourceInfo *TInfo,
15216 ArrayRef<OffsetOfComponent> Components,
15217 SourceLocation RParenLoc) {
15218 QualType ArgTy = TInfo->getType();
15219 bool Dependent = ArgTy->isDependentType();
15220 SourceRange TypeRange = TInfo->getTypeLoc().getLocalSourceRange();
15221
15222 // We must have at least one component that refers to the type, and the first
15223 // one is known to be a field designator. Verify that the ArgTy represents
15224 // a struct/union/class.
15225 if (!Dependent && !ArgTy->isRecordType())
15226 return ExprError(Diag(BuiltinLoc, diag::err_offsetof_record_type)
15227 << ArgTy << TypeRange);
15228
15229 // Type must be complete per C99 7.17p3 because a declaring a variable
15230 // with an incomplete type would be ill-formed.
15231 if (!Dependent
15232 && RequireCompleteType(BuiltinLoc, ArgTy,
15233 diag::err_offsetof_incomplete_type, TypeRange))
15234 return ExprError();
15235
15236 bool DidWarnAboutNonPOD = false;
15237 QualType CurrentType = ArgTy;
15238 SmallVector<OffsetOfNode, 4> Comps;
15239 SmallVector<Expr*, 4> Exprs;
15240 for (const OffsetOfComponent &OC : Components) {
15241 if (OC.isBrackets) {
15242 // Offset of an array sub-field. TODO: Should we allow vector elements?
15243 if (!CurrentType->isDependentType()) {
15244 const ArrayType *AT = Context.getAsArrayType(CurrentType);
15245 if(!AT)
15246 return ExprError(Diag(OC.LocEnd, diag::err_offsetof_array_type)
15247 << CurrentType);
15248 CurrentType = AT->getElementType();
15249 } else
15250 CurrentType = Context.DependentTy;
15251
15252 ExprResult IdxRval = DefaultLvalueConversion(static_cast<Expr*>(OC.U.E));
15253 if (IdxRval.isInvalid())
15254 return ExprError();
15255 Expr *Idx = IdxRval.get();
15256
15257 // The expression must be an integral expression.
15258 // FIXME: An integral constant expression?
15259 if (!Idx->isTypeDependent() && !Idx->isValueDependent() &&
15260 !Idx->getType()->isIntegerType())
15261 return ExprError(
15262 Diag(Idx->getBeginLoc(), diag::err_typecheck_subscript_not_integer)
15263 << Idx->getSourceRange());
15264
15265 // Record this array index.
15266 Comps.push_back(OffsetOfNode(OC.LocStart, Exprs.size(), OC.LocEnd));
15267 Exprs.push_back(Idx);
15268 continue;
15269 }
15270
15271 // Offset of a field.
15272 if (CurrentType->isDependentType()) {
15273 // We have the offset of a field, but we can't look into the dependent
15274 // type. Just record the identifier of the field.
15275 Comps.push_back(OffsetOfNode(OC.LocStart, OC.U.IdentInfo, OC.LocEnd));
15276 CurrentType = Context.DependentTy;
15277 continue;
15278 }
15279
15280 // We need to have a complete type to look into.
15281 if (RequireCompleteType(OC.LocStart, CurrentType,
15282 diag::err_offsetof_incomplete_type))
15283 return ExprError();
15284
15285 // Look for the designated field.
15286 const RecordType *RC = CurrentType->getAs<RecordType>();
15287 if (!RC)
15288 return ExprError(Diag(OC.LocEnd, diag::err_offsetof_record_type)
15289 << CurrentType);
15290 RecordDecl *RD = RC->getDecl();
15291
15292 // C++ [lib.support.types]p5:
15293 // The macro offsetof accepts a restricted set of type arguments in this
15294 // International Standard. type shall be a POD structure or a POD union
15295 // (clause 9).
15296 // C++11 [support.types]p4:
15297 // If type is not a standard-layout class (Clause 9), the results are
15298 // undefined.
15299 if (CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
15300 bool IsSafe = LangOpts.CPlusPlus11? CRD->isStandardLayout() : CRD->isPOD();
15301 unsigned DiagID =
15302 LangOpts.CPlusPlus11? diag::ext_offsetof_non_standardlayout_type
15303 : diag::ext_offsetof_non_pod_type;
15304
15305 if (!IsSafe && !DidWarnAboutNonPOD &&
15306 DiagRuntimeBehavior(BuiltinLoc, nullptr,
15307 PDiag(DiagID)
15308 << SourceRange(Components[0].LocStart, OC.LocEnd)
15309 << CurrentType))
15310 DidWarnAboutNonPOD = true;
15311 }
15312
15313 // Look for the field.
15314 LookupResult R(*this, OC.U.IdentInfo, OC.LocStart, LookupMemberName);
15315 LookupQualifiedName(R, RD);
15316 FieldDecl *MemberDecl = R.getAsSingle<FieldDecl>();
15317 IndirectFieldDecl *IndirectMemberDecl = nullptr;
15318 if (!MemberDecl) {
15319 if ((IndirectMemberDecl = R.getAsSingle<IndirectFieldDecl>()))
15320 MemberDecl = IndirectMemberDecl->getAnonField();
15321 }
15322
15323 if (!MemberDecl)
15324 return ExprError(Diag(BuiltinLoc, diag::err_no_member)
15325 << OC.U.IdentInfo << RD << SourceRange(OC.LocStart,
15326 OC.LocEnd));
15327
15328 // C99 7.17p3:
15329 // (If the specified member is a bit-field, the behavior is undefined.)
15330 //
15331 // We diagnose this as an error.
15332 if (MemberDecl->isBitField()) {
15333 Diag(OC.LocEnd, diag::err_offsetof_bitfield)
15334 << MemberDecl->getDeclName()
15335 << SourceRange(BuiltinLoc, RParenLoc);
15336 Diag(MemberDecl->getLocation(), diag::note_bitfield_decl);
15337 return ExprError();
15338 }
15339
15340 RecordDecl *Parent = MemberDecl->getParent();
15341 if (IndirectMemberDecl)
15342 Parent = cast<RecordDecl>(IndirectMemberDecl->getDeclContext());
15343
15344 // If the member was found in a base class, introduce OffsetOfNodes for
15345 // the base class indirections.
15346 CXXBasePaths Paths;
15347 if (IsDerivedFrom(OC.LocStart, CurrentType, Context.getTypeDeclType(Parent),
15348 Paths)) {
15349 if (Paths.getDetectedVirtual()) {
15350 Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base)
15351 << MemberDecl->getDeclName()
15352 << SourceRange(BuiltinLoc, RParenLoc);
15353 return ExprError();
15354 }
15355
15356 CXXBasePath &Path = Paths.front();
15357 for (const CXXBasePathElement &B : Path)
15358 Comps.push_back(OffsetOfNode(B.Base));
15359 }
15360
15361 if (IndirectMemberDecl) {
15362 for (auto *FI : IndirectMemberDecl->chain()) {
15363 assert(isa<FieldDecl>(FI))(static_cast<void> (0));
15364 Comps.push_back(OffsetOfNode(OC.LocStart,
15365 cast<FieldDecl>(FI), OC.LocEnd));
15366 }
15367 } else
15368 Comps.push_back(OffsetOfNode(OC.LocStart, MemberDecl, OC.LocEnd));
15369
15370 CurrentType = MemberDecl->getType().getNonReferenceType();
15371 }
15372
15373 return OffsetOfExpr::Create(Context, Context.getSizeType(), BuiltinLoc, TInfo,
15374 Comps, Exprs, RParenLoc);
15375}
15376
15377ExprResult Sema::ActOnBuiltinOffsetOf(Scope *S,
15378 SourceLocation BuiltinLoc,
15379 SourceLocation TypeLoc,
15380 ParsedType ParsedArgTy,
15381 ArrayRef<OffsetOfComponent> Components,
15382 SourceLocation RParenLoc) {
15383
15384 TypeSourceInfo *ArgTInfo;
15385 QualType ArgTy = GetTypeFromParser(ParsedArgTy, &ArgTInfo);
15386 if (ArgTy.isNull())
15387 return ExprError();
15388
15389 if (!ArgTInfo)
15390 ArgTInfo = Context.getTrivialTypeSourceInfo(ArgTy, TypeLoc);
15391
15392 return BuildBuiltinOffsetOf(BuiltinLoc, ArgTInfo, Components, RParenLoc);
15393}
15394
15395
15396ExprResult Sema::ActOnChooseExpr(SourceLocation BuiltinLoc,
15397 Expr *CondExpr,
15398 Expr *LHSExpr, Expr *RHSExpr,
15399 SourceLocation RPLoc) {
15400 assert((CondExpr && LHSExpr && RHSExpr) && "Missing type argument(s)")(static_cast<void> (0));
15401
15402 ExprValueKind VK = VK_PRValue;
15403 ExprObjectKind OK = OK_Ordinary;
15404 QualType resType;
15405 bool CondIsTrue = false;
15406 if (CondExpr->isTypeDependent() || CondExpr->isValueDependent()) {
15407 resType = Context.DependentTy;
15408 } else {
15409 // The conditional expression is required to be a constant expression.
15410 llvm::APSInt condEval(32);
15411 ExprResult CondICE = VerifyIntegerConstantExpression(
15412 CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);
15413 if (CondICE.isInvalid())
15414 return ExprError();
15415 CondExpr = CondICE.get();
15416 CondIsTrue = condEval.getZExtValue();
15417
15418 // If the condition is > zero, then the AST type is the same as the LHSExpr.
15419 Expr *ActiveExpr = CondIsTrue ? LHSExpr : RHSExpr;
15420
15421 resType = ActiveExpr->getType();
15422 VK = ActiveExpr->getValueKind();
15423 OK = ActiveExpr->getObjectKind();
15424 }
15425
15426 return new (Context) ChooseExpr(BuiltinLoc, CondExpr, LHSExpr, RHSExpr,
15427 resType, VK, OK, RPLoc, CondIsTrue);
15428}
15429
15430//===----------------------------------------------------------------------===//
15431// Clang Extensions.
15432//===----------------------------------------------------------------------===//
15433
15434/// ActOnBlockStart - This callback is invoked when a block literal is started.
15435void Sema::ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope) {
15436 BlockDecl *Block = BlockDecl::Create(Context, CurContext, CaretLoc);
15437
15438 if (LangOpts.CPlusPlus) {
15439 MangleNumberingContext *MCtx;
15440 Decl *ManglingContextDecl;
15441 std::tie(MCtx, ManglingContextDecl) =
15442 getCurrentMangleNumberContext(Block->getDeclContext());
15443 if (MCtx) {
15444 unsigned ManglingNumber = MCtx->getManglingNumber(Block);
15445 Block->setBlockMangling(ManglingNumber, ManglingContextDecl);
15446 }
15447 }
15448
15449 PushBlockScope(CurScope, Block);
15450 CurContext->addDecl(Block);
15451 if (CurScope)
15452 PushDeclContext(CurScope, Block);
15453 else
15454 CurContext = Block;
15455
15456 getCurBlock()->HasImplicitReturnType = true;
15457
15458 // Enter a new evaluation context to insulate the block from any
15459 // cleanups from the enclosing full-expression.
15460 PushExpressionEvaluationContext(
15461 ExpressionEvaluationContext::PotentiallyEvaluated);
15462}
15463
15464void Sema::ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
15465 Scope *CurScope) {
15466 assert(ParamInfo.getIdentifier() == nullptr &&(static_cast<void> (0))
15467 "block-id should have no identifier!")(static_cast<void> (0));
15468 assert(ParamInfo.getContext() == DeclaratorContext::BlockLiteral)(static_cast<void> (0));
15469 BlockScopeInfo *CurBlock = getCurBlock();
15470
15471 TypeSourceInfo *Sig = GetTypeForDeclarator(ParamInfo, CurScope);
15472 QualType T = Sig->getType();
15473
15474 // FIXME: We should allow unexpanded parameter packs here, but that would,
15475 // in turn, make the block expression contain unexpanded parameter packs.
15476 if (DiagnoseUnexpandedParameterPack(CaretLoc, Sig, UPPC_Block)) {
15477 // Drop the parameters.
15478 FunctionProtoType::ExtProtoInfo EPI;
15479 EPI.HasTrailingReturn = false;
15480 EPI.TypeQuals.addConst();
15481 T = Context.getFunctionType(Context.DependentTy, None, EPI);
15482 Sig = Context.getTrivialTypeSourceInfo(T);
15483 }
15484
15485 // GetTypeForDeclarator always produces a function type for a block
15486 // literal signature. Furthermore, it is always a FunctionProtoType
15487 // unless the function was written with a typedef.
15488 assert(T->isFunctionType() &&(static_cast<void> (0))
15489 "GetTypeForDeclarator made a non-function block signature")(static_cast<void> (0));
15490
15491 // Look for an explicit signature in that function type.
15492 FunctionProtoTypeLoc ExplicitSignature;
15493
15494 if ((ExplicitSignature = Sig->getTypeLoc()
15495 .getAsAdjusted<FunctionProtoTypeLoc>())) {
15496
15497 // Check whether that explicit signature was synthesized by
15498 // GetTypeForDeclarator. If so, don't save that as part of the
15499 // written signature.
15500 if (ExplicitSignature.getLocalRangeBegin() ==
15501 ExplicitSignature.getLocalRangeEnd()) {
15502 // This would be much cheaper if we stored TypeLocs instead of
15503 // TypeSourceInfos.
15504 TypeLoc Result = ExplicitSignature.getReturnLoc();
15505 unsigned Size = Result.getFullDataSize();
15506 Sig = Context.CreateTypeSourceInfo(Result.getType(), Size);
15507 Sig->getTypeLoc().initializeFullCopy(Result, Size);
15508
15509 ExplicitSignature = FunctionProtoTypeLoc();
15510 }
15511 }
15512
15513 CurBlock->TheDecl->setSignatureAsWritten(Sig);
15514 CurBlock->FunctionType = T;
15515
15516 const auto *Fn = T->castAs<FunctionType>();
15517 QualType RetTy = Fn->getReturnType();
15518 bool isVariadic =
15519 (isa<FunctionProtoType>(Fn) && cast<FunctionProtoType>(Fn)->isVariadic());
15520
15521 CurBlock->TheDecl->setIsVariadic(isVariadic);
15522
15523 // Context.DependentTy is used as a placeholder for a missing block
15524 // return type. TODO: what should we do with declarators like:
15525 // ^ * { ... }
15526 // If the answer is "apply template argument deduction"....
15527 if (RetTy != Context.DependentTy) {
15528 CurBlock->ReturnType = RetTy;
15529 CurBlock->TheDecl->setBlockMissingReturnType(false);
15530 CurBlock->HasImplicitReturnType = false;
15531 }
15532
15533 // Push block parameters from the declarator if we had them.
15534 SmallVector<ParmVarDecl*, 8> Params;
15535 if (ExplicitSignature) {
15536 for (unsigned I = 0, E = ExplicitSignature.getNumParams(); I != E; ++I) {
15537 ParmVarDecl *Param = ExplicitSignature.getParam(I);
15538 if (Param->getIdentifier() == nullptr && !Param->isImplicit() &&
15539 !Param->isInvalidDecl() && !getLangOpts().CPlusPlus) {
15540 // Diagnose this as an extension in C17 and earlier.
15541 if (!getLangOpts().C2x)
15542 Diag(Param->getLocation(), diag::ext_parameter_name_omitted_c2x);
15543 }
15544 Params.push_back(Param);
15545 }
15546
15547 // Fake up parameter variables if we have a typedef, like
15548 // ^ fntype { ... }
15549 } else if (const FunctionProtoType *Fn = T->getAs<FunctionProtoType>()) {
15550 for (const auto &I : Fn->param_types()) {
15551 ParmVarDecl *Param = BuildParmVarDeclForTypedef(
15552 CurBlock->TheDecl, ParamInfo.getBeginLoc(), I);
15553 Params.push_back(Param);
15554 }
15555 }
15556
15557 // Set the parameters on the block decl.
15558 if (!Params.empty()) {
15559 CurBlock->TheDecl->setParams(Params);
15560 CheckParmsForFunctionDef(CurBlock->TheDecl->parameters(),
15561 /*CheckParameterNames=*/false);
15562 }
15563
15564 // Finally we can process decl attributes.
15565 ProcessDeclAttributes(CurScope, CurBlock->TheDecl, ParamInfo);
15566
15567 // Put the parameter variables in scope.
15568 for (auto AI : CurBlock->TheDecl->parameters()) {
15569 AI->setOwningFunction(CurBlock->TheDecl);
15570
15571 // If this has an identifier, add it to the scope stack.
15572 if (AI->getIdentifier()) {
15573 CheckShadow(CurBlock->TheScope, AI);
15574
15575 PushOnScopeChains(AI, CurBlock->TheScope);
15576 }
15577 }
15578}
15579
15580/// ActOnBlockError - If there is an error parsing a block, this callback
15581/// is invoked to pop the information about the block from the action impl.
15582void Sema::ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope) {
15583 // Leave the expression-evaluation context.
15584 DiscardCleanupsInEvaluationContext();
15585 PopExpressionEvaluationContext();
15586
15587 // Pop off CurBlock, handle nested blocks.
15588 PopDeclContext();
15589 PopFunctionScopeInfo();
15590}
15591
15592/// ActOnBlockStmtExpr - This is called when the body of a block statement
15593/// literal was successfully completed. ^(int x){...}
15594ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc,
15595 Stmt *Body, Scope *CurScope) {
15596 // If blocks are disabled, emit an error.
15597 if (!LangOpts.Blocks)
15598 Diag(CaretLoc, diag::err_blocks_disable) << LangOpts.OpenCL;
15599
15600 // Leave the expression-evaluation context.
15601 if (hasAnyUnrecoverableErrorsInThisFunction())
15602 DiscardCleanupsInEvaluationContext();
15603 assert(!Cleanup.exprNeedsCleanups() &&(static_cast<void> (0))
15604 "cleanups within block not correctly bound!")(static_cast<void> (0));
15605 PopExpressionEvaluationContext();
15606
15607 BlockScopeInfo *BSI = cast<BlockScopeInfo>(FunctionScopes.back());
15608 BlockDecl *BD = BSI->TheDecl;
15609
15610 if (BSI->HasImplicitReturnType)
15611 deduceClosureReturnType(*BSI);
15612
15613 QualType RetTy = Context.VoidTy;
15614 if (!BSI->ReturnType.isNull())
15615 RetTy = BSI->ReturnType;
15616
15617 bool NoReturn = BD->hasAttr<NoReturnAttr>();
15618 QualType BlockTy;
15619
15620 // If the user wrote a function type in some form, try to use that.
15621 if (!BSI->FunctionType.isNull()) {
15622 const FunctionType *FTy = BSI->FunctionType->castAs<FunctionType>();
15623
15624 FunctionType::ExtInfo Ext = FTy->getExtInfo();
15625 if (NoReturn && !Ext.getNoReturn()) Ext = Ext.withNoReturn(true);
15626
15627 // Turn protoless block types into nullary block types.
15628 if (isa<FunctionNoProtoType>(FTy)) {
15629 FunctionProtoType::ExtProtoInfo EPI;
15630 EPI.ExtInfo = Ext;
15631 BlockTy = Context.getFunctionType(RetTy, None, EPI);
15632
15633 // Otherwise, if we don't need to change anything about the function type,
15634 // preserve its sugar structure.
15635 } else if (FTy->getReturnType() == RetTy &&
15636 (!NoReturn || FTy->getNoReturnAttr())) {
15637 BlockTy = BSI->FunctionType;
15638
15639 // Otherwise, make the minimal modifications to the function type.
15640 } else {
15641 const FunctionProtoType *FPT = cast<FunctionProtoType>(FTy);
15642 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
15643 EPI.TypeQuals = Qualifiers();
15644 EPI.ExtInfo = Ext;
15645 BlockTy = Context.getFunctionType(RetTy, FPT->getParamTypes(), EPI);
15646 }
15647
15648 // If we don't have a function type, just build one from nothing.
15649 } else {
15650 FunctionProtoType::ExtProtoInfo EPI;
15651 EPI.ExtInfo = FunctionType::ExtInfo().withNoReturn(NoReturn);
15652 BlockTy = Context.getFunctionType(RetTy, None, EPI);
15653 }
15654
15655 DiagnoseUnusedParameters(BD->parameters());
15656 BlockTy = Context.getBlockPointerType(BlockTy);
15657
15658 // If needed, diagnose invalid gotos and switches in the block.
15659 if (getCurFunction()->NeedsScopeChecking() &&
15660 !PP.isCodeCompletionEnabled())
15661 DiagnoseInvalidJumps(cast<CompoundStmt>(Body));
15662
15663 BD->setBody(cast<CompoundStmt>(Body));
15664
15665 if (Body && getCurFunction()->HasPotentialAvailabilityViolations)
15666 DiagnoseUnguardedAvailabilityViolations(BD);
15667
15668 // Try to apply the named return value optimization. We have to check again
15669 // if we can do this, though, because blocks keep return statements around
15670 // to deduce an implicit return type.
15671 if (getLangOpts().CPlusPlus && RetTy->isRecordType() &&
15672 !BD->isDependentContext())
15673 computeNRVO(Body, BSI);
15674
15675 if (RetTy.hasNonTrivialToPrimitiveDestructCUnion() ||
15676 RetTy.hasNonTrivialToPrimitiveCopyCUnion())
15677 checkNonTrivialCUnion(RetTy, BD->getCaretLocation(), NTCUC_FunctionReturn,
15678 NTCUK_Destruct|NTCUK_Copy);
15679
15680 PopDeclContext();
15681
15682 // Set the captured variables on the block.
15683 SmallVector<BlockDecl::Capture, 4> Captures;
15684 for (Capture &Cap : BSI->Captures) {
15685 if (Cap.isInvalid() || Cap.isThisCapture())
15686 continue;
15687
15688 VarDecl *Var = Cap.getVariable();
15689 Expr *CopyExpr = nullptr;
15690 if (getLangOpts().CPlusPlus && Cap.isCopyCapture()) {
15691 if (const RecordType *Record =
15692 Cap.getCaptureType()->getAs<RecordType>()) {
15693 // The capture logic needs the destructor, so make sure we mark it.
15694 // Usually this is unnecessary because most local variables have
15695 // their destructors marked at declaration time, but parameters are
15696 // an exception because it's technically only the call site that
15697 // actually requires the destructor.
15698 if (isa<ParmVarDecl>(Var))
15699 FinalizeVarWithDestructor(Var, Record);
15700
15701 // Enter a separate potentially-evaluated context while building block
15702 // initializers to isolate their cleanups from those of the block
15703 // itself.
15704 // FIXME: Is this appropriate even when the block itself occurs in an
15705 // unevaluated operand?
15706 EnterExpressionEvaluationContext EvalContext(
15707 *this, ExpressionEvaluationContext::PotentiallyEvaluated);
15708
15709 SourceLocation Loc = Cap.getLocation();
15710
15711 ExprResult Result = BuildDeclarationNameExpr(
15712 CXXScopeSpec(), DeclarationNameInfo(Var->getDeclName(), Loc), Var);
15713
15714 // According to the blocks spec, the capture of a variable from
15715 // the stack requires a const copy constructor. This is not true
15716 // of the copy/move done to move a __block variable to the heap.
15717 if (!Result.isInvalid() &&
15718 !Result.get()->getType().isConstQualified()) {
15719 Result = ImpCastExprToType(Result.get(),
15720 Result.get()->getType().withConst(),
15721 CK_NoOp, VK_LValue);
15722 }
15723
15724 if (!Result.isInvalid()) {
15725 Result = PerformCopyInitialization(
15726 InitializedEntity::InitializeBlock(Var->getLocation(),
15727 Cap.getCaptureType(), false),
15728 Loc, Result.get());
15729 }
15730
15731 // Build a full-expression copy expression if initialization
15732 // succeeded and used a non-trivial constructor. Recover from
15733 // errors by pretending that the copy isn't necessary.
15734 if (!Result.isInvalid() &&
15735 !cast<CXXConstructExpr>(Result.get())->getConstructor()
15736 ->isTrivial()) {
15737 Result = MaybeCreateExprWithCleanups(Result);
15738 CopyExpr = Result.get();
15739 }
15740 }
15741 }
15742
15743 BlockDecl::Capture NewCap(Var, Cap.isBlockCapture(), Cap.isNested(),
15744 CopyExpr);
15745 Captures.push_back(NewCap);
15746 }
15747 BD->setCaptures(Context, Captures, BSI->CXXThisCaptureIndex != 0);
15748
15749 // Pop the block scope now but keep it alive to the end of this function.
15750 AnalysisBasedWarnings::Policy WP = AnalysisWarnings.getDefaultPolicy();
15751 PoppedFunctionScopePtr ScopeRAII = PopFunctionScopeInfo(&WP, BD, BlockTy);
15752
15753 BlockExpr *Result = new (Context) BlockExpr(BD, BlockTy);
15754
15755 // If the block isn't obviously global, i.e. it captures anything at
15756 // all, then we need to do a few things in the surrounding context:
15757 if (Result->getBlockDecl()->hasCaptures()) {
15758 // First, this expression has a new cleanup object.
15759 ExprCleanupObjects.push_back(Result->getBlockDecl());
15760 Cleanup.setExprNeedsCleanups(true);
15761
15762 // It also gets a branch-protected scope if any of the captured
15763 // variables needs destruction.
15764 for (const auto &CI : Result->getBlockDecl()->captures()) {
15765 const VarDecl *var = CI.getVariable();
15766 if (var->getType().isDestructedType() != QualType::DK_none) {
15767 setFunctionHasBranchProtectedScope();
15768 break;
15769 }
15770 }
15771 }
15772
15773 if (getCurFunction())
15774 getCurFunction()->addBlock(BD);
15775
15776 return Result;
15777}
15778
15779ExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty,
15780 SourceLocation RPLoc) {
15781 TypeSourceInfo *TInfo;
15782 GetTypeFromParser(Ty, &TInfo);
15783 return BuildVAArgExpr(BuiltinLoc, E, TInfo, RPLoc);
15784}
15785
15786ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc,
15787 Expr *E, TypeSourceInfo *TInfo,
15788 SourceLocation RPLoc) {
15789 Expr *OrigExpr = E;
15790 bool IsMS = false;
15791
15792 // CUDA device code does not support varargs.
15793 if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) {
15794 if (const FunctionDecl *F = dyn_cast<FunctionDecl>(CurContext)) {
15795 CUDAFunctionTarget T = IdentifyCUDATarget(F);
15796 if (T == CFT_Global || T == CFT_Device || T == CFT_HostDevice)
15797 return ExprError(Diag(E->getBeginLoc(), diag::err_va_arg_in_device));
15798 }
15799 }
15800
15801 // NVPTX does not support va_arg expression.
15802 if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice &&
15803 Context.getTargetInfo().getTriple().isNVPTX())
15804 targetDiag(E->getBeginLoc(), diag::err_va_arg_in_device);
15805
15806 // It might be a __builtin_ms_va_list. (But don't ever mark a va_arg()
15807 // as Microsoft ABI on an actual Microsoft platform, where
15808 // __builtin_ms_va_list and __builtin_va_list are the same.)
15809 if (!E->isTypeDependent() && Context.getTargetInfo().hasBuiltinMSVaList() &&
15810 Context.getTargetInfo().getBuiltinVaListKind() != TargetInfo::CharPtrBuiltinVaList) {
15811 QualType MSVaListType = Context.getBuiltinMSVaListType();
15812 if (Context.hasSameType(MSVaListType, E->getType())) {
15813 if (CheckForModifiableLvalue(E, BuiltinLoc, *this))
15814 return ExprError();
15815 IsMS = true;
15816 }
15817 }
15818
15819 // Get the va_list type
15820 QualType VaListType = Context.getBuiltinVaListType();
15821 if (!IsMS) {
15822 if (VaListType->isArrayType()) {
15823 // Deal with implicit array decay; for example, on x86-64,
15824 // va_list is an array, but it's supposed to decay to
15825 // a pointer for va_arg.
15826 VaListType = Context.getArrayDecayedType(VaListType);
15827 // Make sure the input expression also decays appropriately.
15828 ExprResult Result = UsualUnaryConversions(E);
15829 if (Result.isInvalid())
15830 return ExprError();
15831 E = Result.get();
15832 } else if (VaListType->isRecordType() && getLangOpts().CPlusPlus) {
15833 // If va_list is a record type and we are compiling in C++ mode,
15834 // check the argument using reference binding.
15835 InitializedEntity Entity = InitializedEntity::InitializeParameter(
15836 Context, Context.getLValueReferenceType(VaListType), false);
15837 ExprResult Init = PerformCopyInitialization(Entity, SourceLocation(), E);
15838 if (Init.isInvalid())
15839 return ExprError();
15840 E = Init.getAs<Expr>();
15841 } else {
15842 // Otherwise, the va_list argument must be an l-value because
15843 // it is modified by va_arg.
15844 if (!E->isTypeDependent() &&
15845 CheckForModifiableLvalue(E, BuiltinLoc, *this))
15846 return ExprError();
15847 }
15848 }
15849
15850 if (!IsMS && !E->isTypeDependent() &&
15851 !Context.hasSameType(VaListType, E->getType()))
15852 return ExprError(
15853 Diag(E->getBeginLoc(),
15854 diag::err_first_argument_to_va_arg_not_of_type_va_list)
15855 << OrigExpr->getType() << E->getSourceRange());
15856
15857 if (!TInfo->getType()->isDependentType()) {
15858 if (RequireCompleteType(TInfo->getTypeLoc().getBeginLoc(), TInfo->getType(),
15859 diag::err_second_parameter_to_va_arg_incomplete,
15860 TInfo->getTypeLoc()))
15861 return ExprError();
15862
15863 if (RequireNonAbstractType(TInfo->getTypeLoc().getBeginLoc(),
15864 TInfo->getType(),
15865 diag::err_second_parameter_to_va_arg_abstract,
15866 TInfo->getTypeLoc()))
15867 return ExprError();
15868
15869 if (!TInfo->getType().isPODType(Context)) {
15870 Diag(TInfo->getTypeLoc().getBeginLoc(),
15871 TInfo->getType()->isObjCLifetimeType()
15872 ? diag::warn_second_parameter_to_va_arg_ownership_qualified
15873 : diag::warn_second_parameter_to_va_arg_not_pod)
15874 << TInfo->getType()
15875 << TInfo->getTypeLoc().getSourceRange();
15876 }
15877
15878 // Check for va_arg where arguments of the given type will be promoted
15879 // (i.e. this va_arg is guaranteed to have undefined behavior).
15880 QualType PromoteType;
15881 if (TInfo->getType()->isPromotableIntegerType()) {
15882 PromoteType = Context.getPromotedIntegerType(TInfo->getType());
15883 // [cstdarg.syn]p1 defers the C++ behavior to what the C standard says,
15884 // and C2x 7.16.1.1p2 says, in part:
15885 // If type is not compatible with the type of the actual next argument
15886 // (as promoted according to the default argument promotions), the
15887 // behavior is undefined, except for the following cases:
15888 // - both types are pointers to qualified or unqualified versions of
15889 // compatible types;
15890 // - one type is a signed integer type, the other type is the
15891 // corresponding unsigned integer type, and the value is
15892 // representable in both types;
15893 // - one type is pointer to qualified or unqualified void and the
15894 // other is a pointer to a qualified or unqualified character type.
15895 // Given that type compatibility is the primary requirement (ignoring
15896 // qualifications), you would think we could call typesAreCompatible()
15897 // directly to test this. However, in C++, that checks for *same type*,
15898 // which causes false positives when passing an enumeration type to
15899 // va_arg. Instead, get the underlying type of the enumeration and pass
15900 // that.
15901 QualType UnderlyingType = TInfo->getType();
15902 if (const auto *ET = UnderlyingType->getAs<EnumType>())
15903 UnderlyingType = ET->getDecl()->getIntegerType();
15904 if (Context.typesAreCompatible(PromoteType, UnderlyingType,
15905 /*CompareUnqualified*/ true))
15906 PromoteType = QualType();
15907
15908 // If the types are still not compatible, we need to test whether the
15909 // promoted type and the underlying type are the same except for
15910 // signedness. Ask the AST for the correctly corresponding type and see
15911 // if that's compatible.
15912 if (!PromoteType.isNull() &&
15913 PromoteType->isUnsignedIntegerType() !=
15914 UnderlyingType->isUnsignedIntegerType()) {
15915 UnderlyingType =
15916 UnderlyingType->isUnsignedIntegerType()
15917 ? Context.getCorrespondingSignedType(UnderlyingType)
15918 : Context.getCorrespondingUnsignedType(UnderlyingType);
15919 if (Context.typesAreCompatible(PromoteType, UnderlyingType,
15920 /*CompareUnqualified*/ true))
15921 PromoteType = QualType();
15922 }
15923 }
15924 if (TInfo->getType()->isSpecificBuiltinType(BuiltinType::Float))
15925 PromoteType = Context.DoubleTy;
15926 if (!PromoteType.isNull())
15927 DiagRuntimeBehavior(TInfo->getTypeLoc().getBeginLoc(), E,
15928 PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
15929 << TInfo->getType()
15930 << PromoteType
15931 << TInfo->getTypeLoc().getSourceRange());
15932 }
15933
15934 QualType T = TInfo->getType().getNonLValueExprType(Context);
15935 return new (Context) VAArgExpr(BuiltinLoc, E, TInfo, RPLoc, T, IsMS);
15936}
15937
15938ExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) {
15939 // The type of __null will be int or long, depending on the size of
15940 // pointers on the target.
15941 QualType Ty;
15942 unsigned pw = Context.getTargetInfo().getPointerWidth(0);
15943 if (pw == Context.getTargetInfo().getIntWidth())
15944 Ty = Context.IntTy;
15945 else if (pw == Context.getTargetInfo().getLongWidth())
15946 Ty = Context.LongTy;
15947 else if (pw == Context.getTargetInfo().getLongLongWidth())
15948 Ty = Context.LongLongTy;
15949 else {
15950 llvm_unreachable("I don't know size of pointer!")__builtin_unreachable();
15951 }
15952
15953 return new (Context) GNUNullExpr(Ty, TokenLoc);
15954}
15955
15956ExprResult Sema::ActOnSourceLocExpr(SourceLocExpr::IdentKind Kind,
15957 SourceLocation BuiltinLoc,
15958 SourceLocation RPLoc) {
15959 return BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, CurContext);
15960}
15961
15962ExprResult Sema::BuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
15963 SourceLocation BuiltinLoc,
15964 SourceLocation RPLoc,
15965 DeclContext *ParentContext) {
15966 return new (Context)
15967 SourceLocExpr(Context, Kind, BuiltinLoc, RPLoc, ParentContext);
15968}
15969
15970bool Sema::CheckConversionToObjCLiteral(QualType DstType, Expr *&Exp,
15971 bool Diagnose) {
15972 if (!getLangOpts().ObjC)
15973 return false;
15974
15975 const ObjCObjectPointerType *PT = DstType->getAs<ObjCObjectPointerType>();
15976 if (!PT)
15977 return false;
15978 const ObjCInterfaceDecl *ID = PT->getInterfaceDecl();
15979
15980 // Ignore any parens, implicit casts (should only be
15981 // array-to-pointer decays), and not-so-opaque values. The last is
15982 // important for making this trigger for property assignments.
15983 Expr *SrcExpr = Exp->IgnoreParenImpCasts();
15984 if (OpaqueValueExpr *OV = dyn_cast<OpaqueValueExpr>(SrcExpr))
15985 if (OV->getSourceExpr())
15986 SrcExpr = OV->getSourceExpr()->IgnoreParenImpCasts();
15987
15988 if (auto *SL = dyn_cast<StringLiteral>(SrcExpr)) {
15989 if (!PT->isObjCIdType() &&
15990 !(ID && ID->getIdentifier()->isStr("NSString")))
15991 return false;
15992 if (!SL->isAscii())
15993 return false;
15994
15995 if (Diagnose) {
15996 Diag(SL->getBeginLoc(), diag::err_missing_atsign_prefix)
15997 << /*string*/0 << FixItHint::CreateInsertion(SL->getBeginLoc(), "@");
15998 Exp = BuildObjCStringLiteral(SL->getBeginLoc(), SL).get();
15999 }
16000 return true;
16001 }
16002
16003 if ((isa<IntegerLiteral>(SrcExpr) || isa<CharacterLiteral>(SrcExpr) ||
16004 isa<FloatingLiteral>(SrcExpr) || isa<ObjCBoolLiteralExpr>(SrcExpr) ||
16005 isa<CXXBoolLiteralExpr>(SrcExpr)) &&
16006 !SrcExpr->isNullPointerConstant(
16007 getASTContext(), Expr::NPC_NeverValueDependent)) {
16008 if (!ID || !ID->getIdentifier()->isStr("NSNumber"))
16009 return false;
16010 if (Diagnose) {
16011 Diag(SrcExpr->getBeginLoc(), diag::err_missing_atsign_prefix)
16012 << /*number*/1
16013 << FixItHint::CreateInsertion(SrcExpr->getBeginLoc(), "@");
16014 Expr *NumLit =
16015 BuildObjCNumericLiteral(SrcExpr->getBeginLoc(), SrcExpr).get();
16016 if (NumLit)
16017 Exp = NumLit;
16018 }
16019 return true;
16020 }
16021
16022 return false;
16023}
16024
16025static bool maybeDiagnoseAssignmentToFunction(Sema &S, QualType DstType,
16026 const Expr *SrcExpr) {
16027 if (!DstType->isFunctionPointerType() ||
16028 !SrcExpr->getType()->isFunctionType())
16029 return false;
16030
16031 auto *DRE = dyn_cast<DeclRefExpr>(SrcExpr->IgnoreParenImpCasts());
16032 if (!DRE)
16033 return false;
16034
16035 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
16036 if (!FD)
16037 return false;
16038
16039 return !S.checkAddressOfFunctionIsAvailable(FD,
16040 /*Complain=*/true,
16041 SrcExpr->getBeginLoc());
16042}
16043
16044bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
16045 SourceLocation Loc,
16046 QualType DstType, QualType SrcType,
16047 Expr *SrcExpr, AssignmentAction Action,
16048 bool *Complained) {
16049 if (Complained)
16050 *Complained = false;
16051
16052 // Decode the result (notice that AST's are still created for extensions).
16053 bool CheckInferredResultType = false;
16054 bool isInvalid = false;
16055 unsigned DiagKind = 0;
16056 ConversionFixItGenerator ConvHints;
16057 bool MayHaveConvFixit = false;
16058 bool MayHaveFunctionDiff = false;
16059 const ObjCInterfaceDecl *IFace = nullptr;
16060 const ObjCProtocolDecl *PDecl = nullptr;
16061
16062 switch (ConvTy) {
16063 case Compatible:
16064 DiagnoseAssignmentEnum(DstType, SrcType, SrcExpr);
16065 return false;
16066
16067 case PointerToInt:
16068 if (getLangOpts().CPlusPlus) {
16069 DiagKind = diag::err_typecheck_convert_pointer_int;
16070 isInvalid = true;
16071 } else {
16072 DiagKind = diag::ext_typecheck_convert_pointer_int;
16073 }
16074 ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this);
16075 MayHaveConvFixit = true;
16076 break;
16077 case IntToPointer:
16078 if (getLangOpts().CPlusPlus) {
16079 DiagKind = diag::err_typecheck_convert_int_pointer;
16080 isInvalid = true;
16081 } else {
16082 DiagKind = diag::ext_typecheck_convert_int_pointer;
16083 }
16084 ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this);
16085 MayHaveConvFixit = true;
16086 break;
16087 case IncompatibleFunctionPointer:
16088 if (getLangOpts().CPlusPlus) {
16089 DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;
16090 isInvalid = true;
16091 } else {
16092 DiagKind = diag::ext_typecheck_convert_incompatible_function_pointer;
16093 }
16094 ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this);
16095 MayHaveConvFixit = true;
16096 break;
16097 case IncompatiblePointer:
16098 if (Action == AA_Passing_CFAudited) {
16099 DiagKind = diag::err_arc_typecheck_convert_incompatible_pointer;
16100 } else if (getLangOpts().CPlusPlus) {
16101 DiagKind = diag::err_typecheck_convert_incompatible_pointer;
16102 isInvalid = true;
16103 } else {
16104 DiagKind = diag::ext_typecheck_convert_incompatible_pointer;
16105 }
16106 CheckInferredResultType = DstType->isObjCObjectPointerType() &&
16107 SrcType->isObjCObjectPointerType();
16108 if (!CheckInferredResultType) {
16109 ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this);
16110 } else if (CheckInferredResultType) {
16111 SrcType = SrcType.getUnqualifiedType();
16112 DstType = DstType.getUnqualifiedType();
16113 }
16114 MayHaveConvFixit = true;
16115 break;
16116 case IncompatiblePointerSign:
16117 if (getLangOpts().CPlusPlus) {
16118 DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;
16119 isInvalid = true;
16120 } else {
16121 DiagKind = diag::ext_typecheck_convert_incompatible_pointer_sign;
16122 }
16123 break;
16124 case FunctionVoidPointer:
16125 if (getLangOpts().CPlusPlus) {
16126 DiagKind = diag::err_typecheck_convert_pointer_void_func;
16127 isInvalid = true;
16128 } else {
16129 DiagKind = diag::ext_typecheck_convert_pointer_void_func;
16130 }
16131 break;
16132 case IncompatiblePointerDiscardsQualifiers: {
16133 // Perform array-to-pointer decay if necessary.
16134 if (SrcType->isArrayType()) SrcType = Context.getArrayDecayedType(SrcType);
16135
16136 isInvalid = true;
16137
16138 Qualifiers lhq = SrcType->getPointeeType().getQualifiers();
16139 Qualifiers rhq = DstType->getPointeeType().getQualifiers();
16140 if (lhq.getAddressSpace() != rhq.getAddressSpace()) {
16141 DiagKind = diag::err_typecheck_incompatible_address_space;
16142 break;
16143
16144 } else if (lhq.getObjCLifetime() != rhq.getObjCLifetime()) {
16145 DiagKind = diag::err_typecheck_incompatible_ownership;
16146 break;
16147 }
16148
16149 llvm_unreachable("unknown error case for discarding qualifiers!")__builtin_unreachable();
16150 // fallthrough
16151 }
16152 case CompatiblePointerDiscardsQualifiers:
16153 // If the qualifiers lost were because we were applying the
16154 // (deprecated) C++ conversion from a string literal to a char*
16155 // (or wchar_t*), then there was no error (C++ 4.2p2). FIXME:
16156 // Ideally, this check would be performed in
16157 // checkPointerTypesForAssignment. However, that would require a
16158 // bit of refactoring (so that the second argument is an
16159 // expression, rather than a type), which should be done as part
16160 // of a larger effort to fix checkPointerTypesForAssignment for
16161 // C++ semantics.
16162 if (getLangOpts().CPlusPlus &&
16163 IsStringLiteralToNonConstPointerConversion(SrcExpr, DstType))
16164 return false;
16165 if (getLangOpts().CPlusPlus) {
16166 DiagKind = diag::err_typecheck_convert_discards_qualifiers;
16167 isInvalid = true;
16168 } else {
16169 DiagKind = diag::ext_typecheck_convert_discards_qualifiers;
16170 }
16171
16172 break;
16173 case IncompatibleNestedPointerQualifiers:
16174 if (getLangOpts().CPlusPlus) {
16175 isInvalid = true;
16176 DiagKind = diag::err_nested_pointer_qualifier_mismatch;
16177 } else {
16178 DiagKind = diag::ext_nested_pointer_qualifier_mismatch;
16179 }
16180 break;
16181 case IncompatibleNestedPointerAddressSpaceMismatch:
16182 DiagKind = diag::err_typecheck_incompatible_nested_address_space;
16183 isInvalid = true;
16184 break;
16185 case IntToBlockPointer:
16186 DiagKind = diag::err_int_to_block_pointer;
16187 isInvalid = true;
16188 break;
16189 case IncompatibleBlockPointer:
16190 DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;
16191 isInvalid = true;
16192 break;
16193 case IncompatibleObjCQualifiedId: {
16194 if (SrcType->isObjCQualifiedIdType()) {
16195 const ObjCObjectPointerType *srcOPT =
16196 SrcType->castAs<ObjCObjectPointerType>();
16197 for (auto *srcProto : srcOPT->quals()) {
16198 PDecl = srcProto;
16199 break;
16200 }
16201 if (const ObjCInterfaceType *IFaceT =
16202 DstType->castAs<ObjCObjectPointerType>()->getInterfaceType())
16203 IFace = IFaceT->getDecl();
16204 }
16205 else if (DstType->isObjCQualifiedIdType()) {
16206 const ObjCObjectPointerType *dstOPT =
16207 DstType->castAs<ObjCObjectPointerType>();
16208 for (auto *dstProto : dstOPT->quals()) {
16209 PDecl = dstProto;
16210 break;
16211 }
16212 if (const ObjCInterfaceType *IFaceT =
16213 SrcType->castAs<ObjCObjectPointerType>()->getInterfaceType())
16214 IFace = IFaceT->getDecl();
16215 }
16216 if (getLangOpts().CPlusPlus) {
16217 DiagKind = diag::err_incompatible_qualified_id;
16218 isInvalid = true;
16219 } else {
16220 DiagKind = diag::warn_incompatible_qualified_id;
16221 }
16222 break;
16223 }
16224 case IncompatibleVectors:
16225 if (getLangOpts().CPlusPlus) {
16226 DiagKind = diag::err_incompatible_vectors;
16227 isInvalid = true;
16228 } else {
16229 DiagKind = diag::warn_incompatible_vectors;
16230 }
16231 break;
16232 case IncompatibleObjCWeakRef:
16233 DiagKind = diag::err_arc_weak_unavailable_assign;
16234 isInvalid = true;
16235 break;
16236 case Incompatible:
16237 if (maybeDiagnoseAssignmentToFunction(*this, DstType, SrcExpr)) {
16238 if (Complained)
16239 *Complained = true;
16240 return true;
16241 }
16242
16243 DiagKind = diag::err_typecheck_convert_incompatible;
16244 ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this);
16245 MayHaveConvFixit = true;
16246 isInvalid = true;
16247 MayHaveFunctionDiff = true;
16248 break;
16249 }
16250
16251 QualType FirstType, SecondType;
16252 switch (Action) {
16253 case AA_Assigning:
16254 case AA_Initializing:
16255 // The destination type comes first.
16256 FirstType = DstType;
16257 SecondType = SrcType;
16258 break;
16259
16260 case AA_Returning:
16261 case AA_Passing:
16262 case AA_Passing_CFAudited:
16263 case AA_Converting:
16264 case AA_Sending:
16265 case AA_Casting:
16266 // The source type comes first.
16267 FirstType = SrcType;
16268 SecondType = DstType;
16269 break;
16270 }
16271
16272 PartialDiagnostic FDiag = PDiag(DiagKind);
16273 if (Action == AA_Passing_CFAudited)
16274 FDiag << FirstType << SecondType << AA_Passing << SrcExpr->getSourceRange();
16275 else
16276 FDiag << FirstType << SecondType << Action << SrcExpr->getSourceRange();
16277
16278 if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign ||
16279 DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {
16280 auto isPlainChar = [](const clang::Type *Type) {
16281 return Type->isSpecificBuiltinType(BuiltinType::Char_S) ||
16282 Type->isSpecificBuiltinType(BuiltinType::Char_U);
16283 };
16284 FDiag << (isPlainChar(FirstType->getPointeeOrArrayElementType()) ||
16285 isPlainChar(SecondType->getPointeeOrArrayElementType()));
16286 }
16287
16288 // If we can fix the conversion, suggest the FixIts.
16289 if (!ConvHints.isNull()) {
16290 for (FixItHint &H : ConvHints.Hints)
16291 FDiag << H;
16292 }
16293
16294 if (MayHaveConvFixit) { FDiag << (unsigned) (ConvHints.Kind); }
16295
16296 if (MayHaveFunctionDiff)
16297 HandleFunctionTypeMismatch(FDiag, SecondType, FirstType);
16298
16299 Diag(Loc, FDiag);
16300 if ((DiagKind == diag::warn_incompatible_qualified_id ||
16301 DiagKind == diag::err_incompatible_qualified_id) &&
16302 PDecl && IFace && !IFace->hasDefinition())
16303 Diag(IFace->getLocation(), diag::note_incomplete_class_and_qualified_id)
16304 << IFace << PDecl;
16305
16306 if (SecondType == Context.OverloadTy)
16307 NoteAllOverloadCandidates(OverloadExpr::find(SrcExpr).Expression,
16308 FirstType, /*TakingAddress=*/true);
16309
16310 if (CheckInferredResultType)
16311 EmitRelatedResultTypeNote(SrcExpr);
16312
16313 if (Action == AA_Returning && ConvTy == IncompatiblePointer)
16314 EmitRelatedResultTypeNoteForReturn(DstType);
16315
16316 if (Complained)
16317 *Complained = true;
16318 return isInvalid;
16319}
16320
16321ExprResult Sema::VerifyIntegerConstantExpression(Expr *E,
16322 llvm::APSInt *Result,
16323 AllowFoldKind CanFold) {
16324 class SimpleICEDiagnoser : public VerifyICEDiagnoser {
16325 public:
16326 SemaDiagnosticBuilder diagnoseNotICEType(Sema &S, SourceLocation Loc,
16327 QualType T) override {
16328 return S.Diag(Loc, diag::err_ice_not_integral)
16329 << T << S.LangOpts.CPlusPlus;
16330 }
16331 SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc) override {
16332 return S.Diag(Loc, diag::err_expr_not_ice) << S.LangOpts.CPlusPlus;
16333 }
16334 } Diagnoser;
16335
16336 return VerifyIntegerConstantExpression(E, Result, Diagnoser, CanFold);
16337}
16338
16339ExprResult Sema::VerifyIntegerConstantExpression(Expr *E,
16340 llvm::APSInt *Result,
16341 unsigned DiagID,
16342 AllowFoldKind CanFold) {
16343 class IDDiagnoser : public VerifyICEDiagnoser {
16344 unsigned DiagID;
16345
16346 public:
16347 IDDiagnoser(unsigned DiagID)
16348 : VerifyICEDiagnoser(DiagID == 0), DiagID(DiagID) { }
16349
16350 SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc) override {
16351 return S.Diag(Loc, DiagID);
16352 }
16353 } Diagnoser(DiagID);
16354
16355 return VerifyIntegerConstantExpression(E, Result, Diagnoser, CanFold);
16356}
16357
16358Sema::SemaDiagnosticBuilder
16359Sema::VerifyICEDiagnoser::diagnoseNotICEType(Sema &S, SourceLocation Loc,
16360 QualType T) {
16361 return diagnoseNotICE(S, Loc);
16362}
16363
16364Sema::SemaDiagnosticBuilder
16365Sema::VerifyICEDiagnoser::diagnoseFold(Sema &S, SourceLocation Loc) {
16366 return S.Diag(Loc, diag::ext_expr_not_ice) << S.LangOpts.CPlusPlus;
16367}
16368
16369ExprResult
16370Sema::VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result,
16371 VerifyICEDiagnoser &Diagnoser,
16372 AllowFoldKind CanFold) {
16373 SourceLocation DiagLoc = E->getBeginLoc();
16374
16375 if (getLangOpts().CPlusPlus11) {
16376 // C++11 [expr.const]p5:
16377 // If an expression of literal class type is used in a context where an
16378 // integral constant expression is required, then that class type shall
16379 // have a single non-explicit conversion function to an integral or
16380 // unscoped enumeration type
16381 ExprResult Converted;
16382 class CXX11ConvertDiagnoser : public ICEConvertDiagnoser {
16383 VerifyICEDiagnoser &BaseDiagnoser;
16384 public:
16385 CXX11ConvertDiagnoser(VerifyICEDiagnoser &BaseDiagnoser)
16386 : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false,
16387 BaseDiagnoser.Suppress, true),
16388 BaseDiagnoser(BaseDiagnoser) {}
16389
16390 SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
16391 QualType T) override {
16392 return BaseDiagnoser.diagnoseNotICEType(S, Loc, T);
16393 }
16394
16395 SemaDiagnosticBuilder diagnoseIncomplete(
16396 Sema &S, SourceLocation Loc, QualType T) override {
16397 return S.Diag(Loc, diag::err_ice_incomplete_type) << T;
16398 }
16399
16400 SemaDiagnosticBuilder diagnoseExplicitConv(
16401 Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override {
16402 return S.Diag(Loc, diag::err_ice_explicit_conversion) << T << ConvTy;
16403 }
16404
16405 SemaDiagnosticBuilder noteExplicitConv(
16406 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
16407 return S.Diag(Conv->getLocation(), diag::note_ice_conversion_here)
16408 << ConvTy->isEnumeralType() << ConvTy;
16409 }
16410
16411 SemaDiagnosticBuilder diagnoseAmbiguous(
16412 Sema &S, SourceLocation Loc, QualType T) override {
16413 return S.Diag(Loc, diag::err_ice_ambiguous_conversion) << T;
16414 }
16415
16416 SemaDiagnosticBuilder noteAmbiguous(
16417 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
16418 return S.Diag(Conv->getLocation(), diag::note_ice_conversion_here)
16419 << ConvTy->isEnumeralType() << ConvTy;
16420 }
16421
16422 SemaDiagnosticBuilder diagnoseConversion(
16423 Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override {
16424 llvm_unreachable("conversion functions are permitted")__builtin_unreachable();
16425 }
16426 } ConvertDiagnoser(Diagnoser);
16427
16428 Converted = PerformContextualImplicitConversion(DiagLoc, E,
16429 ConvertDiagnoser);
16430 if (Converted.isInvalid())
16431 return Converted;
16432 E = Converted.get();
16433 if (!E->getType()->isIntegralOrUnscopedEnumerationType())
16434 return ExprError();
16435 } else if (!E->getType()->isIntegralOrUnscopedEnumerationType()) {
16436 // An ICE must be of integral or unscoped enumeration type.
16437 if (!Diagnoser.Suppress)
16438 Diagnoser.diagnoseNotICEType(*this, DiagLoc, E->getType())
16439 << E->getSourceRange();
16440 return ExprError();
16441 }
16442
16443 ExprResult RValueExpr = DefaultLvalueConversion(E);
16444 if (RValueExpr.isInvalid())
16445 return ExprError();
16446
16447 E = RValueExpr.get();
16448
16449 // Circumvent ICE checking in C++11 to avoid evaluating the expression twice
16450 // in the non-ICE case.
16451 if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) {
16452 if (Result)
16453 *Result = E->EvaluateKnownConstIntCheckOverflow(Context);
16454 if (!isa<ConstantExpr>(E))
16455 E = Result ? ConstantExpr::Create(Context, E, APValue(*Result))
16456 : ConstantExpr::Create(Context, E);
16457 return E;
16458 }
16459
16460 Expr::EvalResult EvalResult;
16461 SmallVector<PartialDiagnosticAt, 8> Notes;
16462 EvalResult.Diag = &Notes;
16463
16464 // Try to evaluate the expression, and produce diagnostics explaining why it's
16465 // not a constant expression as a side-effect.
16466 bool Folded =
16467 E->EvaluateAsRValue(EvalResult, Context, /*isConstantContext*/ true) &&
16468 EvalResult.Val.isInt() && !EvalResult.HasSideEffects;
16469
16470 if (!isa<ConstantExpr>(E))
16471 E = ConstantExpr::Create(Context, E, EvalResult.Val);
16472
16473 // In C++11, we can rely on diagnostics being produced for any expression
16474 // which is not a constant expression. If no diagnostics were produced, then
16475 // this is a constant expression.
16476 if (Folded && getLangOpts().CPlusPlus11 && Notes.empty()) {
16477 if (Result)
16478 *Result = EvalResult.Val.getInt();
16479 return E;
16480 }
16481
16482 // If our only note is the usual "invalid subexpression" note, just point
16483 // the caret at its location rather than producing an essentially
16484 // redundant note.
16485 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
16486 diag::note_invalid_subexpr_in_const_expr) {
16487 DiagLoc = Notes[0].first;
16488 Notes.clear();
16489 }
16490
16491 if (!Folded || !CanFold) {
16492 if (!Diagnoser.Suppress) {
16493 Diagnoser.diagnoseNotICE(*this, DiagLoc) << E->getSourceRange();
16494 for (const PartialDiagnosticAt &Note : Notes)
16495 Diag(Note.first, Note.second);
16496 }
16497
16498 return ExprError();
16499 }
16500
16501 Diagnoser.diagnoseFold(*this, DiagLoc) << E->getSourceRange();
16502 for (const PartialDiagnosticAt &Note : Notes)
16503 Diag(Note.first, Note.second);
16504
16505 if (Result)
16506 *Result = EvalResult.Val.getInt();
16507 return E;
16508}
16509
16510namespace {
16511 // Handle the case where we conclude a expression which we speculatively
16512 // considered to be unevaluated is actually evaluated.
16513 class TransformToPE : public TreeTransform<TransformToPE> {
16514 typedef TreeTransform<TransformToPE> BaseTransform;
16515
16516 public:
16517 TransformToPE(Sema &SemaRef) : BaseTransform(SemaRef) { }
16518
16519 // Make sure we redo semantic analysis
16520 bool AlwaysRebuild() { return true; }
16521 bool ReplacingOriginal() { return true; }
16522
16523 // We need to special-case DeclRefExprs referring to FieldDecls which
16524 // are not part of a member pointer formation; normal TreeTransforming
16525 // doesn't catch this case because of the way we represent them in the AST.
16526 // FIXME: This is a bit ugly; is it really the best way to handle this
16527 // case?
16528 //
16529 // Error on DeclRefExprs referring to FieldDecls.
16530 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
16531 if (isa<FieldDecl>(E->getDecl()) &&
16532 !SemaRef.isUnevaluatedContext())
16533 return SemaRef.Diag(E->getLocation(),
16534 diag::err_invalid_non_static_member_use)
16535 << E->getDecl() << E->getSourceRange();
16536
16537 return BaseTransform::TransformDeclRefExpr(E);
16538 }
16539
16540 // Exception: filter out member pointer formation
16541 ExprResult TransformUnaryOperator(UnaryOperator *E) {
16542 if (E->getOpcode() == UO_AddrOf && E->getType()->isMemberPointerType())
16543 return E;
16544
16545 return BaseTransform::TransformUnaryOperator(E);
16546 }
16547
16548 // The body of a lambda-expression is in a separate expression evaluation
16549 // context so never needs to be transformed.
16550 // FIXME: Ideally we wouldn't transform the closure type either, and would
16551 // just recreate the capture expressions and lambda expression.
16552 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body) {
16553 return SkipLambdaBody(E, Body);
16554 }
16555 };
16556}
16557
16558ExprResult Sema::TransformToPotentiallyEvaluated(Expr *E) {
16559 assert(isUnevaluatedContext() &&(static_cast<void> (0))
16560 "Should only transform unevaluated expressions")(static_cast<void> (0));
16561 ExprEvalContexts.back().Context =
16562 ExprEvalContexts[ExprEvalContexts.size()-2].Context;
16563 if (isUnevaluatedContext())
16564 return E;
16565 return TransformToPE(*this).TransformExpr(E);
16566}
16567
16568void
16569Sema::PushExpressionEvaluationContext(
16570 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl,
16571 ExpressionEvaluationContextRecord::ExpressionKind ExprContext) {
16572 ExprEvalContexts.emplace_back(NewContext, ExprCleanupObjects.size(), Cleanup,
16573 LambdaContextDecl, ExprContext);
16574 Cleanup.reset();
16575 if (!MaybeODRUseExprs.empty())
16576 std::swap(MaybeODRUseExprs, ExprEvalContexts.back().SavedMaybeODRUseExprs);
16577}
16578
16579void
16580Sema::PushExpressionEvaluationContext(
16581 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
16582 ExpressionEvaluationContextRecord::ExpressionKind ExprContext) {
16583 Decl *ClosureContextDecl = ExprEvalContexts.back().ManglingContextDecl;
16584 PushExpressionEvaluationContext(NewContext, ClosureContextDecl, ExprContext);
16585}
16586
16587namespace {
16588
16589const DeclRefExpr *CheckPossibleDeref(Sema &S, const Expr *PossibleDeref) {
16590 PossibleDeref = PossibleDeref->IgnoreParenImpCasts();
16591 if (const auto *E = dyn_cast<UnaryOperator>(PossibleDeref)) {
16592 if (E->getOpcode() == UO_Deref)
16593 return CheckPossibleDeref(S, E->getSubExpr());
16594 } else if (const auto *E = dyn_cast<ArraySubscriptExpr>(PossibleDeref)) {
16595 return CheckPossibleDeref(S, E->getBase());
16596 } else if (const auto *E = dyn_cast<MemberExpr>(PossibleDeref)) {
16597 return CheckPossibleDeref(S, E->getBase());
16598 } else if (const auto E = dyn_cast<DeclRefExpr>(PossibleDeref)) {
16599 QualType Inner;
16600 QualType Ty = E->getType();
16601 if (const auto *Ptr = Ty->getAs<PointerType>())
16602 Inner = Ptr->getPointeeType();
16603 else if (const auto *Arr = S.Context.getAsArrayType(Ty))
16604 Inner = Arr->getElementType();
16605 else
16606 return nullptr;
16607
16608 if (Inner->hasAttr(attr::NoDeref))
16609 return E;
16610 }
16611 return nullptr;
16612}
16613
16614} // namespace
16615
16616void Sema::WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec) {
16617 for (const Expr *E : Rec.PossibleDerefs) {
16618 const DeclRefExpr *DeclRef = CheckPossibleDeref(*this, E);
16619 if (DeclRef) {
16620 const ValueDecl *Decl = DeclRef->getDecl();
16621 Diag(E->getExprLoc(), diag::warn_dereference_of_noderef_type)
16622 << Decl->getName() << E->getSourceRange();
16623 Diag(Decl->getLocation(), diag::note_previous_decl) << Decl->getName();
16624 } else {
16625 Diag(E->getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl)
16626 << E->getSourceRange();
16627 }
16628 }
16629 Rec.PossibleDerefs.clear();
16630}
16631
16632/// Check whether E, which is either a discarded-value expression or an
16633/// unevaluated operand, is a simple-assignment to a volatlie-qualified lvalue,
16634/// and if so, remove it from the list of volatile-qualified assignments that
16635/// we are going to warn are deprecated.
16636void Sema::CheckUnusedVolatileAssignment(Expr *E) {
16637 if (!E->getType().isVolatileQualified() || !getLangOpts().CPlusPlus20)
16638 return;
16639
16640 // Note: ignoring parens here is not justified by the standard rules, but
16641 // ignoring parentheses seems like a more reasonable approach, and this only
16642 // drives a deprecation warning so doesn't affect conformance.
16643 if (auto *BO = dyn_cast<BinaryOperator>(E->IgnoreParenImpCasts())) {
16644 if (BO->getOpcode() == BO_Assign) {
16645 auto &LHSs = ExprEvalContexts.back().VolatileAssignmentLHSs;
16646 LHSs.erase(std::remove(LHSs.begin(), LHSs.end(), BO->getLHS()),
16647 LHSs.end());
16648 }
16649 }
16650}
16651
16652ExprResult Sema::CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl) {
16653 if (isUnevaluatedContext() || !E.isUsable() || !Decl ||
16654 !Decl->isConsteval() || isConstantEvaluated() ||
16655 RebuildingImmediateInvocation)
16656 return E;
16657
16658 /// Opportunistically remove the callee from ReferencesToConsteval if we can.
16659 /// It's OK if this fails; we'll also remove this in
16660 /// HandleImmediateInvocations, but catching it here allows us to avoid
16661 /// walking the AST looking for it in simple cases.
16662 if (auto *Call = dyn_cast<CallExpr>(E.get()->IgnoreImplicit()))
16663 if (auto *DeclRef =
16664 dyn_cast<DeclRefExpr>(Call->getCallee()->IgnoreImplicit()))
16665 ExprEvalContexts.back().ReferenceToConsteval.erase(DeclRef);
16666
16667 E = MaybeCreateExprWithCleanups(E);
16668
16669 ConstantExpr *Res = ConstantExpr::Create(
16670 getASTContext(), E.get(),
16671 ConstantExpr::getStorageKind(Decl->getReturnType().getTypePtr(),
16672 getASTContext()),
16673 /*IsImmediateInvocation*/ true);
16674 ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0);
16675 return Res;
16676}
16677
16678static void EvaluateAndDiagnoseImmediateInvocation(
16679 Sema &SemaRef, Sema::ImmediateInvocationCandidate Candidate) {
16680 llvm::SmallVector<PartialDiagnosticAt, 8> Notes;
16681 Expr::EvalResult Eval;
16682 Eval.Diag = &Notes;
16683 ConstantExpr *CE = Candidate.getPointer();
16684 bool Result = CE->EvaluateAsConstantExpr(
16685 Eval, SemaRef.getASTContext(), ConstantExprKind::ImmediateInvocation);
16686 if (!Result || !Notes.empty()) {
16687 Expr *InnerExpr = CE->getSubExpr()->IgnoreImplicit();
16688 if (auto *FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
16689 InnerExpr = FunctionalCast->getSubExpr();
16690 FunctionDecl *FD = nullptr;
16691 if (auto *Call = dyn_cast<CallExpr>(InnerExpr))
16692 FD = cast<FunctionDecl>(Call->getCalleeDecl());
16693 else if (auto *Call = dyn_cast<CXXConstructExpr>(InnerExpr))
16694 FD = Call->getConstructor();
16695 else
16696 llvm_unreachable("unhandled decl kind")__builtin_unreachable();
16697 assert(FD->isConsteval())(static_cast<void> (0));
16698 SemaRef.Diag(CE->getBeginLoc(), diag::err_invalid_consteval_call) << FD;
16699 for (auto &Note : Notes)
16700 SemaRef.Diag(Note.first, Note.second);
16701 return;
16702 }
16703 CE->MoveIntoResult(Eval.Val, SemaRef.getASTContext());
16704}
16705
16706static void RemoveNestedImmediateInvocation(
16707 Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec,
16708 SmallVector<Sema::ImmediateInvocationCandidate, 4>::reverse_iterator It) {
16709 struct ComplexRemove : TreeTransform<ComplexRemove> {
16710 using Base = TreeTransform<ComplexRemove>;
16711 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
16712 SmallVector<Sema::ImmediateInvocationCandidate, 4> &IISet;
16713 SmallVector<Sema::ImmediateInvocationCandidate, 4>::reverse_iterator
16714 CurrentII;
16715 ComplexRemove(Sema &SemaRef, llvm::SmallPtrSetImpl<DeclRefExpr *> &DR,
16716 SmallVector<Sema::ImmediateInvocationCandidate, 4> &II,
16717 SmallVector<Sema::ImmediateInvocationCandidate,
16718 4>::reverse_iterator Current)
16719 : Base(SemaRef), DRSet(DR), IISet(II), CurrentII(Current) {}
16720 void RemoveImmediateInvocation(ConstantExpr* E) {
16721 auto It = std::find_if(CurrentII, IISet.rend(),
16722 [E](Sema::ImmediateInvocationCandidate Elem) {
16723 return Elem.getPointer() == E;
16724 });
16725 assert(It != IISet.rend() &&(static_cast<void> (0))
16726 "ConstantExpr marked IsImmediateInvocation should "(static_cast<void> (0))
16727 "be present")(static_cast<void> (0));
16728 It->setInt(1); // Mark as deleted
16729 }
16730 ExprResult TransformConstantExpr(ConstantExpr *E) {
16731 if (!E->isImmediateInvocation())
16732 return Base::TransformConstantExpr(E);
16733 RemoveImmediateInvocation(E);
16734 return Base::TransformExpr(E->getSubExpr());
16735 }
16736 /// Base::TransfromCXXOperatorCallExpr doesn't traverse the callee so
16737 /// we need to remove its DeclRefExpr from the DRSet.
16738 ExprResult TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
16739 DRSet.erase(cast<DeclRefExpr>(E->getCallee()->IgnoreImplicit()));
16740 return Base::TransformCXXOperatorCallExpr(E);
16741 }
16742 /// Base::TransformInitializer skip ConstantExpr so we need to visit them
16743 /// here.
16744 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit) {
16745 if (!Init)
16746 return Init;
16747 /// ConstantExpr are the first layer of implicit node to be removed so if
16748 /// Init isn't a ConstantExpr, no ConstantExpr will be skipped.
16749 if (auto *CE = dyn_cast<ConstantExpr>(Init))
16750 if (CE->isImmediateInvocation())
16751 RemoveImmediateInvocation(CE);
16752 return Base::TransformInitializer(Init, NotCopyInit);
16753 }
16754 ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
16755 DRSet.erase(E);
16756 return E;
16757 }
16758 bool AlwaysRebuild() { return false; }
16759 bool ReplacingOriginal() { return true; }
16760 bool AllowSkippingCXXConstructExpr() {
16761 bool Res = AllowSkippingFirstCXXConstructExpr;
16762 AllowSkippingFirstCXXConstructExpr = true;
16763 return Res;
16764 }
16765 bool AllowSkippingFirstCXXConstructExpr = true;
16766 } Transformer(SemaRef, Rec.ReferenceToConsteval,
16767 Rec.ImmediateInvocationCandidates, It);
16768
16769 /// CXXConstructExpr with a single argument are getting skipped by
16770 /// TreeTransform in some situtation because they could be implicit. This
16771 /// can only occur for the top-level CXXConstructExpr because it is used
16772 /// nowhere in the expression being transformed therefore will not be rebuilt.
16773 /// Setting AllowSkippingFirstCXXConstructExpr to false will prevent from
16774 /// skipping the first CXXConstructExpr.
16775 if (isa<CXXConstructExpr>(It->getPointer()->IgnoreImplicit()))
16776 Transformer.AllowSkippingFirstCXXConstructExpr = false;
16777
16778 ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr());
16779 assert(Res.isUsable())(static_cast<void> (0));
16780 Res = SemaRef.MaybeCreateExprWithCleanups(Res);
16781 It->getPointer()->setSubExpr(Res.get());
16782}
16783
16784static void
16785HandleImmediateInvocations(Sema &SemaRef,
16786 Sema::ExpressionEvaluationContextRecord &Rec) {
16787 if ((Rec.ImmediateInvocationCandidates.size() == 0 &&
16788 Rec.ReferenceToConsteval.size() == 0) ||
16789 SemaRef.RebuildingImmediateInvocation)
16790 return;
16791
16792 /// When we have more then 1 ImmediateInvocationCandidates we need to check
16793 /// for nested ImmediateInvocationCandidates. when we have only 1 we only
16794 /// need to remove ReferenceToConsteval in the immediate invocation.
16795 if (Rec.ImmediateInvocationCandidates.size() > 1) {
16796
16797 /// Prevent sema calls during the tree transform from adding pointers that
16798 /// are already in the sets.
16799 llvm::SaveAndRestore<bool> DisableIITracking(
16800 SemaRef.RebuildingImmediateInvocation, true);
16801
16802 /// Prevent diagnostic during tree transfrom as they are duplicates
16803 Sema::TentativeAnalysisScope DisableDiag(SemaRef);
16804
16805 for (auto It = Rec.ImmediateInvocationCandidates.rbegin();
16806 It != Rec.ImmediateInvocationCandidates.rend(); It++)
16807 if (!It->getInt())
16808 RemoveNestedImmediateInvocation(SemaRef, Rec, It);
16809 } else if (Rec.ImmediateInvocationCandidates.size() == 1 &&
16810 Rec.ReferenceToConsteval.size()) {
16811 struct SimpleRemove : RecursiveASTVisitor<SimpleRemove> {
16812 llvm::SmallPtrSetImpl<DeclRefExpr *> &DRSet;
16813 SimpleRemove(llvm::SmallPtrSetImpl<DeclRefExpr *> &S) : DRSet(S) {}
16814 bool VisitDeclRefExpr(DeclRefExpr *E) {
16815 DRSet.erase(E);
16816 return DRSet.size();
16817 }
16818 } Visitor(Rec.ReferenceToConsteval);
16819 Visitor.TraverseStmt(
16820 Rec.ImmediateInvocationCandidates.front().getPointer()->getSubExpr());
16821 }
16822 for (auto CE : Rec.ImmediateInvocationCandidates)
16823 if (!CE.getInt())
16824 EvaluateAndDiagnoseImmediateInvocation(SemaRef, CE);
16825 for (auto DR : Rec.ReferenceToConsteval) {
16826 auto *FD = cast<FunctionDecl>(DR->getDecl());
16827 SemaRef.Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
16828 << FD;
16829 SemaRef.Diag(FD->getLocation(), diag::note_declared_at);
16830 }
16831}
16832
16833void Sema::PopExpressionEvaluationContext() {
16834 ExpressionEvaluationContextRecord& Rec = ExprEvalContexts.back();
16835 unsigned NumTypos = Rec.NumTypos;
16836
16837 if (!Rec.Lambdas.empty()) {
16838 using ExpressionKind = ExpressionEvaluationContextRecord::ExpressionKind;
16839 if (!getLangOpts().CPlusPlus20 &&
16840 (Rec.ExprContext == ExpressionKind::EK_TemplateArgument ||
16841 Rec.isUnevaluated() ||
16842 (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17))) {
16843 unsigned D;
16844 if (Rec.isUnevaluated()) {
16845 // C++11 [expr.prim.lambda]p2:
16846 // A lambda-expression shall not appear in an unevaluated operand
16847 // (Clause 5).
16848 D = diag::err_lambda_unevaluated_operand;
16849 } else if (Rec.isConstantEvaluated() && !getLangOpts().CPlusPlus17) {
16850 // C++1y [expr.const]p2:
16851 // A conditional-expression e is a core constant expression unless the
16852 // evaluation of e, following the rules of the abstract machine, would
16853 // evaluate [...] a lambda-expression.
16854 D = diag::err_lambda_in_constant_expression;
16855 } else if (Rec.ExprContext == ExpressionKind::EK_TemplateArgument) {
16856 // C++17 [expr.prim.lamda]p2:
16857 // A lambda-expression shall not appear [...] in a template-argument.
16858 D = diag::err_lambda_in_invalid_context;
16859 } else
16860 llvm_unreachable("Couldn't infer lambda error message.")__builtin_unreachable();
16861
16862 for (const auto *L : Rec.Lambdas)
16863 Diag(L->getBeginLoc(), D);
16864 }
16865 }
16866
16867 WarnOnPendingNoDerefs(Rec);
16868 HandleImmediateInvocations(*this, Rec);
16869
16870 // Warn on any volatile-qualified simple-assignments that are not discarded-
16871 // value expressions nor unevaluated operands (those cases get removed from
16872 // this list by CheckUnusedVolatileAssignment).
16873 for (auto *BO : Rec.VolatileAssignmentLHSs)
16874 Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile)
16875 << BO->getType();
16876
16877 // When are coming out of an unevaluated context, clear out any
16878 // temporaries that we may have created as part of the evaluation of
16879 // the expression in that context: they aren't relevant because they
16880 // will never be constructed.
16881 if (Rec.isUnevaluated() || Rec.isConstantEvaluated()) {
16882 ExprCleanupObjects.erase(ExprCleanupObjects.begin() + Rec.NumCleanupObjects,
16883 ExprCleanupObjects.end());
16884 Cleanup = Rec.ParentCleanup;
16885 CleanupVarDeclMarking();
16886 std::swap(MaybeODRUseExprs, Rec.SavedMaybeODRUseExprs);
16887 // Otherwise, merge the contexts together.
16888 } else {
16889 Cleanup.mergeFrom(Rec.ParentCleanup);
16890 MaybeODRUseExprs.insert(Rec.SavedMaybeODRUseExprs.begin(),
16891 Rec.SavedMaybeODRUseExprs.end());
16892 }
16893
16894 // Pop the current expression evaluation context off the stack.
16895 ExprEvalContexts.pop_back();
16896
16897 // The global expression evaluation context record is never popped.
16898 ExprEvalContexts.back().NumTypos += NumTypos;
16899}
16900
16901void Sema::DiscardCleanupsInEvaluationContext() {
16902 ExprCleanupObjects.erase(
16903 ExprCleanupObjects.begin() + ExprEvalContexts.back().NumCleanupObjects,
16904 ExprCleanupObjects.end());
16905 Cleanup.reset();
16906 MaybeODRUseExprs.clear();
16907}
16908
16909ExprResult Sema::HandleExprEvaluationContextForTypeof(Expr *E) {
16910 ExprResult Result = CheckPlaceholderExpr(E);
16911 if (Result.isInvalid())
16912 return ExprError();
16913 E = Result.get();
16914 if (!E->getType()->isVariablyModifiedType())
16915 return E;
16916 return TransformToPotentiallyEvaluated(E);
16917}
16918
16919/// Are we in a context that is potentially constant evaluated per C++20
16920/// [expr.const]p12?
16921static bool isPotentiallyConstantEvaluatedContext(Sema &SemaRef) {
16922 /// C++2a [expr.const]p12:
16923 // An expression or conversion is potentially constant evaluated if it is
16924 switch (SemaRef.ExprEvalContexts.back().Context) {
16925 case Sema::ExpressionEvaluationContext::ConstantEvaluated:
16926 // -- a manifestly constant-evaluated expression,
16927 case Sema::ExpressionEvaluationContext::PotentiallyEvaluated:
16928 case Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed:
16929 case Sema::ExpressionEvaluationContext::DiscardedStatement:
16930 // -- a potentially-evaluated expression,
16931 case Sema::ExpressionEvaluationContext::UnevaluatedList:
16932 // -- an immediate subexpression of a braced-init-list,
16933
16934 // -- [FIXME] an expression of the form & cast-expression that occurs
16935 // within a templated entity
16936 // -- a subexpression of one of the above that is not a subexpression of
16937 // a nested unevaluated operand.
16938 return true;
16939
16940 case Sema::ExpressionEvaluationContext::Unevaluated:
16941 case Sema::ExpressionEvaluationContext::UnevaluatedAbstract:
16942 // Expressions in this context are never evaluated.
16943 return false;
16944 }
16945 llvm_unreachable("Invalid context")__builtin_unreachable();
16946}
16947
16948/// Return true if this function has a calling convention that requires mangling
16949/// in the size of the parameter pack.
16950static bool funcHasParameterSizeMangling(Sema &S, FunctionDecl *FD) {
16951 // These manglings don't do anything on non-Windows or non-x86 platforms, so
16952 // we don't need parameter type sizes.
16953 const llvm::Triple &TT = S.Context.getTargetInfo().getTriple();
16954 if (!TT.isOSWindows() || !TT.isX86())
16955 return false;
16956
16957 // If this is C++ and this isn't an extern "C" function, parameters do not
16958 // need to be complete. In this case, C++ mangling will apply, which doesn't
16959 // use the size of the parameters.
16960 if (S.getLangOpts().CPlusPlus && !FD->isExternC())
16961 return false;
16962
16963 // Stdcall, fastcall, and vectorcall need this special treatment.
16964 CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
16965 switch (CC) {
16966 case CC_X86StdCall:
16967 case CC_X86FastCall:
16968 case CC_X86VectorCall:
16969 return true;
16970 default:
16971 break;
16972 }
16973 return false;
16974}
16975
16976/// Require that all of the parameter types of function be complete. Normally,
16977/// parameter types are only required to be complete when a function is called
16978/// or defined, but to mangle functions with certain calling conventions, the
16979/// mangler needs to know the size of the parameter list. In this situation,
16980/// MSVC doesn't emit an error or instantiate templates. Instead, MSVC mangles
16981/// the function as _foo@0, i.e. zero bytes of parameters, which will usually
16982/// result in a linker error. Clang doesn't implement this behavior, and instead
16983/// attempts to error at compile time.
16984static void CheckCompleteParameterTypesForMangler(Sema &S, FunctionDecl *FD,
16985 SourceLocation Loc) {
16986 class ParamIncompleteTypeDiagnoser : public Sema::TypeDiagnoser {
16987 FunctionDecl *FD;
16988 ParmVarDecl *Param;
16989
16990 public:
16991 ParamIncompleteTypeDiagnoser(FunctionDecl *FD, ParmVarDecl *Param)
16992 : FD(FD), Param(Param) {}
16993
16994 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
16995 CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
16996 StringRef CCName;
16997 switch (CC) {
16998 case CC_X86StdCall:
16999 CCName = "stdcall";
17000 break;
17001 case CC_X86FastCall:
17002 CCName = "fastcall";
17003 break;
17004 case CC_X86VectorCall:
17005 CCName = "vectorcall";
17006 break;
17007 default:
17008 llvm_unreachable("CC does not need mangling")__builtin_unreachable();
17009 }
17010
17011 S.Diag(Loc, diag::err_cconv_incomplete_param_type)
17012 << Param->getDeclName() << FD->getDeclName() << CCName;
17013 }
17014 };
17015
17016 for (ParmVarDecl *Param : FD->parameters()) {
17017 ParamIncompleteTypeDiagnoser Diagnoser(FD, Param);
17018 S.RequireCompleteType(Loc, Param->getType(), Diagnoser);
17019 }
17020}
17021
17022namespace {
17023enum class OdrUseContext {
17024 /// Declarations in this context are not odr-used.
17025 None,
17026 /// Declarations in this context are formally odr-used, but this is a
17027 /// dependent context.
17028 Dependent,
17029 /// Declarations in this context are odr-used but not actually used (yet).
17030 FormallyOdrUsed,
17031 /// Declarations in this context are used.
17032 Used
17033};
17034}
17035
17036/// Are we within a context in which references to resolved functions or to
17037/// variables result in odr-use?
17038static OdrUseContext isOdrUseContext(Sema &SemaRef) {
17039 OdrUseContext Result;
17040
17041 switch (SemaRef.ExprEvalContexts.back().Context) {
17042 case Sema::ExpressionEvaluationContext::Unevaluated:
17043 case Sema::ExpressionEvaluationContext::UnevaluatedList:
17044 case Sema::ExpressionEvaluationContext::UnevaluatedAbstract:
17045 return OdrUseContext::None;
17046
17047 case Sema::ExpressionEvaluationContext::ConstantEvaluated:
17048 case Sema::ExpressionEvaluationContext::PotentiallyEvaluated:
17049 Result = OdrUseContext::Used;
17050 break;
17051
17052 case Sema::ExpressionEvaluationContext::DiscardedStatement:
17053 Result = OdrUseContext::FormallyOdrUsed;
17054 break;
17055
17056 case Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed:
17057 // A default argument formally results in odr-use, but doesn't actually
17058 // result in a use in any real sense until it itself is used.
17059 Result = OdrUseContext::FormallyOdrUsed;
17060 break;
17061 }
17062
17063 if (SemaRef.CurContext->isDependentContext())
17064 return OdrUseContext::Dependent;
17065
17066 return Result;
17067}
17068
17069static bool isImplicitlyDefinableConstexprFunction(FunctionDecl *Func) {
17070 if (!Func->isConstexpr())
17071 return false;
17072
17073 if (Func->isImplicitlyInstantiable() || !Func->isUserProvided())
17074 return true;
17075 auto *CCD = dyn_cast<CXXConstructorDecl>(Func);
17076 return CCD && CCD->getInheritedConstructor();
17077}
17078
17079/// Mark a function referenced, and check whether it is odr-used
17080/// (C++ [basic.def.odr]p2, C99 6.9p3)
17081void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func,
17082 bool MightBeOdrUse) {
17083 assert(Func && "No function?")(static_cast<void> (0));
17084
17085 Func->setReferenced();
17086
17087 // Recursive functions aren't really used until they're used from some other
17088 // context.
17089 bool IsRecursiveCall = CurContext == Func;
17090
17091 // C++11 [basic.def.odr]p3:
17092 // A function whose name appears as a potentially-evaluated expression is
17093 // odr-used if it is the unique lookup result or the selected member of a
17094 // set of overloaded functions [...].
17095 //
17096 // We (incorrectly) mark overload resolution as an unevaluated context, so we
17097 // can just check that here.
17098 OdrUseContext OdrUse =
17099 MightBeOdrUse ? isOdrUseContext(*this) : OdrUseContext::None;
17100 if (IsRecursiveCall && OdrUse == OdrUseContext::Used)
17101 OdrUse = OdrUseContext::FormallyOdrUsed;
17102
17103 // Trivial default constructors and destructors are never actually used.
17104 // FIXME: What about other special members?
17105 if (Func->isTrivial() && !Func->hasAttr<DLLExportAttr>() &&
17106 OdrUse == OdrUseContext::Used) {
17107 if (auto *Constructor = dyn_cast<CXXConstructorDecl>(Func))
17108 if (Constructor->isDefaultConstructor())
17109 OdrUse = OdrUseContext::FormallyOdrUsed;
17110 if (isa<CXXDestructorDecl>(Func))
17111 OdrUse = OdrUseContext::FormallyOdrUsed;
17112 }
17113
17114 // C++20 [expr.const]p12:
17115 // A function [...] is needed for constant evaluation if it is [...] a
17116 // constexpr function that is named by an expression that is potentially
17117 // constant evaluated
17118 bool NeededForConstantEvaluation =
17119 isPotentiallyConstantEvaluatedContext(*this) &&
17120 isImplicitlyDefinableConstexprFunction(Func);
17121
17122 // Determine whether we require a function definition to exist, per
17123 // C++11 [temp.inst]p3:
17124 // Unless a function template specialization has been explicitly
17125 // instantiated or explicitly specialized, the function template
17126 // specialization is implicitly instantiated when the specialization is
17127 // referenced in a context that requires a function definition to exist.
17128 // C++20 [temp.inst]p7:
17129 // The existence of a definition of a [...] function is considered to
17130 // affect the semantics of the program if the [...] function is needed for
17131 // constant evaluation by an expression
17132 // C++20 [basic.def.odr]p10:
17133 // Every program shall contain exactly one definition of every non-inline
17134 // function or variable that is odr-used in that program outside of a
17135 // discarded statement
17136 // C++20 [special]p1:
17137 // The implementation will implicitly define [defaulted special members]
17138 // if they are odr-used or needed for constant evaluation.
17139 //
17140 // Note that we skip the implicit instantiation of templates that are only
17141 // used in unused default arguments or by recursive calls to themselves.
17142 // This is formally non-conforming, but seems reasonable in practice.
17143 bool NeedDefinition = !IsRecursiveCall && (OdrUse == OdrUseContext::Used ||
17144 NeededForConstantEvaluation);
17145
17146 // C++14 [temp.expl.spec]p6:
17147 // If a template [...] is explicitly specialized then that specialization
17148 // shall be declared before the first use of that specialization that would
17149 // cause an implicit instantiation to take place, in every translation unit
17150 // in which such a use occurs
17151 if (NeedDefinition &&
17152 (Func->getTemplateSpecializationKind() != TSK_Undeclared ||
17153 Func->getMemberSpecializationInfo()))
17154 checkSpecializationVisibility(Loc, Func);
17155
17156 if (getLangOpts().CUDA)
17157 CheckCUDACall(Loc, Func);
17158
17159 if (getLangOpts().SYCLIsDevice)
17160 checkSYCLDeviceFunction(Loc, Func);
17161
17162 // If we need a definition, try to create one.
17163 if (NeedDefinition && !Func->getBody()) {
17164 runWithSufficientStackSpace(Loc, [&] {
17165 if (CXXConstructorDecl *Constructor =
17166 dyn_cast<CXXConstructorDecl>(Func)) {
17167 Constructor = cast<CXXConstructorDecl>(Constructor->getFirstDecl());
17168 if (Constructor->isDefaulted() && !Constructor->isDeleted()) {
17169 if (Constructor->isDefaultConstructor()) {
17170 if (Constructor->isTrivial() &&
17171 !Constructor->hasAttr<DLLExportAttr>())
17172 return;
17173 DefineImplicitDefaultConstructor(Loc, Constructor);
17174 } else if (Constructor->isCopyConstructor()) {
17175 DefineImplicitCopyConstructor(Loc, Constructor);
17176 } else if (Constructor->isMoveConstructor()) {
17177 DefineImplicitMoveConstructor(Loc, Constructor);
17178 }
17179 } else if (Constructor->getInheritedConstructor()) {
17180 DefineInheritingConstructor(Loc, Constructor);
17181 }
17182 } else if (CXXDestructorDecl *Destructor =
17183 dyn_cast<CXXDestructorDecl>(Func)) {
17184 Destructor = cast<CXXDestructorDecl>(Destructor->getFirstDecl());
17185 if (Destructor->isDefaulted() && !Destructor->isDeleted()) {
17186 if (Destructor->isTrivial() && !Destructor->hasAttr<DLLExportAttr>())
17187 return;
17188 DefineImplicitDestructor(Loc, Destructor);
17189 }
17190 if (Destructor->isVirtual() && getLangOpts().AppleKext)
17191 MarkVTableUsed(Loc, Destructor->getParent());
17192 } else if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(Func)) {
17193 if (MethodDecl->isOverloadedOperator() &&
17194 MethodDecl->getOverloadedOperator() == OO_Equal) {
17195 MethodDecl = cast<CXXMethodDecl>(MethodDecl->getFirstDecl());
17196 if (MethodDecl->isDefaulted() && !MethodDecl->isDeleted()) {
17197 if (MethodDecl->isCopyAssignmentOperator())
17198 DefineImplicitCopyAssignment(Loc, MethodDecl);
17199 else if (MethodDecl->isMoveAssignmentOperator())
17200 DefineImplicitMoveAssignment(Loc, MethodDecl);
17201 }
17202 } else if (isa<CXXConversionDecl>(MethodDecl) &&
17203 MethodDecl->getParent()->isLambda()) {
17204 CXXConversionDecl *Conversion =
17205 cast<CXXConversionDecl>(MethodDecl->getFirstDecl());
17206 if (Conversion->isLambdaToBlockPointerConversion())
17207 DefineImplicitLambdaToBlockPointerConversion(Loc, Conversion);
17208 else
17209 DefineImplicitLambdaToFunctionPointerConversion(Loc, Conversion);
17210 } else if (MethodDecl->isVirtual() && getLangOpts().AppleKext)
17211 MarkVTableUsed(Loc, MethodDecl->getParent());
17212 }
17213
17214 if (Func->isDefaulted() && !Func->isDeleted()) {
17215 DefaultedComparisonKind DCK = getDefaultedComparisonKind(Func);
17216 if (DCK != DefaultedComparisonKind::None)
17217 DefineDefaultedComparison(Loc, Func, DCK);
17218 }
17219
17220 // Implicit instantiation of function templates and member functions of
17221 // class templates.
17222 if (Func->isImplicitlyInstantiable()) {
17223 TemplateSpecializationKind TSK =
17224 Func->getTemplateSpecializationKindForInstantiation();
17225 SourceLocation PointOfInstantiation = Func->getPointOfInstantiation();
17226 bool FirstInstantiation = PointOfInstantiation.isInvalid();
17227 if (FirstInstantiation) {
17228 PointOfInstantiation = Loc;
17229 if (auto *MSI = Func->getMemberSpecializationInfo())
17230 MSI->setPointOfInstantiation(Loc);
17231 // FIXME: Notify listener.
17232 else
17233 Func->setTemplateSpecializationKind(TSK, PointOfInstantiation);
17234 } else if (TSK != TSK_ImplicitInstantiation) {
17235 // Use the point of use as the point of instantiation, instead of the
17236 // point of explicit instantiation (which we track as the actual point
17237 // of instantiation). This gives better backtraces in diagnostics.
17238 PointOfInstantiation = Loc;
17239 }
17240
17241 if (FirstInstantiation || TSK != TSK_ImplicitInstantiation ||
17242 Func->isConstexpr()) {
17243 if (isa<CXXRecordDecl>(Func->getDeclContext()) &&
17244 cast<CXXRecordDecl>(Func->getDeclContext())->isLocalClass() &&
17245 CodeSynthesisContexts.size())
17246 PendingLocalImplicitInstantiations.push_back(
17247 std::make_pair(Func, PointOfInstantiation));
17248 else if (Func->isConstexpr())
17249 // Do not defer instantiations of constexpr functions, to avoid the
17250 // expression evaluator needing to call back into Sema if it sees a
17251 // call to such a function.
17252 InstantiateFunctionDefinition(PointOfInstantiation, Func);
17253 else {
17254 Func->setInstantiationIsPending(true);
17255 PendingInstantiations.push_back(
17256 std::make_pair(Func, PointOfInstantiation));
17257 // Notify the consumer that a function was implicitly instantiated.
17258 Consumer.HandleCXXImplicitFunctionInstantiation(Func);
17259 }
17260 }
17261 } else {
17262 // Walk redefinitions, as some of them may be instantiable.
17263 for (auto i : Func->redecls()) {
17264 if (!i->isUsed(false) && i->isImplicitlyInstantiable())
17265 MarkFunctionReferenced(Loc, i, MightBeOdrUse);
17266 }
17267 }
17268 });
17269 }
17270
17271 // C++14 [except.spec]p17:
17272 // An exception-specification is considered to be needed when:
17273 // - the function is odr-used or, if it appears in an unevaluated operand,
17274 // would be odr-used if the expression were potentially-evaluated;
17275 //
17276 // Note, we do this even if MightBeOdrUse is false. That indicates that the
17277 // function is a pure virtual function we're calling, and in that case the
17278 // function was selected by overload resolution and we need to resolve its
17279 // exception specification for a different reason.
17280 const FunctionProtoType *FPT = Func->getType()->getAs<FunctionProtoType>();
17281 if (FPT && isUnresolvedExceptionSpec(FPT->getExceptionSpecType()))
17282 ResolveExceptionSpec(Loc, FPT);
17283
17284 // If this is the first "real" use, act on that.
17285 if (OdrUse == OdrUseContext::Used && !Func->isUsed(/*CheckUsedAttr=*/false)) {
17286 // Keep track of used but undefined functions.
17287 if (!Func->isDefined()) {
17288 if (mightHaveNonExternalLinkage(Func))
17289 UndefinedButUsed.insert(std::make_pair(Func->getCanonicalDecl(), Loc));
17290 else if (Func->getMostRecentDecl()->isInlined() &&
17291 !LangOpts.GNUInline &&
17292 !Func->getMostRecentDecl()->hasAttr<GNUInlineAttr>())
17293 UndefinedButUsed.insert(std::make_pair(Func->getCanonicalDecl(), Loc));
17294 else if (isExternalWithNoLinkageType(Func))
17295 UndefinedButUsed.insert(std::make_pair(Func->getCanonicalDecl(), Loc));
17296 }
17297
17298 // Some x86 Windows calling conventions mangle the size of the parameter
17299 // pack into the name. Computing the size of the parameters requires the
17300 // parameter types to be complete. Check that now.
17301 if (funcHasParameterSizeMangling(*this, Func))
17302 CheckCompleteParameterTypesForMangler(*this, Func, Loc);
17303
17304 // In the MS C++ ABI, the compiler emits destructor variants where they are
17305 // used. If the destructor is used here but defined elsewhere, mark the
17306 // virtual base destructors referenced. If those virtual base destructors
17307 // are inline, this will ensure they are defined when emitting the complete
17308 // destructor variant. This checking may be redundant if the destructor is
17309 // provided later in this TU.
17310 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
17311 if (auto *Dtor = dyn_cast<CXXDestructorDecl>(Func)) {
17312 CXXRecordDecl *Parent = Dtor->getParent();
17313 if (Parent->getNumVBases() > 0 && !Dtor->getBody())
17314 CheckCompleteDestructorVariant(Loc, Dtor);
17315 }
17316 }
17317
17318 Func->markUsed(Context);
17319 }
17320}
17321
17322/// Directly mark a variable odr-used. Given a choice, prefer to use
17323/// MarkVariableReferenced since it does additional checks and then
17324/// calls MarkVarDeclODRUsed.
17325/// If the variable must be captured:
17326/// - if FunctionScopeIndexToStopAt is null, capture it in the CurContext
17327/// - else capture it in the DeclContext that maps to the
17328/// *FunctionScopeIndexToStopAt on the FunctionScopeInfo stack.
17329static void
17330MarkVarDeclODRUsed(VarDecl *Var, SourceLocation Loc, Sema &SemaRef,
17331 const unsigned *const FunctionScopeIndexToStopAt = nullptr) {
17332 // Keep track of used but undefined variables.
17333 // FIXME: We shouldn't suppress this warning for static data members.
17334 if (Var->hasDefinition(SemaRef.Context) == VarDecl::DeclarationOnly &&
17335 (!Var->isExternallyVisible() || Var->isInline() ||
17336 SemaRef.isExternalWithNoLinkageType(Var)) &&
17337 !(Var->isStaticDataMember() && Var->hasInit())) {
17338 SourceLocation &old = SemaRef.UndefinedButUsed[Var->getCanonicalDecl()];
17339 if (old.isInvalid())
17340 old = Loc;
17341 }
17342 QualType CaptureType, DeclRefType;
17343 if (SemaRef.LangOpts.OpenMP)
17344 SemaRef.tryCaptureOpenMPLambdas(Var);
17345 SemaRef.tryCaptureVariable(Var, Loc, Sema::TryCapture_Implicit,
17346 /*EllipsisLoc*/ SourceLocation(),
17347 /*BuildAndDiagnose*/ true,
17348 CaptureType, DeclRefType,
17349 FunctionScopeIndexToStopAt);
17350
17351 if (SemaRef.LangOpts.CUDA && Var && Var->hasGlobalStorage()) {
17352 auto *FD = dyn_cast_or_null<FunctionDecl>(SemaRef.CurContext);
17353 auto VarTarget = SemaRef.IdentifyCUDATarget(Var);
17354 auto UserTarget = SemaRef.IdentifyCUDATarget(FD);
17355 if (VarTarget == Sema::CVT_Host &&
17356 (UserTarget == Sema::CFT_Device || UserTarget == Sema::CFT_HostDevice ||
17357 UserTarget == Sema::CFT_Global)) {
17358 // Diagnose ODR-use of host global variables in device functions.
17359 // Reference of device global variables in host functions is allowed
17360 // through shadow variables therefore it is not diagnosed.
17361 if (SemaRef.LangOpts.CUDAIsDevice) {
17362 SemaRef.targetDiag(Loc, diag::err_ref_bad_target)
17363 << /*host*/ 2 << /*variable*/ 1 << Var << UserTarget;
17364 SemaRef.targetDiag(Var->getLocation(),
17365 Var->getType().isConstQualified()
17366 ? diag::note_cuda_const_var_unpromoted
17367 : diag::note_cuda_host_var);
17368 }
17369 } else if (VarTarget == Sema::CVT_Device &&
17370 (UserTarget == Sema::CFT_Host ||
17371 UserTarget == Sema::CFT_HostDevice) &&
17372 !Var->hasExternalStorage()) {
17373 // Record a CUDA/HIP device side variable if it is ODR-used
17374 // by host code. This is done conservatively, when the variable is
17375 // referenced in any of the following contexts:
17376 // - a non-function context
17377 // - a host function
17378 // - a host device function
17379 // This makes the ODR-use of the device side variable by host code to
17380 // be visible in the device compilation for the compiler to be able to
17381 // emit template variables instantiated by host code only and to
17382 // externalize the static device side variable ODR-used by host code.
17383 SemaRef.getASTContext().CUDADeviceVarODRUsedByHost.insert(Var);
17384 }
17385 }
17386
17387 Var->markUsed(SemaRef.Context);
17388}
17389
17390void Sema::MarkCaptureUsedInEnclosingContext(VarDecl *Capture,
17391 SourceLocation Loc,
17392 unsigned CapturingScopeIndex) {
17393 MarkVarDeclODRUsed(Capture, Loc, *this, &CapturingScopeIndex);
17394}
17395
17396static void
17397diagnoseUncapturableValueReference(Sema &S, SourceLocation loc,
17398 ValueDecl *var, DeclContext *DC) {
17399 DeclContext *VarDC = var->getDeclContext();
17400
17401 // If the parameter still belongs to the translation unit, then
17402 // we're actually just using one parameter in the declaration of
17403 // the next.
17404 if (isa<ParmVarDecl>(var) &&
17405 isa<TranslationUnitDecl>(VarDC))
17406 return;
17407
17408 // For C code, don't diagnose about capture if we're not actually in code
17409 // right now; it's impossible to write a non-constant expression outside of
17410 // function context, so we'll get other (more useful) diagnostics later.
17411 //
17412 // For C++, things get a bit more nasty... it would be nice to suppress this
17413 // diagnostic for certain cases like using a local variable in an array bound
17414 // for a member of a local class, but the correct predicate is not obvious.
17415 if (!S.getLangOpts().CPlusPlus && !S.CurContext->isFunctionOrMethod())
17416 return;
17417
17418 unsigned ValueKind = isa<BindingDecl>(var) ? 1 : 0;
17419 unsigned ContextKind = 3; // unknown
17420 if (isa<CXXMethodDecl>(VarDC) &&
17421 cast<CXXRecordDecl>(VarDC->getParent())->isLambda()) {
17422 ContextKind = 2;
17423 } else if (isa<FunctionDecl>(VarDC)) {
17424 ContextKind = 0;
17425 } else if (isa<BlockDecl>(VarDC)) {
17426 ContextKind = 1;
17427 }
17428
17429 S.Diag(loc, diag::err_reference_to_local_in_enclosing_context)
17430 << var << ValueKind << ContextKind << VarDC;
17431 S.Diag(var->getLocation(), diag::note_entity_declared_at)
17432 << var;
17433
17434 // FIXME: Add additional diagnostic info about class etc. which prevents
17435 // capture.
17436}
17437
17438
17439static bool isVariableAlreadyCapturedInScopeInfo(CapturingScopeInfo *CSI, VarDecl *Var,
17440 bool &SubCapturesAreNested,
17441 QualType &CaptureType,
17442 QualType &DeclRefType) {
17443 // Check whether we've already captured it.
17444 if (CSI->CaptureMap.count(Var)) {
17445 // If we found a capture, any subcaptures are nested.
17446 SubCapturesAreNested = true;
17447
17448 // Retrieve the capture type for this variable.
17449 CaptureType = CSI->getCapture(Var).getCaptureType();
17450
17451 // Compute the type of an expression that refers to this variable.
17452 DeclRefType = CaptureType.getNonReferenceType();
17453
17454 // Similarly to mutable captures in lambda, all the OpenMP captures by copy
17455 // are mutable in the sense that user can change their value - they are
17456 // private instances of the captured declarations.
17457 const Capture &Cap = CSI->getCapture(Var);
17458 if (Cap.isCopyCapture() &&
17459 !(isa<LambdaScopeInfo>(CSI) && cast<LambdaScopeInfo>(CSI)->Mutable) &&
17460 !(isa<CapturedRegionScopeInfo>(CSI) &&
17461 cast<CapturedRegionScopeInfo>(CSI)->CapRegionKind == CR_OpenMP))
17462 DeclRefType.addConst();
17463 return true;
17464 }
17465 return false;
17466}
17467
17468// Only block literals, captured statements, and lambda expressions can
17469// capture; other scopes don't work.
17470static DeclContext *getParentOfCapturingContextOrNull(DeclContext *DC, VarDecl *Var,
17471 SourceLocation Loc,
17472 const bool Diagnose, Sema &S) {
17473 if (isa<BlockDecl>(DC) || isa<CapturedDecl>(DC) || isLambdaCallOperator(DC))
17474 return getLambdaAwareParentOfDeclContext(DC);
17475 else if (Var->hasLocalStorage()) {
17476 if (Diagnose)
17477 diagnoseUncapturableValueReference(S, Loc, Var, DC);
17478 }
17479 return nullptr;
17480}
17481
17482// Certain capturing entities (lambdas, blocks etc.) are not allowed to capture
17483// certain types of variables (unnamed, variably modified types etc.)
17484// so check for eligibility.
17485static bool isVariableCapturable(CapturingScopeInfo *CSI, VarDecl *Var,
17486 SourceLocation Loc,
17487 const bool Diagnose, Sema &S) {
17488
17489 bool IsBlock = isa<BlockScopeInfo>(CSI);
17490 bool IsLambda = isa<LambdaScopeInfo>(CSI);
17491
17492 // Lambdas are not allowed to capture unnamed variables
17493 // (e.g. anonymous unions).
17494 // FIXME: The C++11 rule don't actually state this explicitly, but I'm
17495 // assuming that's the intent.
17496 if (IsLambda && !Var->getDeclName()) {
17497 if (Diagnose) {
17498 S.Diag(Loc, diag::err_lambda_capture_anonymous_var);
17499 S.Diag(Var->getLocation(), diag::note_declared_at);
17500 }
17501 return false;
17502 }
17503
17504 // Prohibit variably-modified types in blocks; they're difficult to deal with.
17505 if (Var->getType()->isVariablyModifiedType() && IsBlock) {
17506 if (Diagnose) {
17507 S.Diag(Loc, diag::err_ref_vm_type);
17508 S.Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17509 }
17510 return false;
17511 }
17512 // Prohibit structs with flexible array members too.
17513 // We cannot capture what is in the tail end of the struct.
17514 if (const RecordType *VTTy = Var->getType()->getAs<RecordType>()) {
17515 if (VTTy->getDecl()->hasFlexibleArrayMember()) {
17516 if (Diagnose) {
17517 if (IsBlock)
17518 S.Diag(Loc, diag::err_ref_flexarray_type);
17519 else
17520 S.Diag(Loc, diag::err_lambda_capture_flexarray_type) << Var;
17521 S.Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17522 }
17523 return false;
17524 }
17525 }
17526 const bool HasBlocksAttr = Var->hasAttr<BlocksAttr>();
17527 // Lambdas and captured statements are not allowed to capture __block
17528 // variables; they don't support the expected semantics.
17529 if (HasBlocksAttr && (IsLambda || isa<CapturedRegionScopeInfo>(CSI))) {
17530 if (Diagnose) {
17531 S.Diag(Loc, diag::err_capture_block_variable) << Var << !IsLambda;
17532 S.Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17533 }
17534 return false;
17535 }
17536 // OpenCL v2.0 s6.12.5: Blocks cannot reference/capture other blocks
17537 if (S.getLangOpts().OpenCL && IsBlock &&
17538 Var->getType()->isBlockPointerType()) {
17539 if (Diagnose)
17540 S.Diag(Loc, diag::err_opencl_block_ref_block);
17541 return false;
17542 }
17543
17544 return true;
17545}
17546
17547// Returns true if the capture by block was successful.
17548static bool captureInBlock(BlockScopeInfo *BSI, VarDecl *Var,
17549 SourceLocation Loc,
17550 const bool BuildAndDiagnose,
17551 QualType &CaptureType,
17552 QualType &DeclRefType,
17553 const bool Nested,
17554 Sema &S, bool Invalid) {
17555 bool ByRef = false;
17556
17557 // Blocks are not allowed to capture arrays, excepting OpenCL.
17558 // OpenCL v2.0 s1.12.5 (revision 40): arrays are captured by reference
17559 // (decayed to pointers).
17560 if (!Invalid && !S.getLangOpts().OpenCL && CaptureType->isArrayType()) {
17561 if (BuildAndDiagnose) {
17562 S.Diag(Loc, diag::err_ref_array_type);
17563 S.Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17564 Invalid = true;
17565 } else {
17566 return false;
17567 }
17568 }
17569
17570 // Forbid the block-capture of autoreleasing variables.
17571 if (!Invalid &&
17572 CaptureType.getObjCLifetime() == Qualifiers::OCL_Autoreleasing) {
17573 if (BuildAndDiagnose) {
17574 S.Diag(Loc, diag::err_arc_autoreleasing_capture)
17575 << /*block*/ 0;
17576 S.Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17577 Invalid = true;
17578 } else {
17579 return false;
17580 }
17581 }
17582
17583 // Warn about implicitly autoreleasing indirect parameters captured by blocks.
17584 if (const auto *PT = CaptureType->getAs<PointerType>()) {
17585 QualType PointeeTy = PT->getPointeeType();
17586
17587 if (!Invalid && PointeeTy->getAs<ObjCObjectPointerType>() &&
17588 PointeeTy.getObjCLifetime() == Qualifiers::OCL_Autoreleasing &&
17589 !S.Context.hasDirectOwnershipQualifier(PointeeTy)) {
17590 if (BuildAndDiagnose) {
17591 SourceLocation VarLoc = Var->getLocation();
17592 S.Diag(Loc, diag::warn_block_capture_autoreleasing);
17593 S.Diag(VarLoc, diag::note_declare_parameter_strong);
17594 }
17595 }
17596 }
17597
17598 const bool HasBlocksAttr = Var->hasAttr<BlocksAttr>();
17599 if (HasBlocksAttr || CaptureType->isReferenceType() ||
17600 (S.getLangOpts().OpenMP && S.isOpenMPCapturedDecl(Var))) {
17601 // Block capture by reference does not change the capture or
17602 // declaration reference types.
17603 ByRef = true;
17604 } else {
17605 // Block capture by copy introduces 'const'.
17606 CaptureType = CaptureType.getNonReferenceType().withConst();
17607 DeclRefType = CaptureType;
17608 }
17609
17610 // Actually capture the variable.
17611 if (BuildAndDiagnose)
17612 BSI->addCapture(Var, HasBlocksAttr, ByRef, Nested, Loc, SourceLocation(),
17613 CaptureType, Invalid);
17614
17615 return !Invalid;
17616}
17617
17618
17619/// Capture the given variable in the captured region.
17620static bool captureInCapturedRegion(
17621 CapturedRegionScopeInfo *RSI, VarDecl *Var, SourceLocation Loc,
17622 const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType,
17623 const bool RefersToCapturedVariable, Sema::TryCaptureKind Kind,
17624 bool IsTopScope, Sema &S, bool Invalid) {
17625 // By default, capture variables by reference.
17626 bool ByRef = true;
17627 if (IsTopScope && Kind != Sema::TryCapture_Implicit) {
17628 ByRef = (Kind == Sema::TryCapture_ExplicitByRef);
17629 } else if (S.getLangOpts().OpenMP && RSI->CapRegionKind == CR_OpenMP) {
17630 // Using an LValue reference type is consistent with Lambdas (see below).
17631 if (S.isOpenMPCapturedDecl(Var)) {
17632 bool HasConst = DeclRefType.isConstQualified();
17633 DeclRefType = DeclRefType.getUnqualifiedType();
17634 // Don't lose diagnostics about assignments to const.
17635 if (HasConst)
17636 DeclRefType.addConst();
17637 }
17638 // Do not capture firstprivates in tasks.
17639 if (S.isOpenMPPrivateDecl(Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel) !=
17640 OMPC_unknown)
17641 return true;
17642 ByRef = S.isOpenMPCapturedByRef(Var, RSI->OpenMPLevel,
17643 RSI->OpenMPCaptureLevel);
17644 }
17645
17646 if (ByRef)
17647 CaptureType = S.Context.getLValueReferenceType(DeclRefType);
17648 else
17649 CaptureType = DeclRefType;
17650
17651 // Actually capture the variable.
17652 if (BuildAndDiagnose)
17653 RSI->addCapture(Var, /*isBlock*/ false, ByRef, RefersToCapturedVariable,
17654 Loc, SourceLocation(), CaptureType, Invalid);
17655
17656 return !Invalid;
17657}
17658
17659/// Capture the given variable in the lambda.
17660static bool captureInLambda(LambdaScopeInfo *LSI,
17661 VarDecl *Var,
17662 SourceLocation Loc,
17663 const bool BuildAndDiagnose,
17664 QualType &CaptureType,
17665 QualType &DeclRefType,
17666 const bool RefersToCapturedVariable,
17667 const Sema::TryCaptureKind Kind,
17668 SourceLocation EllipsisLoc,
17669 const bool IsTopScope,
17670 Sema &S, bool Invalid) {
17671 // Determine whether we are capturing by reference or by value.
17672 bool ByRef = false;
17673 if (IsTopScope && Kind != Sema::TryCapture_Implicit) {
17674 ByRef = (Kind == Sema::TryCapture_ExplicitByRef);
17675 } else {
17676 ByRef = (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref);
17677 }
17678
17679 // Compute the type of the field that will capture this variable.
17680 if (ByRef) {
17681 // C++11 [expr.prim.lambda]p15:
17682 // An entity is captured by reference if it is implicitly or
17683 // explicitly captured but not captured by copy. It is
17684 // unspecified whether additional unnamed non-static data
17685 // members are declared in the closure type for entities
17686 // captured by reference.
17687 //
17688 // FIXME: It is not clear whether we want to build an lvalue reference
17689 // to the DeclRefType or to CaptureType.getNonReferenceType(). GCC appears
17690 // to do the former, while EDG does the latter. Core issue 1249 will
17691 // clarify, but for now we follow GCC because it's a more permissive and
17692 // easily defensible position.
17693 CaptureType = S.Context.getLValueReferenceType(DeclRefType);
17694 } else {
17695 // C++11 [expr.prim.lambda]p14:
17696 // For each entity captured by copy, an unnamed non-static
17697 // data member is declared in the closure type. The
17698 // declaration order of these members is unspecified. The type
17699 // of such a data member is the type of the corresponding
17700 // captured entity if the entity is not a reference to an
17701 // object, or the referenced type otherwise. [Note: If the
17702 // captured entity is a reference to a function, the
17703 // corresponding data member is also a reference to a
17704 // function. - end note ]
17705 if (const ReferenceType *RefType = CaptureType->getAs<ReferenceType>()){
17706 if (!RefType->getPointeeType()->isFunctionType())
17707 CaptureType = RefType->getPointeeType();
17708 }
17709
17710 // Forbid the lambda copy-capture of autoreleasing variables.
17711 if (!Invalid &&
17712 CaptureType.getObjCLifetime() == Qualifiers::OCL_Autoreleasing) {
17713 if (BuildAndDiagnose) {
17714 S.Diag(Loc, diag::err_arc_autoreleasing_capture) << /*lambda*/ 1;
17715 S.Diag(Var->getLocation(), diag::note_previous_decl)
17716 << Var->getDeclName();
17717 Invalid = true;
17718 } else {
17719 return false;
17720 }
17721 }
17722
17723 // Make sure that by-copy captures are of a complete and non-abstract type.
17724 if (!Invalid && BuildAndDiagnose) {
17725 if (!CaptureType->isDependentType() &&
17726 S.RequireCompleteSizedType(
17727 Loc, CaptureType,
17728 diag::err_capture_of_incomplete_or_sizeless_type,
17729 Var->getDeclName()))
17730 Invalid = true;
17731 else if (S.RequireNonAbstractType(Loc, CaptureType,
17732 diag::err_capture_of_abstract_type))
17733 Invalid = true;
17734 }
17735 }
17736
17737 // Compute the type of a reference to this captured variable.
17738 if (ByRef)
17739 DeclRefType = CaptureType.getNonReferenceType();
17740 else {
17741 // C++ [expr.prim.lambda]p5:
17742 // The closure type for a lambda-expression has a public inline
17743 // function call operator [...]. This function call operator is
17744 // declared const (9.3.1) if and only if the lambda-expression's
17745 // parameter-declaration-clause is not followed by mutable.
17746 DeclRefType = CaptureType.getNonReferenceType();
17747 if (!LSI->Mutable && !CaptureType->isReferenceType())
17748 DeclRefType.addConst();
17749 }
17750
17751 // Add the capture.
17752 if (BuildAndDiagnose)
17753 LSI->addCapture(Var, /*isBlock=*/false, ByRef, RefersToCapturedVariable,
17754 Loc, EllipsisLoc, CaptureType, Invalid);
17755
17756 return !Invalid;
17757}
17758
17759static bool canCaptureVariableByCopy(VarDecl *Var, const ASTContext &Context) {
17760 // Offer a Copy fix even if the type is dependent.
17761 if (Var->getType()->isDependentType())
17762 return true;
17763 QualType T = Var->getType().getNonReferenceType();
17764 if (T.isTriviallyCopyableType(Context))
17765 return true;
17766 if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
17767
17768 if (!(RD = RD->getDefinition()))
17769 return false;
17770 if (RD->hasSimpleCopyConstructor())
17771 return true;
17772 if (RD->hasUserDeclaredCopyConstructor())
17773 for (CXXConstructorDecl *Ctor : RD->ctors())
17774 if (Ctor->isCopyConstructor())
17775 return !Ctor->isDeleted();
17776 }
17777 return false;
17778}
17779
17780/// Create up to 4 fix-its for explicit reference and value capture of \p Var or
17781/// default capture. Fixes may be omitted if they aren't allowed by the
17782/// standard, for example we can't emit a default copy capture fix-it if we
17783/// already explicitly copy capture capture another variable.
17784static void buildLambdaCaptureFixit(Sema &Sema, LambdaScopeInfo *LSI,
17785 VarDecl *Var) {
17786 assert(LSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_None)(static_cast<void> (0));
17787 // Don't offer Capture by copy of default capture by copy fixes if Var is
17788 // known not to be copy constructible.
17789 bool ShouldOfferCopyFix = canCaptureVariableByCopy(Var, Sema.getASTContext());
17790
17791 SmallString<32> FixBuffer;
17792 StringRef Separator = LSI->NumExplicitCaptures > 0 ? ", " : "";
17793 if (Var->getDeclName().isIdentifier() && !Var->getName().empty()) {
17794 SourceLocation VarInsertLoc = LSI->IntroducerRange.getEnd();
17795 if (ShouldOfferCopyFix) {
17796 // Offer fixes to insert an explicit capture for the variable.
17797 // [] -> [VarName]
17798 // [OtherCapture] -> [OtherCapture, VarName]
17799 FixBuffer.assign({Separator, Var->getName()});
17800 Sema.Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
17801 << Var << /*value*/ 0
17802 << FixItHint::CreateInsertion(VarInsertLoc, FixBuffer);
17803 }
17804 // As above but capture by reference.
17805 FixBuffer.assign({Separator, "&", Var->getName()});
17806 Sema.Diag(VarInsertLoc, diag::note_lambda_variable_capture_fixit)
17807 << Var << /*reference*/ 1
17808 << FixItHint::CreateInsertion(VarInsertLoc, FixBuffer);
17809 }
17810
17811 // Only try to offer default capture if there are no captures excluding this
17812 // and init captures.
17813 // [this]: OK.
17814 // [X = Y]: OK.
17815 // [&A, &B]: Don't offer.
17816 // [A, B]: Don't offer.
17817 if (llvm::any_of(LSI->Captures, [](Capture &C) {
17818 return !C.isThisCapture() && !C.isInitCapture();
17819 }))
17820 return;
17821
17822 // The default capture specifiers, '=' or '&', must appear first in the
17823 // capture body.
17824 SourceLocation DefaultInsertLoc =
17825 LSI->IntroducerRange.getBegin().getLocWithOffset(1);
17826
17827 if (ShouldOfferCopyFix) {
17828 bool CanDefaultCopyCapture = true;
17829 // [=, *this] OK since c++17
17830 // [=, this] OK since c++20
17831 if (LSI->isCXXThisCaptured() && !Sema.getLangOpts().CPlusPlus20)
17832 CanDefaultCopyCapture = Sema.getLangOpts().CPlusPlus17
17833 ? LSI->getCXXThisCapture().isCopyCapture()
17834 : false;
17835 // We can't use default capture by copy if any captures already specified
17836 // capture by copy.
17837 if (CanDefaultCopyCapture && llvm::none_of(LSI->Captures, [](Capture &C) {
17838 return !C.isThisCapture() && !C.isInitCapture() && C.isCopyCapture();
17839 })) {
17840 FixBuffer.assign({"=", Separator});
17841 Sema.Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
17842 << /*value*/ 0
17843 << FixItHint::CreateInsertion(DefaultInsertLoc, FixBuffer);
17844 }
17845 }
17846
17847 // We can't use default capture by reference if any captures already specified
17848 // capture by reference.
17849 if (llvm::none_of(LSI->Captures, [](Capture &C) {
17850 return !C.isInitCapture() && C.isReferenceCapture() &&
17851 !C.isThisCapture();
17852 })) {
17853 FixBuffer.assign({"&", Separator});
17854 Sema.Diag(DefaultInsertLoc, diag::note_lambda_default_capture_fixit)
17855 << /*reference*/ 1
17856 << FixItHint::CreateInsertion(DefaultInsertLoc, FixBuffer);
17857 }
17858}
17859
17860bool Sema::tryCaptureVariable(
17861 VarDecl *Var, SourceLocation ExprLoc, TryCaptureKind Kind,
17862 SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType,
17863 QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt) {
17864 // An init-capture is notionally from the context surrounding its
17865 // declaration, but its parent DC is the lambda class.
17866 DeclContext *VarDC = Var->getDeclContext();
17867 if (Var->isInitCapture())
17868 VarDC = VarDC->getParent();
17869
17870 DeclContext *DC = CurContext;
17871 const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
17872 ? *FunctionScopeIndexToStopAt : FunctionScopes.size() - 1;
17873 // We need to sync up the Declaration Context with the
17874 // FunctionScopeIndexToStopAt
17875 if (FunctionScopeIndexToStopAt) {
17876 unsigned FSIndex = FunctionScopes.size() - 1;
17877 while (FSIndex != MaxFunctionScopesIndex) {
17878 DC = getLambdaAwareParentOfDeclContext(DC);
17879 --FSIndex;
17880 }
17881 }
17882
17883
17884 // If the variable is declared in the current context, there is no need to
17885 // capture it.
17886 if (VarDC == DC) return true;
17887
17888 // Capture global variables if it is required to use private copy of this
17889 // variable.
17890 bool IsGlobal = !Var->hasLocalStorage();
17891 if (IsGlobal &&
17892 !(LangOpts.OpenMP && isOpenMPCapturedDecl(Var, /*CheckScopeInfo=*/true,
17893 MaxFunctionScopesIndex)))
17894 return true;
17895 Var = Var->getCanonicalDecl();
17896
17897 // Walk up the stack to determine whether we can capture the variable,
17898 // performing the "simple" checks that don't depend on type. We stop when
17899 // we've either hit the declared scope of the variable or find an existing
17900 // capture of that variable. We start from the innermost capturing-entity
17901 // (the DC) and ensure that all intervening capturing-entities
17902 // (blocks/lambdas etc.) between the innermost capturer and the variable`s
17903 // declcontext can either capture the variable or have already captured
17904 // the variable.
17905 CaptureType = Var->getType();
17906 DeclRefType = CaptureType.getNonReferenceType();
17907 bool Nested = false;
17908 bool Explicit = (Kind != TryCapture_Implicit);
17909 unsigned FunctionScopesIndex = MaxFunctionScopesIndex;
17910 do {
17911 // Only block literals, captured statements, and lambda expressions can
17912 // capture; other scopes don't work.
17913 DeclContext *ParentDC = getParentOfCapturingContextOrNull(DC, Var,
17914 ExprLoc,
17915 BuildAndDiagnose,
17916 *this);
17917 // We need to check for the parent *first* because, if we *have*
17918 // private-captured a global variable, we need to recursively capture it in
17919 // intermediate blocks, lambdas, etc.
17920 if (!ParentDC) {
17921 if (IsGlobal) {
17922 FunctionScopesIndex = MaxFunctionScopesIndex - 1;
17923 break;
17924 }
17925 return true;
17926 }
17927
17928 FunctionScopeInfo *FSI = FunctionScopes[FunctionScopesIndex];
17929 CapturingScopeInfo *CSI = cast<CapturingScopeInfo>(FSI);
17930
17931
17932 // Check whether we've already captured it.
17933 if (isVariableAlreadyCapturedInScopeInfo(CSI, Var, Nested, CaptureType,
17934 DeclRefType)) {
17935 CSI->getCapture(Var).markUsed(BuildAndDiagnose);
17936 break;
17937 }
17938 // If we are instantiating a generic lambda call operator body,
17939 // we do not want to capture new variables. What was captured
17940 // during either a lambdas transformation or initial parsing
17941 // should be used.
17942 if (isGenericLambdaCallOperatorSpecialization(DC)) {
17943 if (BuildAndDiagnose) {
17944 LambdaScopeInfo *LSI = cast<LambdaScopeInfo>(CSI);
17945 if (LSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_None) {
17946 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
17947 Diag(Var->getLocation(), diag::note_previous_decl) << Var;
17948 Diag(LSI->Lambda->getBeginLoc(), diag::note_lambda_decl);
17949 buildLambdaCaptureFixit(*this, LSI, Var);
17950 } else
17951 diagnoseUncapturableValueReference(*this, ExprLoc, Var, DC);
17952 }
17953 return true;
17954 }
17955
17956 // Try to capture variable-length arrays types.
17957 if (Var->getType()->isVariablyModifiedType()) {
17958 // We're going to walk down into the type and look for VLA
17959 // expressions.
17960 QualType QTy = Var->getType();
17961 if (ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
17962 QTy = PVD->getOriginalType();
17963 captureVariablyModifiedType(Context, QTy, CSI);
17964 }
17965
17966 if (getLangOpts().OpenMP) {
17967 if (auto *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
17968 // OpenMP private variables should not be captured in outer scope, so
17969 // just break here. Similarly, global variables that are captured in a
17970 // target region should not be captured outside the scope of the region.
17971 if (RSI->CapRegionKind == CR_OpenMP) {
17972 OpenMPClauseKind IsOpenMPPrivateDecl = isOpenMPPrivateDecl(
17973 Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel);
17974 // If the variable is private (i.e. not captured) and has variably
17975 // modified type, we still need to capture the type for correct
17976 // codegen in all regions, associated with the construct. Currently,
17977 // it is captured in the innermost captured region only.
17978 if (IsOpenMPPrivateDecl != OMPC_unknown &&
17979 Var->getType()->isVariablyModifiedType()) {
17980 QualType QTy = Var->getType();
17981 if (ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
17982 QTy = PVD->getOriginalType();
17983 for (int I = 1, E = getNumberOfConstructScopes(RSI->OpenMPLevel);
17984 I < E; ++I) {
17985 auto *OuterRSI = cast<CapturedRegionScopeInfo>(
17986 FunctionScopes[FunctionScopesIndex - I]);
17987 assert(RSI->OpenMPLevel == OuterRSI->OpenMPLevel &&(static_cast<void> (0))
17988 "Wrong number of captured regions associated with the "(static_cast<void> (0))
17989 "OpenMP construct.")(static_cast<void> (0));
17990 captureVariablyModifiedType(Context, QTy, OuterRSI);
17991 }
17992 }
17993 bool IsTargetCap =
17994 IsOpenMPPrivateDecl != OMPC_private &&
17995 isOpenMPTargetCapturedDecl(Var, RSI->OpenMPLevel,
17996 RSI->OpenMPCaptureLevel);
17997 // Do not capture global if it is not privatized in outer regions.
17998 bool IsGlobalCap =
17999 IsGlobal && isOpenMPGlobalCapturedDecl(Var, RSI->OpenMPLevel,
18000 RSI->OpenMPCaptureLevel);
18001
18002 // When we detect target captures we are looking from inside the
18003 // target region, therefore we need to propagate the capture from the
18004 // enclosing region. Therefore, the capture is not initially nested.
18005 if (IsTargetCap)
18006 adjustOpenMPTargetScopeIndex(FunctionScopesIndex, RSI->OpenMPLevel);
18007
18008 if (IsTargetCap || IsOpenMPPrivateDecl == OMPC_private ||
18009 (IsGlobal && !IsGlobalCap)) {
18010 Nested = !IsTargetCap;
18011 bool HasConst = DeclRefType.isConstQualified();
18012 DeclRefType = DeclRefType.getUnqualifiedType();
18013 // Don't lose diagnostics about assignments to const.
18014 if (HasConst)
18015 DeclRefType.addConst();
18016 CaptureType = Context.getLValueReferenceType(DeclRefType);
18017 break;
18018 }
18019 }
18020 }
18021 }
18022 if (CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_None && !Explicit) {
18023 // No capture-default, and this is not an explicit capture
18024 // so cannot capture this variable.
18025 if (BuildAndDiagnose) {
18026 Diag(ExprLoc, diag::err_lambda_impcap) << Var;
18027 Diag(Var->getLocation(), diag::note_previous_decl) << Var;
18028 auto *LSI = cast<LambdaScopeInfo>(CSI);
18029 if (LSI->Lambda) {
18030 Diag(LSI->Lambda->getBeginLoc(), diag::note_lambda_decl);
18031 buildLambdaCaptureFixit(*this, LSI, Var);
18032 }
18033 // FIXME: If we error out because an outer lambda can not implicitly
18034 // capture a variable that an inner lambda explicitly captures, we
18035 // should have the inner lambda do the explicit capture - because
18036 // it makes for cleaner diagnostics later. This would purely be done
18037 // so that the diagnostic does not misleadingly claim that a variable
18038 // can not be captured by a lambda implicitly even though it is captured
18039 // explicitly. Suggestion:
18040 // - create const bool VariableCaptureWasInitiallyExplicit = Explicit
18041 // at the function head
18042 // - cache the StartingDeclContext - this must be a lambda
18043 // - captureInLambda in the innermost lambda the variable.
18044 }
18045 return true;
18046 }
18047
18048 FunctionScopesIndex--;
18049 DC = ParentDC;
18050 Explicit = false;
18051 } while (!VarDC->Equals(DC));
18052
18053 // Walk back down the scope stack, (e.g. from outer lambda to inner lambda)
18054 // computing the type of the capture at each step, checking type-specific
18055 // requirements, and adding captures if requested.
18056 // If the variable had already been captured previously, we start capturing
18057 // at the lambda nested within that one.
18058 bool Invalid = false;
18059 for (unsigned I = ++FunctionScopesIndex, N = MaxFunctionScopesIndex + 1; I != N;
18060 ++I) {
18061 CapturingScopeInfo *CSI = cast<CapturingScopeInfo>(FunctionScopes[I]);
18062
18063 // Certain capturing entities (lambdas, blocks etc.) are not allowed to capture
18064 // certain types of variables (unnamed, variably modified types etc.)
18065 // so check for eligibility.
18066 if (!Invalid)
18067 Invalid =
18068 !isVariableCapturable(CSI, Var, ExprLoc, BuildAndDiagnose, *this);
18069
18070 // After encountering an error, if we're actually supposed to capture, keep
18071 // capturing in nested contexts to suppress any follow-on diagnostics.
18072 if (Invalid && !BuildAndDiagnose)
18073 return true;
18074
18075 if (BlockScopeInfo *BSI = dyn_cast<BlockScopeInfo>(CSI)) {
18076 Invalid = !captureInBlock(BSI, Var, ExprLoc, BuildAndDiagnose, CaptureType,
18077 DeclRefType, Nested, *this, Invalid);
18078 Nested = true;
18079 } else if (CapturedRegionScopeInfo *RSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
18080 Invalid = !captureInCapturedRegion(
18081 RSI, Var, ExprLoc, BuildAndDiagnose, CaptureType, DeclRefType, Nested,
18082 Kind, /*IsTopScope*/ I == N - 1, *this, Invalid);
18083 Nested = true;
18084 } else {
18085 LambdaScopeInfo *LSI = cast<LambdaScopeInfo>(CSI);
18086 Invalid =
18087 !captureInLambda(LSI, Var, ExprLoc, BuildAndDiagnose, CaptureType,
18088 DeclRefType, Nested, Kind, EllipsisLoc,
18089 /*IsTopScope*/ I == N - 1, *this, Invalid);
18090 Nested = true;
18091 }
18092
18093 if (Invalid && !BuildAndDiagnose)
18094 return true;
18095 }
18096 return Invalid;
18097}
18098
18099bool Sema::tryCaptureVariable(VarDecl *Var, SourceLocation Loc,
18100 TryCaptureKind Kind, SourceLocation EllipsisLoc) {
18101 QualType CaptureType;
18102 QualType DeclRefType;
18103 return tryCaptureVariable(Var, Loc, Kind, EllipsisLoc,
18104 /*BuildAndDiagnose=*/true, CaptureType,
18105 DeclRefType, nullptr);
18106}
18107
18108bool Sema::NeedToCaptureVariable(VarDecl *Var, SourceLocation Loc) {
18109 QualType CaptureType;
18110 QualType DeclRefType;
18111 return !tryCaptureVariable(Var, Loc, TryCapture_Implicit, SourceLocation(),
18112 /*BuildAndDiagnose=*/false, CaptureType,
18113 DeclRefType, nullptr);
18114}
18115
18116QualType Sema::getCapturedDeclRefType(VarDecl *Var, SourceLocation Loc) {
18117 QualType CaptureType;
18118 QualType DeclRefType;
18119
18120 // Determine whether we can capture this variable.
18121 if (tryCaptureVariable(Var, Loc, TryCapture_Implicit, SourceLocation(),
18122 /*BuildAndDiagnose=*/false, CaptureType,
18123 DeclRefType, nullptr))
18124 return QualType();
18125
18126 return DeclRefType;
18127}
18128
18129namespace {
18130// Helper to copy the template arguments from a DeclRefExpr or MemberExpr.
18131// The produced TemplateArgumentListInfo* points to data stored within this
18132// object, so should only be used in contexts where the pointer will not be
18133// used after the CopiedTemplateArgs object is destroyed.
18134class CopiedTemplateArgs {
18135 bool HasArgs;
18136 TemplateArgumentListInfo TemplateArgStorage;
18137public:
18138 template<typename RefExpr>
18139 CopiedTemplateArgs(RefExpr *E) : HasArgs(E->hasExplicitTemplateArgs()) {
18140 if (HasArgs)
18141 E->copyTemplateArgumentsInto(TemplateArgStorage);
18142 }
18143 operator TemplateArgumentListInfo*()
18144#ifdef __has_cpp_attribute
18145#if0 __has_cpp_attribute(clang::lifetimebound)1
18146 [[clang::lifetimebound]]
18147#endif
18148#endif
18149 {
18150 return HasArgs ? &TemplateArgStorage : nullptr;
18151 }
18152};
18153}
18154
18155/// Walk the set of potential results of an expression and mark them all as
18156/// non-odr-uses if they satisfy the side-conditions of the NonOdrUseReason.
18157///
18158/// \return A new expression if we found any potential results, ExprEmpty() if
18159/// not, and ExprError() if we diagnosed an error.
18160static ExprResult rebuildPotentialResultsAsNonOdrUsed(Sema &S, Expr *E,
18161 NonOdrUseReason NOUR) {
18162 // Per C++11 [basic.def.odr], a variable is odr-used "unless it is
18163 // an object that satisfies the requirements for appearing in a
18164 // constant expression (5.19) and the lvalue-to-rvalue conversion (4.1)
18165 // is immediately applied." This function handles the lvalue-to-rvalue
18166 // conversion part.
18167 //
18168 // If we encounter a node that claims to be an odr-use but shouldn't be, we
18169 // transform it into the relevant kind of non-odr-use node and rebuild the
18170 // tree of nodes leading to it.
18171 //
18172 // This is a mini-TreeTransform that only transforms a restricted subset of
18173 // nodes (and only certain operands of them).
18174
18175 // Rebuild a subexpression.
18176 auto Rebuild = [&](Expr *Sub) {
18177 return rebuildPotentialResultsAsNonOdrUsed(S, Sub, NOUR);
18178 };
18179
18180 // Check whether a potential result satisfies the requirements of NOUR.
18181 auto IsPotentialResultOdrUsed = [&](NamedDecl *D) {
18182 // Any entity other than a VarDecl is always odr-used whenever it's named
18183 // in a potentially-evaluated expression.
18184 auto *VD = dyn_cast<VarDecl>(D);
18185 if (!VD)
18186 return true;
18187
18188 // C++2a [basic.def.odr]p4:
18189 // A variable x whose name appears as a potentially-evalauted expression
18190 // e is odr-used by e unless
18191 // -- x is a reference that is usable in constant expressions, or
18192 // -- x is a variable of non-reference type that is usable in constant
18193 // expressions and has no mutable subobjects, and e is an element of
18194 // the set of potential results of an expression of
18195 // non-volatile-qualified non-class type to which the lvalue-to-rvalue
18196 // conversion is applied, or
18197 // -- x is a variable of non-reference type, and e is an element of the
18198 // set of potential results of a discarded-value expression to which
18199 // the lvalue-to-rvalue conversion is not applied
18200 //
18201 // We check the first bullet and the "potentially-evaluated" condition in
18202 // BuildDeclRefExpr. We check the type requirements in the second bullet
18203 // in CheckLValueToRValueConversionOperand below.
18204 switch (NOUR) {
18205 case NOUR_None:
18206 case NOUR_Unevaluated:
18207 llvm_unreachable("unexpected non-odr-use-reason")__builtin_unreachable();
18208
18209 case NOUR_Constant:
18210 // Constant references were handled when they were built.
18211 if (VD->getType()->isReferenceType())
18212 return true;
18213 if (auto *RD = VD->getType()->getAsCXXRecordDecl())
18214 if (RD->hasMutableFields())
18215 return true;
18216 if (!VD->isUsableInConstantExpressions(S.Context))
18217 return true;
18218 break;
18219
18220 case NOUR_Discarded:
18221 if (VD->getType()->isReferenceType())
18222 return true;
18223 break;
18224 }
18225 return false;
18226 };
18227
18228 // Mark that this expression does not constitute an odr-use.
18229 auto MarkNotOdrUsed = [&] {
18230 S.MaybeODRUseExprs.remove(E);
18231 if (LambdaScopeInfo *LSI = S.getCurLambda())
18232 LSI->markVariableExprAsNonODRUsed(E);
18233 };
18234
18235 // C++2a [basic.def.odr]p2:
18236 // The set of potential results of an expression e is defined as follows:
18237 switch (E->getStmtClass()) {
18238 // -- If e is an id-expression, ...
18239 case Expr::DeclRefExprClass: {
18240 auto *DRE = cast<DeclRefExpr>(E);
18241 if (DRE->isNonOdrUse() || IsPotentialResultOdrUsed(DRE->getDecl()))
18242 break;
18243
18244 // Rebuild as a non-odr-use DeclRefExpr.
18245 MarkNotOdrUsed();
18246 return DeclRefExpr::Create(
18247 S.Context, DRE->getQualifierLoc(), DRE->getTemplateKeywordLoc(),
18248 DRE->getDecl(), DRE->refersToEnclosingVariableOrCapture(),
18249 DRE->getNameInfo(), DRE->getType(), DRE->getValueKind(),
18250 DRE->getFoundDecl(), CopiedTemplateArgs(DRE), NOUR);
18251 }
18252
18253 case Expr::FunctionParmPackExprClass: {
18254 auto *FPPE = cast<FunctionParmPackExpr>(E);
18255 // If any of the declarations in the pack is odr-used, then the expression
18256 // as a whole constitutes an odr-use.
18257 for (VarDecl *D : *FPPE)
18258 if (IsPotentialResultOdrUsed(D))
18259 return ExprEmpty();
18260
18261 // FIXME: Rebuild as a non-odr-use FunctionParmPackExpr? In practice,
18262 // nothing cares about whether we marked this as an odr-use, but it might
18263 // be useful for non-compiler tools.
18264 MarkNotOdrUsed();
18265 break;
18266 }
18267
18268 // -- If e is a subscripting operation with an array operand...
18269 case Expr::ArraySubscriptExprClass: {
18270 auto *ASE = cast<ArraySubscriptExpr>(E);
18271 Expr *OldBase = ASE->getBase()->IgnoreImplicit();
18272 if (!OldBase->getType()->isArrayType())
18273 break;
18274 ExprResult Base = Rebuild(OldBase);
18275 if (!Base.isUsable())
18276 return Base;
18277 Expr *LHS = ASE->getBase() == ASE->getLHS() ? Base.get() : ASE->getLHS();
18278 Expr *RHS = ASE->getBase() == ASE->getRHS() ? Base.get() : ASE->getRHS();
18279 SourceLocation LBracketLoc = ASE->getBeginLoc(); // FIXME: Not stored.
18280 return S.ActOnArraySubscriptExpr(nullptr, LHS, LBracketLoc, RHS,
18281 ASE->getRBracketLoc());
18282 }
18283
18284 case Expr::MemberExprClass: {
18285 auto *ME = cast<MemberExpr>(E);
18286 // -- If e is a class member access expression [...] naming a non-static
18287 // data member...
18288 if (isa<FieldDecl>(ME->getMemberDecl())) {
18289 ExprResult Base = Rebuild(ME->getBase());
18290 if (!Base.isUsable())
18291 return Base;
18292 return MemberExpr::Create(
18293 S.Context, Base.get(), ME->isArrow(), ME->getOperatorLoc(),
18294 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(),
18295 ME->getMemberDecl(), ME->getFoundDecl(), ME->getMemberNameInfo(),
18296 CopiedTemplateArgs(ME), ME->getType(), ME->getValueKind(),
18297 ME->getObjectKind(), ME->isNonOdrUse());
18298 }
18299
18300 if (ME->getMemberDecl()->isCXXInstanceMember())
18301 break;
18302
18303 // -- If e is a class member access expression naming a static data member,
18304 // ...
18305 if (ME->isNonOdrUse() || IsPotentialResultOdrUsed(ME->getMemberDecl()))
18306 break;
18307
18308 // Rebuild as a non-odr-use MemberExpr.
18309 MarkNotOdrUsed();
18310 return MemberExpr::Create(
18311 S.Context, ME->getBase(), ME->isArrow(), ME->getOperatorLoc(),
18312 ME->getQualifierLoc(), ME->getTemplateKeywordLoc(), ME->getMemberDecl(),
18313 ME->getFoundDecl(), ME->getMemberNameInfo(), CopiedTemplateArgs(ME),
18314 ME->getType(), ME->getValueKind(), ME->getObjectKind(), NOUR);
18315 }
18316
18317 case Expr::BinaryOperatorClass: {
18318 auto *BO = cast<BinaryOperator>(E);
18319 Expr *LHS = BO->getLHS();
18320 Expr *RHS = BO->getRHS();
18321 // -- If e is a pointer-to-member expression of the form e1 .* e2 ...
18322 if (BO->getOpcode() == BO_PtrMemD) {
18323 ExprResult Sub = Rebuild(LHS);
18324 if (!Sub.isUsable())
18325 return Sub;
18326 LHS = Sub.get();
18327 // -- If e is a comma expression, ...
18328 } else if (BO->getOpcode() == BO_Comma) {
18329 ExprResult Sub = Rebuild(RHS);
18330 if (!Sub.isUsable())
18331 return Sub;
18332 RHS = Sub.get();
18333 } else {
18334 break;
18335 }
18336 return S.BuildBinOp(nullptr, BO->getOperatorLoc(), BO->getOpcode(),
18337 LHS, RHS);
18338 }
18339
18340 // -- If e has the form (e1)...
18341 case Expr::ParenExprClass: {
18342 auto *PE = cast<ParenExpr>(E);
18343 ExprResult Sub = Rebuild(PE->getSubExpr());
18344 if (!Sub.isUsable())
18345 return Sub;
18346 return S.ActOnParenExpr(PE->getLParen(), PE->getRParen(), Sub.get());
18347 }
18348
18349 // -- If e is a glvalue conditional expression, ...
18350 // We don't apply this to a binary conditional operator. FIXME: Should we?
18351 case Expr::ConditionalOperatorClass: {
18352 auto *CO = cast<ConditionalOperator>(E);
18353 ExprResult LHS = Rebuild(CO->getLHS());
18354 if (LHS.isInvalid())
18355 return ExprError();
18356 ExprResult RHS = Rebuild(CO->getRHS());
18357 if (RHS.isInvalid())
18358 return ExprError();
18359 if (!LHS.isUsable() && !RHS.isUsable())
18360 return ExprEmpty();
18361 if (!LHS.isUsable())
18362 LHS = CO->getLHS();
18363 if (!RHS.isUsable())
18364 RHS = CO->getRHS();
18365 return S.ActOnConditionalOp(CO->getQuestionLoc(), CO->getColonLoc(),
18366 CO->getCond(), LHS.get(), RHS.get());
18367 }
18368
18369 // [Clang extension]
18370 // -- If e has the form __extension__ e1...
18371 case Expr::UnaryOperatorClass: {
18372 auto *UO = cast<UnaryOperator>(E);
18373 if (UO->getOpcode() != UO_Extension)
18374 break;
18375 ExprResult Sub = Rebuild(UO->getSubExpr());
18376 if (!Sub.isUsable())
18377 return Sub;
18378 return S.BuildUnaryOp(nullptr, UO->getOperatorLoc(), UO_Extension,
18379 Sub.get());
18380 }
18381
18382 // [Clang extension]
18383 // -- If e has the form _Generic(...), the set of potential results is the
18384 // union of the sets of potential results of the associated expressions.
18385 case Expr::GenericSelectionExprClass: {
18386 auto *GSE = cast<GenericSelectionExpr>(E);
18387
18388 SmallVector<Expr *, 4> AssocExprs;
18389 bool AnyChanged = false;
18390 for (Expr *OrigAssocExpr : GSE->getAssocExprs()) {
18391 ExprResult AssocExpr = Rebuild(OrigAssocExpr);
18392 if (AssocExpr.isInvalid())
18393 return ExprError();
18394 if (AssocExpr.isUsable()) {
18395 AssocExprs.push_back(AssocExpr.get());
18396 AnyChanged = true;
18397 } else {
18398 AssocExprs.push_back(OrigAssocExpr);
18399 }
18400 }
18401
18402 return AnyChanged ? S.CreateGenericSelectionExpr(
18403 GSE->getGenericLoc(), GSE->getDefaultLoc(),
18404 GSE->getRParenLoc(), GSE->getControllingExpr(),
18405 GSE->getAssocTypeSourceInfos(), AssocExprs)
18406 : ExprEmpty();
18407 }
18408
18409 // [Clang extension]
18410 // -- If e has the form __builtin_choose_expr(...), the set of potential
18411 // results is the union of the sets of potential results of the
18412 // second and third subexpressions.
18413 case Expr::ChooseExprClass: {
18414 auto *CE = cast<ChooseExpr>(E);
18415
18416 ExprResult LHS = Rebuild(CE->getLHS());
18417 if (LHS.isInvalid())
18418 return ExprError();
18419
18420 ExprResult RHS = Rebuild(CE->getLHS());
18421 if (RHS.isInvalid())
18422 return ExprError();
18423
18424 if (!LHS.get() && !RHS.get())
18425 return ExprEmpty();
18426 if (!LHS.isUsable())
18427 LHS = CE->getLHS();
18428 if (!RHS.isUsable())
18429 RHS = CE->getRHS();
18430
18431 return S.ActOnChooseExpr(CE->getBuiltinLoc(), CE->getCond(), LHS.get(),
18432 RHS.get(), CE->getRParenLoc());
18433 }
18434
18435 // Step through non-syntactic nodes.
18436 case Expr::ConstantExprClass: {
18437 auto *CE = cast<ConstantExpr>(E);
18438 ExprResult Sub = Rebuild(CE->getSubExpr());
18439 if (!Sub.isUsable())
18440 return Sub;
18441 return ConstantExpr::Create(S.Context, Sub.get());
18442 }
18443
18444 // We could mostly rely on the recursive rebuilding to rebuild implicit
18445 // casts, but not at the top level, so rebuild them here.
18446 case Expr::ImplicitCastExprClass: {
18447 auto *ICE = cast<ImplicitCastExpr>(E);
18448 // Only step through the narrow set of cast kinds we expect to encounter.
18449 // Anything else suggests we've left the region in which potential results
18450 // can be found.
18451 switch (ICE->getCastKind()) {
18452 case CK_NoOp:
18453 case CK_DerivedToBase:
18454 case CK_UncheckedDerivedToBase: {
18455 ExprResult Sub = Rebuild(ICE->getSubExpr());
18456 if (!Sub.isUsable())
18457 return Sub;
18458 CXXCastPath Path(ICE->path());
18459 return S.ImpCastExprToType(Sub.get(), ICE->getType(), ICE->getCastKind(),
18460 ICE->getValueKind(), &Path);
18461 }
18462
18463 default:
18464 break;
18465 }
18466 break;
18467 }
18468
18469 default:
18470 break;
18471 }
18472
18473 // Can't traverse through this node. Nothing to do.
18474 return ExprEmpty();
18475}
18476
18477ExprResult Sema::CheckLValueToRValueConversionOperand(Expr *E) {
18478 // Check whether the operand is or contains an object of non-trivial C union
18479 // type.
18480 if (E->getType().isVolatileQualified() &&
18481 (E->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
18482 E->getType().hasNonTrivialToPrimitiveCopyCUnion()))
18483 checkNonTrivialCUnion(E->getType(), E->getExprLoc(),
18484 Sema::NTCUC_LValueToRValueVolatile,
18485 NTCUK_Destruct|NTCUK_Copy);
18486
18487 // C++2a [basic.def.odr]p4:
18488 // [...] an expression of non-volatile-qualified non-class type to which
18489 // the lvalue-to-rvalue conversion is applied [...]
18490 if (E->getType().isVolatileQualified() || E->getType()->getAs<RecordType>())
18491 return E;
18492
18493 ExprResult Result =
18494 rebuildPotentialResultsAsNonOdrUsed(*this, E, NOUR_Constant);
18495 if (Result.isInvalid())
18496 return ExprError();
18497 return Result.get() ? Result : E;
18498}
18499
18500ExprResult Sema::ActOnConstantExpression(ExprResult Res) {
18501 Res = CorrectDelayedTyposInExpr(Res);
18502
18503 if (!Res.isUsable())
18504 return Res;
18505
18506 // If a constant-expression is a reference to a variable where we delay
18507 // deciding whether it is an odr-use, just assume we will apply the
18508 // lvalue-to-rvalue conversion. In the one case where this doesn't happen
18509 // (a non-type template argument), we have special handling anyway.
18510 return CheckLValueToRValueConversionOperand(Res.get());
18511}
18512
18513void Sema::CleanupVarDeclMarking() {
18514 // Iterate through a local copy in case MarkVarDeclODRUsed makes a recursive
18515 // call.
18516 MaybeODRUseExprSet LocalMaybeODRUseExprs;
18517 std::swap(LocalMaybeODRUseExprs, MaybeODRUseExprs);
18518
18519 for (Expr *E : LocalMaybeODRUseExprs) {
18520 if (auto *DRE = dyn_cast<DeclRefExpr>(E)) {
18521 MarkVarDeclODRUsed(cast<VarDecl>(DRE->getDecl()),
18522 DRE->getLocation(), *this);
18523 } else if (auto *ME = dyn_cast<MemberExpr>(E)) {
18524 MarkVarDeclODRUsed(cast<VarDecl>(ME->getMemberDecl()), ME->getMemberLoc(),
18525 *this);
18526 } else if (auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
18527 for (VarDecl *VD : *FP)
18528 MarkVarDeclODRUsed(VD, FP->getParameterPackLocation(), *this);
18529 } else {
18530 llvm_unreachable("Unexpected expression")__builtin_unreachable();
18531 }
18532 }
18533
18534 assert(MaybeODRUseExprs.empty() &&(static_cast<void> (0))
18535 "MarkVarDeclODRUsed failed to cleanup MaybeODRUseExprs?")(static_cast<void> (0));
18536}
18537
18538static void DoMarkVarDeclReferenced(
18539 Sema &SemaRef, SourceLocation Loc, VarDecl *Var, Expr *E,
18540 llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) {
18541 assert((!E || isa<DeclRefExpr>(E) || isa<MemberExpr>(E) ||(static_cast<void> (0))
18542 isa<FunctionParmPackExpr>(E)) &&(static_cast<void> (0))
18543 "Invalid Expr argument to DoMarkVarDeclReferenced")(static_cast<void> (0));
18544 Var->setReferenced();
18545
18546 if (Var->isInvalidDecl())
18547 return;
18548
18549 auto *MSI = Var->getMemberSpecializationInfo();
18550 TemplateSpecializationKind TSK = MSI ? MSI->getTemplateSpecializationKind()
18551 : Var->getTemplateSpecializationKind();
18552
18553 OdrUseContext OdrUse = isOdrUseContext(SemaRef);
18554 bool UsableInConstantExpr =
18555 Var->mightBeUsableInConstantExpressions(SemaRef.Context);
18556
18557 if (Var->isLocalVarDeclOrParm() && !Var->hasExternalStorage()) {
18558 RefsMinusAssignments.insert({Var, 0}).first->getSecond()++;
18559 }
18560
18561 // C++20 [expr.const]p12:
18562 // A variable [...] is needed for constant evaluation if it is [...] a
18563 // variable whose name appears as a potentially constant evaluated
18564 // expression that is either a contexpr variable or is of non-volatile
18565 // const-qualified integral type or of reference type
18566 bool NeededForConstantEvaluation =
18567 isPotentiallyConstantEvaluatedContext(SemaRef) && UsableInConstantExpr;
18568
18569 bool NeedDefinition =
18570 OdrUse == OdrUseContext::Used || NeededForConstantEvaluation;
18571
18572 assert(!isa<VarTemplatePartialSpecializationDecl>(Var) &&(static_cast<void> (0))
18573 "Can't instantiate a partial template specialization.")(static_cast<void> (0));
18574
18575 // If this might be a member specialization of a static data member, check
18576 // the specialization is visible. We already did the checks for variable
18577 // template specializations when we created them.
18578 if (NeedDefinition && TSK != TSK_Undeclared &&
18579 !isa<VarTemplateSpecializationDecl>(Var))
18580 SemaRef.checkSpecializationVisibility(Loc, Var);
18581
18582 // Perform implicit instantiation of static data members, static data member
18583 // templates of class templates, and variable template specializations. Delay
18584 // instantiations of variable templates, except for those that could be used
18585 // in a constant expression.
18586 if (NeedDefinition && isTemplateInstantiation(TSK)) {
18587 // Per C++17 [temp.explicit]p10, we may instantiate despite an explicit
18588 // instantiation declaration if a variable is usable in a constant
18589 // expression (among other cases).
18590 bool TryInstantiating =
18591 TSK == TSK_ImplicitInstantiation ||
18592 (TSK == TSK_ExplicitInstantiationDeclaration && UsableInConstantExpr);
18593
18594 if (TryInstantiating) {
18595 SourceLocation PointOfInstantiation =
18596 MSI ? MSI->getPointOfInstantiation() : Var->getPointOfInstantiation();
18597 bool FirstInstantiation = PointOfInstantiation.isInvalid();
18598 if (FirstInstantiation) {
18599 PointOfInstantiation = Loc;
18600 if (MSI)
18601 MSI->setPointOfInstantiation(PointOfInstantiation);
18602 // FIXME: Notify listener.
18603 else
18604 Var->setTemplateSpecializationKind(TSK, PointOfInstantiation);
18605 }
18606
18607 if (UsableInConstantExpr) {
18608 // Do not defer instantiations of variables that could be used in a
18609 // constant expression.
18610 SemaRef.runWithSufficientStackSpace(PointOfInstantiation, [&] {
18611 SemaRef.InstantiateVariableDefinition(PointOfInstantiation, Var);
18612 });
18613
18614 // Re-set the member to trigger a recomputation of the dependence bits
18615 // for the expression.
18616 if (auto *DRE = dyn_cast_or_null<DeclRefExpr>(E))
18617 DRE->setDecl(DRE->getDecl());
18618 else if (auto *ME = dyn_cast_or_null<MemberExpr>(E))
18619 ME->setMemberDecl(ME->getMemberDecl());
18620 } else if (FirstInstantiation ||
18621 isa<VarTemplateSpecializationDecl>(Var)) {
18622 // FIXME: For a specialization of a variable template, we don't
18623 // distinguish between "declaration and type implicitly instantiated"
18624 // and "implicit instantiation of definition requested", so we have
18625 // no direct way to avoid enqueueing the pending instantiation
18626 // multiple times.
18627 SemaRef.PendingInstantiations
18628 .push_back(std::make_pair(Var, PointOfInstantiation));
18629 }
18630 }
18631 }
18632
18633 // C++2a [basic.def.odr]p4:
18634 // A variable x whose name appears as a potentially-evaluated expression e
18635 // is odr-used by e unless
18636 // -- x is a reference that is usable in constant expressions
18637 // -- x is a variable of non-reference type that is usable in constant
18638 // expressions and has no mutable subobjects [FIXME], and e is an
18639 // element of the set of potential results of an expression of
18640 // non-volatile-qualified non-class type to which the lvalue-to-rvalue
18641 // conversion is applied
18642 // -- x is a variable of non-reference type, and e is an element of the set
18643 // of potential results of a discarded-value expression to which the
18644 // lvalue-to-rvalue conversion is not applied [FIXME]
18645 //
18646 // We check the first part of the second bullet here, and
18647 // Sema::CheckLValueToRValueConversionOperand deals with the second part.
18648 // FIXME: To get the third bullet right, we need to delay this even for
18649 // variables that are not usable in constant expressions.
18650
18651 // If we already know this isn't an odr-use, there's nothing more to do.
18652 if (DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(E))
18653 if (DRE->isNonOdrUse())
18654 return;
18655 if (MemberExpr *ME = dyn_cast_or_null<MemberExpr>(E))
18656 if (ME->isNonOdrUse())
18657 return;
18658
18659 switch (OdrUse) {
18660 case OdrUseContext::None:
18661 assert((!E || isa<FunctionParmPackExpr>(E)) &&(static_cast<void> (0))
18662 "missing non-odr-use marking for unevaluated decl ref")(static_cast<void> (0));
18663 break;
18664
18665 case OdrUseContext::FormallyOdrUsed:
18666 // FIXME: Ignoring formal odr-uses results in incorrect lambda capture
18667 // behavior.
18668 break;
18669
18670 case OdrUseContext::Used:
18671 // If we might later find that this expression isn't actually an odr-use,
18672 // delay the marking.
18673 if (E && Var->isUsableInConstantExpressions(SemaRef.Context))
18674 SemaRef.MaybeODRUseExprs.insert(E);
18675 else
18676 MarkVarDeclODRUsed(Var, Loc, SemaRef);
18677 break;
18678
18679 case OdrUseContext::Dependent:
18680 // If this is a dependent context, we don't need to mark variables as
18681 // odr-used, but we may still need to track them for lambda capture.
18682 // FIXME: Do we also need to do this inside dependent typeid expressions
18683 // (which are modeled as unevaluated at this point)?
18684 const bool RefersToEnclosingScope =
18685 (SemaRef.CurContext != Var->getDeclContext() &&
18686 Var->getDeclContext()->isFunctionOrMethod() && Var->hasLocalStorage());
18687 if (RefersToEnclosingScope) {
18688 LambdaScopeInfo *const LSI =
18689 SemaRef.getCurLambda(/*IgnoreNonLambdaCapturingScope=*/true);
18690 if (LSI && (!LSI->CallOperator ||
18691 !LSI->CallOperator->Encloses(Var->getDeclContext()))) {
18692 // If a variable could potentially be odr-used, defer marking it so
18693 // until we finish analyzing the full expression for any
18694 // lvalue-to-rvalue
18695 // or discarded value conversions that would obviate odr-use.
18696 // Add it to the list of potential captures that will be analyzed
18697 // later (ActOnFinishFullExpr) for eventual capture and odr-use marking
18698 // unless the variable is a reference that was initialized by a constant
18699 // expression (this will never need to be captured or odr-used).
18700 //
18701 // FIXME: We can simplify this a lot after implementing P0588R1.
18702 assert(E && "Capture variable should be used in an expression.")(static_cast<void> (0));
18703 if (!Var->getType()->isReferenceType() ||
18704 !Var->isUsableInConstantExpressions(SemaRef.Context))
18705 LSI->addPotentialCapture(E->IgnoreParens());
18706 }
18707 }
18708 break;
18709 }
18710}
18711
18712/// Mark a variable referenced, and check whether it is odr-used
18713/// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
18714/// used directly for normal expressions referring to VarDecl.
18715void Sema::MarkVariableReferenced(SourceLocation Loc, VarDecl *Var) {
18716 DoMarkVarDeclReferenced(*this, Loc, Var, nullptr, RefsMinusAssignments);
18717}
18718
18719static void
18720MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, Decl *D, Expr *E,
18721 bool MightBeOdrUse,
18722 llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) {
18723 if (SemaRef.isInOpenMPDeclareTargetContext())
18724 SemaRef.checkDeclIsAllowedInOpenMPTarget(E, D);
18725
18726 if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
18727 DoMarkVarDeclReferenced(SemaRef, Loc, Var, E, RefsMinusAssignments);
18728 return;
18729 }
18730
18731 SemaRef.MarkAnyDeclReferenced(Loc, D, MightBeOdrUse);
18732
18733 // If this is a call to a method via a cast, also mark the method in the
18734 // derived class used in case codegen can devirtualize the call.
18735 const MemberExpr *ME = dyn_cast<MemberExpr>(E);
18736 if (!ME)
18737 return;
18738 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ME->getMemberDecl());
18739 if (!MD)
18740 return;
18741 // Only attempt to devirtualize if this is truly a virtual call.
18742 bool IsVirtualCall = MD->isVirtual() &&
18743 ME->performsVirtualDispatch(SemaRef.getLangOpts());
18744 if (!IsVirtualCall)
18745 return;
18746
18747 // If it's possible to devirtualize the call, mark the called function
18748 // referenced.
18749 CXXMethodDecl *DM = MD->getDevirtualizedMethod(
18750 ME->getBase(), SemaRef.getLangOpts().AppleKext);
18751 if (DM)
18752 SemaRef.MarkAnyDeclReferenced(Loc, DM, MightBeOdrUse);
18753}
18754
18755/// Perform reference-marking and odr-use handling for a DeclRefExpr.
18756///
18757/// Note, this may change the dependence of the DeclRefExpr, and so needs to be
18758/// handled with care if the DeclRefExpr is not newly-created.
18759void Sema::MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base) {
18760 // TODO: update this with DR# once a defect report is filed.
18761 // C++11 defect. The address of a pure member should not be an ODR use, even
18762 // if it's a qualified reference.
18763 bool OdrUse = true;
18764 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(E->getDecl()))
18765 if (Method->isVirtual() &&
18766 !Method->getDevirtualizedMethod(Base, getLangOpts().AppleKext))
18767 OdrUse = false;
18768
18769 if (auto *FD = dyn_cast<FunctionDecl>(E->getDecl()))
18770 if (!isUnevaluatedContext() && !isConstantEvaluated() &&
18771 FD->isConsteval() && !RebuildingImmediateInvocation)
18772 ExprEvalContexts.back().ReferenceToConsteval.insert(E);
18773 MarkExprReferenced(*this, E->getLocation(), E->getDecl(), E, OdrUse,
18774 RefsMinusAssignments);
18775}
18776
18777/// Perform reference-marking and odr-use handling for a MemberExpr.
18778void Sema::MarkMemberReferenced(MemberExpr *E) {
18779 // C++11 [basic.def.odr]p2:
18780 // A non-overloaded function whose name appears as a potentially-evaluated
18781 // expression or a member of a set of candidate functions, if selected by
18782 // overload resolution when referred to from a potentially-evaluated
18783 // expression, is odr-used, unless it is a pure virtual function and its
18784 // name is not explicitly qualified.
18785 bool MightBeOdrUse = true;
18786 if (E->performsVirtualDispatch(getLangOpts())) {
18787 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(E->getMemberDecl()))
18788 if (Method->isPure())
18789 MightBeOdrUse = false;
18790 }
18791 SourceLocation Loc =
18792 E->getMemberLoc().isValid() ? E->getMemberLoc() : E->getBeginLoc();
18793 MarkExprReferenced(*this, Loc, E->getMemberDecl(), E, MightBeOdrUse,
18794 RefsMinusAssignments);
18795}
18796
18797/// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
18798void Sema::MarkFunctionParmPackReferenced(FunctionParmPackExpr *E) {
18799 for (VarDecl *VD : *E)
18800 MarkExprReferenced(*this, E->getParameterPackLocation(), VD, E, true,
18801 RefsMinusAssignments);
18802}
18803
18804/// Perform marking for a reference to an arbitrary declaration. It
18805/// marks the declaration referenced, and performs odr-use checking for
18806/// functions and variables. This method should not be used when building a
18807/// normal expression which refers to a variable.
18808void Sema::MarkAnyDeclReferenced(SourceLocation Loc, Decl *D,
18809 bool MightBeOdrUse) {
18810 if (MightBeOdrUse) {
18811 if (auto *VD = dyn_cast<VarDecl>(D)) {
18812 MarkVariableReferenced(Loc, VD);
18813 return;
18814 }
18815 }
18816 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
18817 MarkFunctionReferenced(Loc, FD, MightBeOdrUse);
18818 return;
18819 }
18820 D->setReferenced();
18821}
18822
18823namespace {
18824 // Mark all of the declarations used by a type as referenced.
18825 // FIXME: Not fully implemented yet! We need to have a better understanding
18826 // of when we're entering a context we should not recurse into.
18827 // FIXME: This is and EvaluatedExprMarker are more-or-less equivalent to
18828 // TreeTransforms rebuilding the type in a new context. Rather than
18829 // duplicating the TreeTransform logic, we should consider reusing it here.
18830 // Currently that causes problems when rebuilding LambdaExprs.
18831 class MarkReferencedDecls : public RecursiveASTVisitor<MarkReferencedDecls> {
18832 Sema &S;
18833 SourceLocation Loc;
18834
18835 public:
18836 typedef RecursiveASTVisitor<MarkReferencedDecls> Inherited;
18837
18838 MarkReferencedDecls(Sema &S, SourceLocation Loc) : S(S), Loc(Loc) { }
18839
18840 bool TraverseTemplateArgument(const TemplateArgument &Arg);
18841 };
18842}
18843
18844bool MarkReferencedDecls::TraverseTemplateArgument(
18845 const TemplateArgument &Arg) {
18846 {
18847 // A non-type template argument is a constant-evaluated context.
18848 EnterExpressionEvaluationContext Evaluated(
18849 S, Sema::ExpressionEvaluationContext::ConstantEvaluated);
18850 if (Arg.getKind() == TemplateArgument::Declaration) {
18851 if (Decl *D = Arg.getAsDecl())
18852 S.MarkAnyDeclReferenced(Loc, D, true);
18853 } else if (Arg.getKind() == TemplateArgument::Expression) {
18854 S.MarkDeclarationsReferencedInExpr(Arg.getAsExpr(), false);
18855 }
18856 }
18857
18858 return Inherited::TraverseTemplateArgument(Arg);
18859}
18860
18861void Sema::MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T) {
18862 MarkReferencedDecls Marker(*this, Loc);
18863 Marker.TraverseType(T);
18864}
18865
18866namespace {
18867/// Helper class that marks all of the declarations referenced by
18868/// potentially-evaluated subexpressions as "referenced".
18869class EvaluatedExprMarker : public UsedDeclVisitor<EvaluatedExprMarker> {
18870public:
18871 typedef UsedDeclVisitor<EvaluatedExprMarker> Inherited;
18872 bool SkipLocalVariables;
18873
18874 EvaluatedExprMarker(Sema &S, bool SkipLocalVariables)
18875 : Inherited(S), SkipLocalVariables(SkipLocalVariables) {}
18876
18877 void visitUsedDecl(SourceLocation Loc, Decl *D) {
18878 S.MarkFunctionReferenced(Loc, cast<FunctionDecl>(D));
18879 }
18880
18881 void VisitDeclRefExpr(DeclRefExpr *E) {
18882 // If we were asked not to visit local variables, don't.
18883 if (SkipLocalVariables) {
18884 if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()))
18885 if (VD->hasLocalStorage())
18886 return;
18887 }
18888
18889 // FIXME: This can trigger the instantiation of the initializer of a
18890 // variable, which can cause the expression to become value-dependent
18891 // or error-dependent. Do we need to propagate the new dependence bits?
18892 S.MarkDeclRefReferenced(E);
18893 }
18894
18895 void VisitMemberExpr(MemberExpr *E) {
18896 S.MarkMemberReferenced(E);
18897 Visit(E->getBase());
18898 }
18899};
18900} // namespace
18901
18902/// Mark any declarations that appear within this expression or any
18903/// potentially-evaluated subexpressions as "referenced".
18904///
18905/// \param SkipLocalVariables If true, don't mark local variables as
18906/// 'referenced'.
18907void Sema::MarkDeclarationsReferencedInExpr(Expr *E,
18908 bool SkipLocalVariables) {
18909 EvaluatedExprMarker(*this, SkipLocalVariables).Visit(E);
18910}
18911
18912/// Emit a diagnostic that describes an effect on the run-time behavior
18913/// of the program being compiled.
18914///
18915/// This routine emits the given diagnostic when the code currently being
18916/// type-checked is "potentially evaluated", meaning that there is a
18917/// possibility that the code will actually be executable. Code in sizeof()
18918/// expressions, code used only during overload resolution, etc., are not
18919/// potentially evaluated. This routine will suppress such diagnostics or,
18920/// in the absolutely nutty case of potentially potentially evaluated
18921/// expressions (C++ typeid), queue the diagnostic to potentially emit it
18922/// later.
18923///
18924/// This routine should be used for all diagnostics that describe the run-time
18925/// behavior of a program, such as passing a non-POD value through an ellipsis.
18926/// Failure to do so will likely result in spurious diagnostics or failures
18927/// during overload resolution or within sizeof/alignof/typeof/typeid.
18928bool Sema::DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt*> Stmts,
18929 const PartialDiagnostic &PD) {
18930 switch (ExprEvalContexts.back().Context) {
18931 case ExpressionEvaluationContext::Unevaluated:
18932 case ExpressionEvaluationContext::UnevaluatedList:
18933 case ExpressionEvaluationContext::UnevaluatedAbstract:
18934 case ExpressionEvaluationContext::DiscardedStatement:
18935 // The argument will never be evaluated, so don't complain.
18936 break;
18937
18938 case ExpressionEvaluationContext::ConstantEvaluated:
18939 // Relevant diagnostics should be produced by constant evaluation.
18940 break;
18941
18942 case ExpressionEvaluationContext::PotentiallyEvaluated:
18943 case ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed:
18944 if (!Stmts.empty() && getCurFunctionOrMethodDecl()) {
18945 FunctionScopes.back()->PossiblyUnreachableDiags.
18946 push_back(sema::PossiblyUnreachableDiag(PD, Loc, Stmts));
18947 return true;
18948 }
18949
18950 // The initializer of a constexpr variable or of the first declaration of a
18951 // static data member is not syntactically a constant evaluated constant,
18952 // but nonetheless is always required to be a constant expression, so we
18953 // can skip diagnosing.
18954 // FIXME: Using the mangling context here is a hack.
18955 if (auto *VD = dyn_cast_or_null<VarDecl>(
18956 ExprEvalContexts.back().ManglingContextDecl)) {
18957 if (VD->isConstexpr() ||
18958 (VD->isStaticDataMember() && VD->isFirstDecl() && !VD->isInline()))
18959 break;
18960 // FIXME: For any other kind of variable, we should build a CFG for its
18961 // initializer and check whether the context in question is reachable.
18962 }
18963
18964 Diag(Loc, PD);
18965 return true;
18966 }
18967
18968 return false;
18969}
18970
18971bool Sema::DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
18972 const PartialDiagnostic &PD) {
18973 return DiagRuntimeBehavior(
18974 Loc, Statement ? llvm::makeArrayRef(Statement) : llvm::None, PD);
18975}
18976
18977bool Sema::CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
18978 CallExpr *CE, FunctionDecl *FD) {
18979 if (ReturnType->isVoidType() || !ReturnType->isIncompleteType())
18980 return false;
18981
18982 // If we're inside a decltype's expression, don't check for a valid return
18983 // type or construct temporaries until we know whether this is the last call.
18984 if (ExprEvalContexts.back().ExprContext ==
18985 ExpressionEvaluationContextRecord::EK_Decltype) {
18986 ExprEvalContexts.back().DelayedDecltypeCalls.push_back(CE);
18987 return false;
18988 }
18989
18990 class CallReturnIncompleteDiagnoser : public TypeDiagnoser {
18991 FunctionDecl *FD;
18992 CallExpr *CE;
18993
18994 public:
18995 CallReturnIncompleteDiagnoser(FunctionDecl *FD, CallExpr *CE)
18996 : FD(FD), CE(CE) { }
18997
18998 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
18999 if (!FD) {
19000 S.Diag(Loc, diag::err_call_incomplete_return)
19001 << T << CE->getSourceRange();
19002 return;
19003 }
19004
19005 S.Diag(Loc, diag::err_call_function_incomplete_return)
19006 << CE->getSourceRange() << FD << T;
19007 S.Diag(FD->getLocation(), diag::note_entity_declared_at)
19008 << FD->getDeclName();
19009 }
19010 } Diagnoser(FD, CE);
19011
19012 if (RequireCompleteType(Loc, ReturnType, Diagnoser))
19013 return true;
19014
19015 return false;
19016}
19017
19018// Diagnose the s/=/==/ and s/\|=/!=/ typos. Note that adding parentheses
19019// will prevent this condition from triggering, which is what we want.
19020void Sema::DiagnoseAssignmentAsCondition(Expr *E) {
19021 SourceLocation Loc;
19022
19023 unsigned diagnostic = diag::warn_condition_is_assignment;
19024 bool IsOrAssign = false;
19025
19026 if (BinaryOperator *Op = dyn_cast<BinaryOperator>(E)) {
19027 if (Op->getOpcode() != BO_Assign && Op->getOpcode() != BO_OrAssign)
19028 return;
19029
19030 IsOrAssign = Op->getOpcode() == BO_OrAssign;
19031
19032 // Greylist some idioms by putting them into a warning subcategory.
19033 if (ObjCMessageExpr *ME
19034 = dyn_cast<ObjCMessageExpr>(Op->getRHS()->IgnoreParenCasts())) {
19035 Selector Sel = ME->getSelector();
19036
19037 // self = [<foo> init...]
19038 if (isSelfExpr(Op->getLHS()) && ME->getMethodFamily() == OMF_init)
19039 diagnostic = diag::warn_condition_is_idiomatic_assignment;
19040
19041 // <foo> = [<bar> nextObject]
19042 else if (Sel.isUnarySelector() && Sel.getNameForSlot(0) == "nextObject")
19043 diagnostic = diag::warn_condition_is_idiomatic_assignment;
19044 }
19045
19046 Loc = Op->getOperatorLoc();
19047 } else if (CXXOperatorCallExpr *Op = dyn_cast<CXXOperatorCallExpr>(E)) {
19048 if (Op->getOperator() != OO_Equal && Op->getOperator() != OO_PipeEqual)
19049 return;
19050
19051 IsOrAssign = Op->getOperator() == OO_PipeEqual;
19052 Loc = Op->getOperatorLoc();
19053 } else if (PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
19054 return DiagnoseAssignmentAsCondition(POE->getSyntacticForm());
19055 else {
19056 // Not an assignment.
19057 return;
19058 }
19059
19060 Diag(Loc, diagnostic) << E->getSourceRange();
19061
19062 SourceLocation Open = E->getBeginLoc();
19063 SourceLocation Close = getLocForEndOfToken(E->getSourceRange().getEnd());
19064 Diag(Loc, diag::note_condition_assign_silence)
19065 << FixItHint::CreateInsertion(Open, "(")
19066 << FixItHint::CreateInsertion(Close, ")");
19067
19068 if (IsOrAssign)
19069 Diag(Loc, diag::note_condition_or_assign_to_comparison)
19070 << FixItHint::CreateReplacement(Loc, "!=");
19071 else
19072 Diag(Loc, diag::note_condition_assign_to_comparison)
19073 << FixItHint::CreateReplacement(Loc, "==");
19074}
19075
19076/// Redundant parentheses over an equality comparison can indicate
19077/// that the user intended an assignment used as condition.
19078void Sema::DiagnoseEqualityWithExtraParens(ParenExpr *ParenE) {
19079 // Don't warn if the parens came from a macro.
19080 SourceLocation parenLoc = ParenE->getBeginLoc();
19081 if (parenLoc.isInvalid() || parenLoc.isMacroID())
19082 return;
19083 // Don't warn for dependent expressions.
19084 if (ParenE->isTypeDependent())
19085 return;
19086
19087 Expr *E = ParenE->IgnoreParens();
19088
19089 if (BinaryOperator *opE = dyn_cast<BinaryOperator>(E))
19090 if (opE->getOpcode() == BO_EQ &&
19091 opE->getLHS()->IgnoreParenImpCasts()->isModifiableLvalue(Context)
19092 == Expr::MLV_Valid) {
19093 SourceLocation Loc = opE->getOperatorLoc();
19094
19095 Diag(Loc, diag::warn_equality_with_extra_parens) << E->getSourceRange();
19096 SourceRange ParenERange = ParenE->getSourceRange();
19097 Diag(Loc, diag::note_equality_comparison_silence)
19098 << FixItHint::CreateRemoval(ParenERange.getBegin())
19099 << FixItHint::CreateRemoval(ParenERange.getEnd());
19100 Diag(Loc, diag::note_equality_comparison_to_assign)
19101 << FixItHint::CreateReplacement(Loc, "=");
19102 }
19103}
19104
19105ExprResult Sema::CheckBooleanCondition(SourceLocation Loc, Expr *E,
19106 bool IsConstexpr) {
19107 DiagnoseAssignmentAsCondition(E);
19108 if (ParenExpr *parenE = dyn_cast<ParenExpr>(E))
19109 DiagnoseEqualityWithExtraParens(parenE);
19110
19111 ExprResult result = CheckPlaceholderExpr(E);
19112 if (result.isInvalid()) return ExprError();
19113 E = result.get();
19114
19115 if (!E->isTypeDependent()) {
19116 if (getLangOpts().CPlusPlus)
19117 return CheckCXXBooleanCondition(E, IsConstexpr); // C++ 6.4p4
19118
19119 ExprResult ERes = DefaultFunctionArrayLvalueConversion(E);
19120 if (ERes.isInvalid())
19121 return ExprError();
19122 E = ERes.get();
19123
19124 QualType T = E->getType();
19125 if (!T->isScalarType()) { // C99 6.8.4.1p1
19126 Diag(Loc, diag::err_typecheck_statement_requires_scalar)
19127 << T << E->getSourceRange();
19128 return ExprError();
19129 }
19130 CheckBoolLikeConversion(E, Loc);
19131 }
19132
19133 return E;
19134}
19135
19136Sema::ConditionResult Sema::ActOnCondition(Scope *S, SourceLocation Loc,
19137 Expr *SubExpr, ConditionKind CK) {
19138 // Empty conditions are valid in for-statements.
19139 if (!SubExpr)
19140 return ConditionResult();
19141
19142 ExprResult Cond;
19143 switch (CK) {
19144 case ConditionKind::Boolean:
19145 Cond = CheckBooleanCondition(Loc, SubExpr);
19146 break;
19147
19148 case ConditionKind::ConstexprIf:
19149 Cond = CheckBooleanCondition(Loc, SubExpr, true);
19150 break;
19151
19152 case ConditionKind::Switch:
19153 Cond = CheckSwitchCondition(Loc, SubExpr);
19154 break;
19155 }
19156 if (Cond.isInvalid()) {
19157 Cond = CreateRecoveryExpr(SubExpr->getBeginLoc(), SubExpr->getEndLoc(),
19158 {SubExpr});
19159 if (!Cond.get())
19160 return ConditionError();
19161 }
19162 // FIXME: FullExprArg doesn't have an invalid bit, so check nullness instead.
19163 FullExprArg FullExpr = MakeFullExpr(Cond.get(), Loc);
19164 if (!FullExpr.get())
19165 return ConditionError();
19166
19167 return ConditionResult(*this, nullptr, FullExpr,
19168 CK == ConditionKind::ConstexprIf);
19169}
19170
19171namespace {
19172 /// A visitor for rebuilding a call to an __unknown_any expression
19173 /// to have an appropriate type.
19174 struct RebuildUnknownAnyFunction
19175 : StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {
19176
19177 Sema &S;
19178
19179 RebuildUnknownAnyFunction(Sema &S) : S(S) {}
19180
19181 ExprResult VisitStmt(Stmt *S) {
19182 llvm_unreachable("unexpected statement!")__builtin_unreachable();
19183 }
19184
19185 ExprResult VisitExpr(Expr *E) {
19186 S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_call)
19187 << E->getSourceRange();
19188 return ExprError();
19189 }
19190
19191 /// Rebuild an expression which simply semantically wraps another
19192 /// expression which it shares the type and value kind of.
19193 template <class T> ExprResult rebuildSugarExpr(T *E) {
19194 ExprResult SubResult = Visit(E->getSubExpr());
19195 if (SubResult.isInvalid()) return ExprError();
19196
19197 Expr *SubExpr = SubResult.get();
19198 E->setSubExpr(SubExpr);
19199 E->setType(SubExpr->getType());
19200 E->setValueKind(SubExpr->getValueKind());
19201 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19202 return E;
19203 }
19204
19205 ExprResult VisitParenExpr(ParenExpr *E) {
19206 return rebuildSugarExpr(E);
19207 }
19208
19209 ExprResult VisitUnaryExtension(UnaryOperator *E) {
19210 return rebuildSugarExpr(E);
19211 }
19212
19213 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
19214 ExprResult SubResult = Visit(E->getSubExpr());
19215 if (SubResult.isInvalid()) return ExprError();
19216
19217 Expr *SubExpr = SubResult.get();
19218 E->setSubExpr(SubExpr);
19219 E->setType(S.Context.getPointerType(SubExpr->getType()));
19220 assert(E->isPRValue())(static_cast<void> (0));
19221 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19222 return E;
19223 }
19224
19225 ExprResult resolveDecl(Expr *E, ValueDecl *VD) {
19226 if (!isa<FunctionDecl>(VD)) return VisitExpr(E);
19227
19228 E->setType(VD->getType());
19229
19230 assert(E->isPRValue())(static_cast<void> (0));
19231 if (S.getLangOpts().CPlusPlus &&
19232 !(isa<CXXMethodDecl>(VD) &&
19233 cast<CXXMethodDecl>(VD)->isInstance()))
19234 E->setValueKind(VK_LValue);
19235
19236 return E;
19237 }
19238
19239 ExprResult VisitMemberExpr(MemberExpr *E) {
19240 return resolveDecl(E, E->getMemberDecl());
19241 }
19242
19243 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
19244 return resolveDecl(E, E->getDecl());
19245 }
19246 };
19247}
19248
19249/// Given a function expression of unknown-any type, try to rebuild it
19250/// to have a function type.
19251static ExprResult rebuildUnknownAnyFunction(Sema &S, Expr *FunctionExpr) {
19252 ExprResult Result = RebuildUnknownAnyFunction(S).Visit(FunctionExpr);
19253 if (Result.isInvalid()) return ExprError();
19254 return S.DefaultFunctionArrayConversion(Result.get());
19255}
19256
19257namespace {
19258 /// A visitor for rebuilding an expression of type __unknown_anytype
19259 /// into one which resolves the type directly on the referring
19260 /// expression. Strict preservation of the original source
19261 /// structure is not a goal.
19262 struct RebuildUnknownAnyExpr
19263 : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {
19264
19265 Sema &S;
19266
19267 /// The current destination type.
19268 QualType DestType;
19269
19270 RebuildUnknownAnyExpr(Sema &S, QualType CastType)
19271 : S(S), DestType(CastType) {}
19272
19273 ExprResult VisitStmt(Stmt *S) {
19274 llvm_unreachable("unexpected statement!")__builtin_unreachable();
19275 }
19276
19277 ExprResult VisitExpr(Expr *E) {
19278 S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_expr)
19279 << E->getSourceRange();
19280 return ExprError();
19281 }
19282
19283 ExprResult VisitCallExpr(CallExpr *E);
19284 ExprResult VisitObjCMessageExpr(ObjCMessageExpr *E);
19285
19286 /// Rebuild an expression which simply semantically wraps another
19287 /// expression which it shares the type and value kind of.
19288 template <class T> ExprResult rebuildSugarExpr(T *E) {
19289 ExprResult SubResult = Visit(E->getSubExpr());
19290 if (SubResult.isInvalid()) return ExprError();
19291 Expr *SubExpr = SubResult.get();
19292 E->setSubExpr(SubExpr);
19293 E->setType(SubExpr->getType());
19294 E->setValueKind(SubExpr->getValueKind());
19295 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19296 return E;
19297 }
19298
19299 ExprResult VisitParenExpr(ParenExpr *E) {
19300 return rebuildSugarExpr(E);
19301 }
19302
19303 ExprResult VisitUnaryExtension(UnaryOperator *E) {
19304 return rebuildSugarExpr(E);
19305 }
19306
19307 ExprResult VisitUnaryAddrOf(UnaryOperator *E) {
19308 const PointerType *Ptr = DestType->getAs<PointerType>();
19309 if (!Ptr) {
19310 S.Diag(E->getOperatorLoc(), diag::err_unknown_any_addrof)
19311 << E->getSourceRange();
19312 return ExprError();
19313 }
19314
19315 if (isa<CallExpr>(E->getSubExpr())) {
19316 S.Diag(E->getOperatorLoc(), diag::err_unknown_any_addrof_call)
19317 << E->getSourceRange();
19318 return ExprError();
19319 }
19320
19321 assert(E->isPRValue())(static_cast<void> (0));
19322 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19323 E->setType(DestType);
19324
19325 // Build the sub-expression as if it were an object of the pointee type.
19326 DestType = Ptr->getPointeeType();
19327 ExprResult SubResult = Visit(E->getSubExpr());
19328 if (SubResult.isInvalid()) return ExprError();
19329 E->setSubExpr(SubResult.get());
19330 return E;
19331 }
19332
19333 ExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
19334
19335 ExprResult resolveDecl(Expr *E, ValueDecl *VD);
19336
19337 ExprResult VisitMemberExpr(MemberExpr *E) {
19338 return resolveDecl(E, E->getMemberDecl());
19339 }
19340
19341 ExprResult VisitDeclRefExpr(DeclRefExpr *E) {
19342 return resolveDecl(E, E->getDecl());
19343 }
19344 };
19345}
19346
19347/// Rebuilds a call expression which yielded __unknown_anytype.
19348ExprResult RebuildUnknownAnyExpr::VisitCallExpr(CallExpr *E) {
19349 Expr *CalleeExpr = E->getCallee();
19350
19351 enum FnKind {
19352 FK_MemberFunction,
19353 FK_FunctionPointer,
19354 FK_BlockPointer
19355 };
19356
19357 FnKind Kind;
19358 QualType CalleeType = CalleeExpr->getType();
19359 if (CalleeType == S.Context.BoundMemberTy) {
19360 assert(isa<CXXMemberCallExpr>(E) || isa<CXXOperatorCallExpr>(E))(static_cast<void> (0));
19361 Kind = FK_MemberFunction;
19362 CalleeType = Expr::findBoundMemberType(CalleeExpr);
19363 } else if (const PointerType *Ptr = CalleeType->getAs<PointerType>()) {
19364 CalleeType = Ptr->getPointeeType();
19365 Kind = FK_FunctionPointer;
19366 } else {
19367 CalleeType = CalleeType->castAs<BlockPointerType>()->getPointeeType();
19368 Kind = FK_BlockPointer;
19369 }
19370 const FunctionType *FnType = CalleeType->castAs<FunctionType>();
19371
19372 // Verify that this is a legal result type of a function.
19373 if (DestType->isArrayType() || DestType->isFunctionType()) {
19374 unsigned diagID = diag::err_func_returning_array_function;
19375 if (Kind == FK_BlockPointer)
19376 diagID = diag::err_block_returning_array_function;
19377
19378 S.Diag(E->getExprLoc(), diagID)
19379 << DestType->isFunctionType() << DestType;
19380 return ExprError();
19381 }
19382
19383 // Otherwise, go ahead and set DestType as the call's result.
19384 E->setType(DestType.getNonLValueExprType(S.Context));
19385 E->setValueKind(Expr::getValueKindForType(DestType));
19386 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19387
19388 // Rebuild the function type, replacing the result type with DestType.
19389 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FnType);
19390 if (Proto) {
19391 // __unknown_anytype(...) is a special case used by the debugger when
19392 // it has no idea what a function's signature is.
19393 //
19394 // We want to build this call essentially under the K&R
19395 // unprototyped rules, but making a FunctionNoProtoType in C++
19396 // would foul up all sorts of assumptions. However, we cannot
19397 // simply pass all arguments as variadic arguments, nor can we
19398 // portably just call the function under a non-variadic type; see
19399 // the comment on IR-gen's TargetInfo::isNoProtoCallVariadic.
19400 // However, it turns out that in practice it is generally safe to
19401 // call a function declared as "A foo(B,C,D);" under the prototype
19402 // "A foo(B,C,D,...);". The only known exception is with the
19403 // Windows ABI, where any variadic function is implicitly cdecl
19404 // regardless of its normal CC. Therefore we change the parameter
19405 // types to match the types of the arguments.
19406 //
19407 // This is a hack, but it is far superior to moving the
19408 // corresponding target-specific code from IR-gen to Sema/AST.
19409
19410 ArrayRef<QualType> ParamTypes = Proto->getParamTypes();
19411 SmallVector<QualType, 8> ArgTypes;
19412 if (ParamTypes.empty() && Proto->isVariadic()) { // the special case
19413 ArgTypes.reserve(E->getNumArgs());
19414 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
19415 ArgTypes.push_back(S.Context.getReferenceQualifiedType(E->getArg(i)));
19416 }
19417 ParamTypes = ArgTypes;
19418 }
19419 DestType = S.Context.getFunctionType(DestType, ParamTypes,
19420 Proto->getExtProtoInfo());
19421 } else {
19422 DestType = S.Context.getFunctionNoProtoType(DestType,
19423 FnType->getExtInfo());
19424 }
19425
19426 // Rebuild the appropriate pointer-to-function type.
19427 switch (Kind) {
19428 case FK_MemberFunction:
19429 // Nothing to do.
19430 break;
19431
19432 case FK_FunctionPointer:
19433 DestType = S.Context.getPointerType(DestType);
19434 break;
19435
19436 case FK_BlockPointer:
19437 DestType = S.Context.getBlockPointerType(DestType);
19438 break;
19439 }
19440
19441 // Finally, we can recurse.
19442 ExprResult CalleeResult = Visit(CalleeExpr);
19443 if (!CalleeResult.isUsable()) return ExprError();
19444 E->setCallee(CalleeResult.get());
19445
19446 // Bind a temporary if necessary.
19447 return S.MaybeBindToTemporary(E);
19448}
19449
19450ExprResult RebuildUnknownAnyExpr::VisitObjCMessageExpr(ObjCMessageExpr *E) {
19451 // Verify that this is a legal result type of a call.
19452 if (DestType->isArrayType() || DestType->isFunctionType()) {
19453 S.Diag(E->getExprLoc(), diag::err_func_returning_array_function)
19454 << DestType->isFunctionType() << DestType;
19455 return ExprError();
19456 }
19457
19458 // Rewrite the method result type if available.
19459 if (ObjCMethodDecl *Method = E->getMethodDecl()) {
19460 assert(Method->getReturnType() == S.Context.UnknownAnyTy)(static_cast<void> (0));
19461 Method->setReturnType(DestType);
19462 }
19463
19464 // Change the type of the message.
19465 E->setType(DestType.getNonReferenceType());
19466 E->setValueKind(Expr::getValueKindForType(DestType));
19467
19468 return S.MaybeBindToTemporary(E);
19469}
19470
19471ExprResult RebuildUnknownAnyExpr::VisitImplicitCastExpr(ImplicitCastExpr *E) {
19472 // The only case we should ever see here is a function-to-pointer decay.
19473 if (E->getCastKind() == CK_FunctionToPointerDecay) {
19474 assert(E->isPRValue())(static_cast<void> (0));
19475 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19476
19477 E->setType(DestType);
19478
19479 // Rebuild the sub-expression as the pointee (function) type.
19480 DestType = DestType->castAs<PointerType>()->getPointeeType();
19481
19482 ExprResult Result = Visit(E->getSubExpr());
19483 if (!Result.isUsable()) return ExprError();
19484
19485 E->setSubExpr(Result.get());
19486 return E;
19487 } else if (E->getCastKind() == CK_LValueToRValue) {
19488 assert(E->isPRValue())(static_cast<void> (0));
19489 assert(E->getObjectKind() == OK_Ordinary)(static_cast<void> (0));
19490
19491 assert(isa<BlockPointerType>(E->getType()))(static_cast<void> (0));
19492
19493 E->setType(DestType);
19494
19495 // The sub-expression has to be a lvalue reference, so rebuild it as such.
19496 DestType = S.Context.getLValueReferenceType(DestType);
19497
19498 ExprResult Result = Visit(E->getSubExpr());
19499 if (!Result.isUsable()) return ExprError();
19500
19501 E->setSubExpr(Result.get());
19502 return E;
19503 } else {
19504 llvm_unreachable("Unhandled cast type!")__builtin_unreachable();
19505 }
19506}
19507
19508ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {
19509 ExprValueKind ValueKind = VK_LValue;
19510 QualType Type = DestType;
19511
19512 // We know how to make this work for certain kinds of decls:
19513
19514 // - functions
19515 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {
19516 if (const PointerType *Ptr = Type->getAs<PointerType>()) {
19517 DestType = Ptr->getPointeeType();
19518 ExprResult Result = resolveDecl(E, VD);
19519 if (Result.isInvalid()) return ExprError();
19520 return S.ImpCastExprToType(Result.get(), Type, CK_FunctionToPointerDecay,
19521 VK_PRValue);
19522 }
19523
19524 if (!Type->isFunctionType()) {
19525 S.Diag(E->getExprLoc(), diag::err_unknown_any_function)
19526 << VD << E->getSourceRange();
19527 return ExprError();
19528 }
19529 if (const FunctionProtoType *FT = Type->getAs<FunctionProtoType>()) {
19530 // We must match the FunctionDecl's type to the hack introduced in
19531 // RebuildUnknownAnyExpr::VisitCallExpr to vararg functions of unknown
19532 // type. See the lengthy commentary in that routine.
19533 QualType FDT = FD->getType();
19534 const FunctionType *FnType = FDT->castAs<FunctionType>();
19535 const FunctionProtoType *Proto = dyn_cast_or_null<FunctionProtoType>(FnType);
19536 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
19537 if (DRE && Proto && Proto->getParamTypes().empty() && Proto->isVariadic()) {
19538 SourceLocation Loc = FD->getLocation();
19539 FunctionDecl *NewFD = FunctionDecl::Create(
19540 S.Context, FD->getDeclContext(), Loc, Loc,
19541 FD->getNameInfo().getName(), DestType, FD->getTypeSourceInfo(),
19542 SC_None, S.getCurFPFeatures().isFPConstrained(),
19543 false /*isInlineSpecified*/, FD->hasPrototype(),
19544 /*ConstexprKind*/ ConstexprSpecKind::Unspecified);
19545
19546 if (FD->getQualifier())
19547 NewFD->setQualifierInfo(FD->getQualifierLoc());
19548
19549 SmallVector<ParmVarDecl*, 16> Params;
19550 for (const auto &AI : FT->param_types()) {
19551 ParmVarDecl *Param =
19552 S.BuildParmVarDeclForTypedef(FD, Loc, AI);
19553 Param->setScopeInfo(0, Params.size());
19554 Params.push_back(Param);
19555 }
19556 NewFD->setParams(Params);
19557 DRE->setDecl(NewFD);
19558 VD = DRE->getDecl();
19559 }
19560 }
19561
19562 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
19563 if (MD->isInstance()) {
19564 ValueKind = VK_PRValue;
19565 Type = S.Context.BoundMemberTy;
19566 }
19567
19568 // Function references aren't l-values in C.
19569 if (!S.getLangOpts().CPlusPlus)
19570 ValueKind = VK_PRValue;
19571
19572 // - variables
19573 } else if (isa<VarDecl>(VD)) {
19574 if (const ReferenceType *RefTy = Type->getAs<ReferenceType>()) {
19575 Type = RefTy->getPointeeType();
19576 } else if (Type->isFunctionType()) {
19577 S.Diag(E->getExprLoc(), diag::err_unknown_any_var_function_type)
19578 << VD << E->getSourceRange();
19579 return ExprError();
19580 }
19581
19582 // - nothing else
19583 } else {
19584 S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_decl)
19585 << VD << E->getSourceRange();
19586 return ExprError();
19587 }
19588
19589 // Modifying the declaration like this is friendly to IR-gen but
19590 // also really dangerous.
19591 VD->setType(DestType);
19592 E->setType(Type);
19593 E->setValueKind(ValueKind);
19594 return E;
19595}
19596
19597/// Check a cast of an unknown-any type. We intentionally only
19598/// trigger this for C-style casts.
19599ExprResult Sema::checkUnknownAnyCast(SourceRange TypeRange, QualType CastType,
19600 Expr *CastExpr, CastKind &CastKind,
19601 ExprValueKind &VK, CXXCastPath &Path) {
19602 // The type we're casting to must be either void or complete.
19603 if (!CastType->isVoidType() &&
19604 RequireCompleteType(TypeRange.getBegin(), CastType,
19605 diag::err_typecheck_cast_to_incomplete))
19606 return ExprError();
19607
19608 // Rewrite the casted expression from scratch.
19609 ExprResult result = RebuildUnknownAnyExpr(*this, CastType).Visit(CastExpr);
19610 if (!result.isUsable()) return ExprError();
19611
19612 CastExpr = result.get();
19613 VK = CastExpr->getValueKind();
19614 CastKind = CK_NoOp;
19615
19616 return CastExpr;
19617}
19618
19619ExprResult Sema::forceUnknownAnyToType(Expr *E, QualType ToType) {
19620 return RebuildUnknownAnyExpr(*this, ToType).Visit(E);
19621}
19622
19623ExprResult Sema::checkUnknownAnyArg(SourceLocation callLoc,
19624 Expr *arg, QualType &paramType) {
19625 // If the syntactic form of the argument is not an explicit cast of
19626 // any sort, just do default argument promotion.
19627 ExplicitCastExpr *castArg = dyn_cast<ExplicitCastExpr>(arg->IgnoreParens());
19628 if (!castArg) {
19629 ExprResult result = DefaultArgumentPromotion(arg);
19630 if (result.isInvalid()) return ExprError();
19631 paramType = result.get()->getType();
19632 return result;
19633 }
19634
19635 // Otherwise, use the type that was written in the explicit cast.
19636 assert(!arg->hasPlaceholderType())(static_cast<void> (0));
19637 paramType = castArg->getTypeAsWritten();
19638
19639 // Copy-initialize a parameter of that type.
19640 InitializedEntity entity =
19641 InitializedEntity::InitializeParameter(Context, paramType,
19642 /*consumed*/ false);
19643 return PerformCopyInitialization(entity, callLoc, arg);
19644}
19645
19646static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {
19647 Expr *orig = E;
19648 unsigned diagID = diag::err_uncasted_use_of_unknown_any;
19649 while (true) {
19650 E = E->IgnoreParenImpCasts();
19651 if (CallExpr *call = dyn_cast<CallExpr>(E)) {
19652 E = call->getCallee();
19653 diagID = diag::err_uncasted_call_of_unknown_any;
19654 } else {
19655 break;
19656 }
19657 }
19658
19659 SourceLocation loc;
19660 NamedDecl *d;
19661 if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {
19662 loc = ref->getLocation();
19663 d = ref->getDecl();
19664 } else if (MemberExpr *mem = dyn_cast<MemberExpr>(E)) {
19665 loc = mem->getMemberLoc();
19666 d = mem->getMemberDecl();
19667 } else if (ObjCMessageExpr *msg = dyn_cast<ObjCMessageExpr>(E)) {
19668 diagID = diag::err_uncasted_call_of_unknown_any;
19669 loc = msg->getSelectorStartLoc();
19670 d = msg->getMethodDecl();
19671 if (!d) {
19672 S.Diag(loc, diag::err_uncasted_send_to_unknown_any_method)
19673 << static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector()
19674 << orig->getSourceRange();
19675 return ExprError();
19676 }
19677 } else {
19678 S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_expr)
19679 << E->getSourceRange();
19680 return ExprError();
19681 }
19682
19683 S.Diag(loc, diagID) << d << orig->getSourceRange();
19684
19685 // Never recoverable.
19686 return ExprError();
19687}
19688
19689/// Check for operands with placeholder types and complain if found.
19690/// Returns ExprError() if there was an error and no recovery was possible.
19691ExprResult Sema::CheckPlaceholderExpr(Expr *E) {
19692 if (!Context.isDependenceAllowed()) {
19693 // C cannot handle TypoExpr nodes on either side of a binop because it
19694 // doesn't handle dependent types properly, so make sure any TypoExprs have
19695 // been dealt with before checking the operands.
19696 ExprResult Result = CorrectDelayedTyposInExpr(E);
19697 if (!Result.isUsable()) return ExprError();
19698 E = Result.get();
19699 }
19700
19701 const BuiltinType *placeholderType = E->getType()->getAsPlaceholderType();
19702 if (!placeholderType) return E;
19703
19704 switch (placeholderType->getKind()) {
19705
19706 // Overloaded expressions.
19707 case BuiltinType::Overload: {
19708 // Try to resolve a single function template specialization.
19709 // This is obligatory.
19710 ExprResult Result = E;
19711 if (ResolveAndFixSingleFunctionTemplateSpecialization(Result, false))
19712 return Result;
19713
19714 // No guarantees that ResolveAndFixSingleFunctionTemplateSpecialization
19715 // leaves Result unchanged on failure.
19716 Result = E;
19717 if (resolveAndFixAddressOfSingleOverloadCandidate(Result))
19718 return Result;
19719
19720 // If that failed, try to recover with a call.
19721 tryToRecoverWithCall(Result, PDiag(diag::err_ovl_unresolvable),
19722 /*complain*/ true);
19723 return Result;
19724 }
19725
19726 // Bound member functions.
19727 case BuiltinType::BoundMember: {
19728 ExprResult result = E;
19729 const Expr *BME = E->IgnoreParens();
19730 PartialDiagnostic PD = PDiag(diag::err_bound_member_function);
19731 // Try to give a nicer diagnostic if it is a bound member that we recognize.
19732 if (isa<CXXPseudoDestructorExpr>(BME)) {
19733 PD = PDiag(diag::err_dtor_expr_without_call) << /*pseudo-destructor*/ 1;
19734 } else if (const auto *ME = dyn_cast<MemberExpr>(BME)) {
19735 if (ME->getMemberNameInfo().getName().getNameKind() ==
19736 DeclarationName::CXXDestructorName)
19737 PD = PDiag(diag::err_dtor_expr_without_call) << /*destructor*/ 0;
19738 }
19739 tryToRecoverWithCall(result, PD,
19740 /*complain*/ true);
19741 return result;
19742 }
19743
19744 // ARC unbridged casts.
19745 case BuiltinType::ARCUnbridgedCast: {
19746 Expr *realCast = stripARCUnbridgedCast(E);
19747 diagnoseARCUnbridgedCast(realCast);
19748 return realCast;
19749 }
19750
19751 // Expressions of unknown type.
19752 case BuiltinType::UnknownAny:
19753 return diagnoseUnknownAnyExpr(*this, E);
19754
19755 // Pseudo-objects.
19756 case BuiltinType::PseudoObject:
19757 return checkPseudoObjectRValue(E);
19758
19759 case BuiltinType::BuiltinFn: {
19760 // Accept __noop without parens by implicitly converting it to a call expr.
19761 auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts());
19762 if (DRE) {
19763 auto *FD = cast<FunctionDecl>(DRE->getDecl());
19764 if (FD->getBuiltinID() == Builtin::BI__noop) {
19765 E = ImpCastExprToType(E, Context.getPointerType(FD->getType()),
19766 CK_BuiltinFnToFnPtr)
19767 .get();
19768 return CallExpr::Create(Context, E, /*Args=*/{}, Context.IntTy,
19769 VK_PRValue, SourceLocation(),
19770 FPOptionsOverride());
19771 }
19772 }
19773
19774 Diag(E->getBeginLoc(), diag::err_builtin_fn_use);
19775 return ExprError();
19776 }
19777
19778 case BuiltinType::IncompleteMatrixIdx:
19779 Diag(cast<MatrixSubscriptExpr>(E->IgnoreParens())
19780 ->getRowIdx()
19781 ->getBeginLoc(),
19782 diag::err_matrix_incomplete_index);
19783 return ExprError();
19784
19785 // Expressions of unknown type.
19786 case BuiltinType::OMPArraySection:
19787 Diag(E->getBeginLoc(), diag::err_omp_array_section_use);
19788 return ExprError();
19789
19790 // Expressions of unknown type.
19791 case BuiltinType::OMPArrayShaping:
19792 return ExprError(Diag(E->getBeginLoc(), diag::err_omp_array_shaping_use));
19793
19794 case BuiltinType::OMPIterator:
19795 return ExprError(Diag(E->getBeginLoc(), diag::err_omp_iterator_use));
19796
19797 // Everything else should be impossible.
19798#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
19799 case BuiltinType::Id:
19800#include "clang/Basic/OpenCLImageTypes.def"
19801#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
19802 case BuiltinType::Id:
19803#include "clang/Basic/OpenCLExtensionTypes.def"
19804#define SVE_TYPE(Name, Id, SingletonId) \
19805 case BuiltinType::Id:
19806#include "clang/Basic/AArch64SVEACLETypes.def"
19807#define PPC_VECTOR_TYPE(Name, Id, Size) \
19808 case BuiltinType::Id:
19809#include "clang/Basic/PPCTypes.def"
19810#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
19811#include "clang/Basic/RISCVVTypes.def"
19812#define BUILTIN_TYPE(Id, SingletonId) case BuiltinType::Id:
19813#define PLACEHOLDER_TYPE(Id, SingletonId)
19814#include "clang/AST/BuiltinTypes.def"
19815 break;
19816 }
19817
19818 llvm_unreachable("invalid placeholder type!")__builtin_unreachable();
19819}
19820
19821bool Sema::CheckCaseExpression(Expr *E) {
19822 if (E->isTypeDependent())
19823 return true;
19824 if (E->isValueDependent() || E->isIntegerConstantExpr(Context))
19825 return E->getType()->isIntegralOrEnumerationType();
19826 return false;
19827}
19828
19829/// ActOnObjCBoolLiteral - Parse {__objc_yes,__objc_no} literals.
19830ExprResult
19831Sema::ActOnObjCBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind) {
19832 assert((Kind == tok::kw___objc_yes || Kind == tok::kw___objc_no) &&(static_cast<void> (0))
19833 "Unknown Objective-C Boolean value!")(static_cast<void> (0));
19834 QualType BoolT = Context.ObjCBuiltinBoolTy;
19835 if (!Context.getBOOLDecl()) {
19836 LookupResult Result(*this, &Context.Idents.get("BOOL"), OpLoc,
19837 Sema::LookupOrdinaryName);
19838 if (LookupName(Result, getCurScope()) && Result.isSingleResult()) {
19839 NamedDecl *ND = Result.getFoundDecl();
19840 if (TypedefDecl *TD = dyn_cast<TypedefDecl>(ND))
19841 Context.setBOOLDecl(TD);
19842 }
19843 }
19844 if (Context.getBOOLDecl())
19845 BoolT = Context.getBOOLType();
19846 return new (Context)
19847 ObjCBoolLiteralExpr(Kind == tok::kw___objc_yes, BoolT, OpLoc);
19848}
19849
19850ExprResult Sema::ActOnObjCAvailabilityCheckExpr(
19851 llvm::ArrayRef<AvailabilitySpec> AvailSpecs, SourceLocation AtLoc,
19852 SourceLocation RParen) {
19853 auto FindSpecVersion = [&](StringRef Platform) -> Optional<VersionTuple> {
19854 auto Spec = llvm::find_if(AvailSpecs, [&](const AvailabilitySpec &Spec) {
19855 return Spec.getPlatform() == Platform;
19856 });
19857 // Transcribe the "ios" availability check to "maccatalyst" when compiling
19858 // for "maccatalyst" if "maccatalyst" is not specified.
19859 if (Spec == AvailSpecs.end() && Platform == "maccatalyst") {
19860 Spec = llvm::find_if(AvailSpecs, [&](const AvailabilitySpec &Spec) {
19861 return Spec.getPlatform() == "ios";
19862 });
19863 }
19864 if (Spec == AvailSpecs.end())
19865 return None;
19866 return Spec->getVersion();
19867 };
19868
19869 VersionTuple Version;
19870 if (auto MaybeVersion =
19871 FindSpecVersion(Context.getTargetInfo().getPlatformName()))
19872 Version = *MaybeVersion;
19873
19874 // The use of `@available` in the enclosing context should be analyzed to
19875 // warn when it's used inappropriately (i.e. not if(@available)).
19876 if (FunctionScopeInfo *Context = getCurFunctionAvailabilityContext())
19877 Context->HasPotentialAvailabilityViolations = true;
19878
19879 return new (Context)
19880 ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy);
19881}
19882
19883ExprResult Sema::CreateRecoveryExpr(SourceLocation Begin, SourceLocation End,
19884 ArrayRef<Expr *> SubExprs, QualType T) {
19885 if (!Context.getLangOpts().RecoveryAST)
19886 return ExprError();
19887
19888 if (isSFINAEContext())
19889 return ExprError();
19890
19891 if (T.isNull() || T->isUndeducedType() ||
19892 !Context.getLangOpts().RecoveryASTType)
19893 // We don't know the concrete type, fallback to dependent type.
19894 T = Context.DependentTy;
19895
19896 return RecoveryExpr::Create(Context, T, Begin, End, SubExprs);
19897}

/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/include/clang/AST/Type.h

1//===- Type.h - C Language Family Type Representation -----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// C Language Family Type Representation
11///
12/// This file defines the clang::Type interface and subclasses, used to
13/// represent types for languages in the C family.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_CLANG_AST_TYPE_H
18#define LLVM_CLANG_AST_TYPE_H
19
20#include "clang/AST/DependenceFlags.h"
21#include "clang/AST/NestedNameSpecifier.h"
22#include "clang/AST/TemplateName.h"
23#include "clang/Basic/AddressSpaces.h"
24#include "clang/Basic/AttrKinds.h"
25#include "clang/Basic/Diagnostic.h"
26#include "clang/Basic/ExceptionSpecificationType.h"
27#include "clang/Basic/LLVM.h"
28#include "clang/Basic/Linkage.h"
29#include "clang/Basic/PartialDiagnostic.h"
30#include "clang/Basic/SourceLocation.h"
31#include "clang/Basic/Specifiers.h"
32#include "clang/Basic/Visibility.h"
33#include "llvm/ADT/APInt.h"
34#include "llvm/ADT/APSInt.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/FoldingSet.h"
37#include "llvm/ADT/None.h"
38#include "llvm/ADT/Optional.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/StringRef.h"
42#include "llvm/ADT/Twine.h"
43#include "llvm/ADT/iterator_range.h"
44#include "llvm/Support/Casting.h"
45#include "llvm/Support/Compiler.h"
46#include "llvm/Support/ErrorHandling.h"
47#include "llvm/Support/PointerLikeTypeTraits.h"
48#include "llvm/Support/TrailingObjects.h"
49#include "llvm/Support/type_traits.h"
50#include <cassert>
51#include <cstddef>
52#include <cstdint>
53#include <cstring>
54#include <string>
55#include <type_traits>
56#include <utility>
57
58namespace clang {
59
60class ExtQuals;
61class QualType;
62class ConceptDecl;
63class TagDecl;
64class TemplateParameterList;
65class Type;
66
67enum {
68 TypeAlignmentInBits = 4,
69 TypeAlignment = 1 << TypeAlignmentInBits
70};
71
72namespace serialization {
73 template <class T> class AbstractTypeReader;
74 template <class T> class AbstractTypeWriter;
75}
76
77} // namespace clang
78
79namespace llvm {
80
81 template <typename T>
82 struct PointerLikeTypeTraits;
83 template<>
84 struct PointerLikeTypeTraits< ::clang::Type*> {
85 static inline void *getAsVoidPointer(::clang::Type *P) { return P; }
86
87 static inline ::clang::Type *getFromVoidPointer(void *P) {
88 return static_cast< ::clang::Type*>(P);
89 }
90
91 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
92 };
93
94 template<>
95 struct PointerLikeTypeTraits< ::clang::ExtQuals*> {
96 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; }
97
98 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) {
99 return static_cast< ::clang::ExtQuals*>(P);
100 }
101
102 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
103 };
104
105} // namespace llvm
106
107namespace clang {
108
109class ASTContext;
110template <typename> class CanQual;
111class CXXRecordDecl;
112class DeclContext;
113class EnumDecl;
114class Expr;
115class ExtQualsTypeCommonBase;
116class FunctionDecl;
117class IdentifierInfo;
118class NamedDecl;
119class ObjCInterfaceDecl;
120class ObjCProtocolDecl;
121class ObjCTypeParamDecl;
122struct PrintingPolicy;
123class RecordDecl;
124class Stmt;
125class TagDecl;
126class TemplateArgument;
127class TemplateArgumentListInfo;
128class TemplateArgumentLoc;
129class TemplateTypeParmDecl;
130class TypedefNameDecl;
131class UnresolvedUsingTypenameDecl;
132
133using CanQualType = CanQual<Type>;
134
135// Provide forward declarations for all of the *Type classes.
136#define TYPE(Class, Base) class Class##Type;
137#include "clang/AST/TypeNodes.inc"
138
139/// The collection of all-type qualifiers we support.
140/// Clang supports five independent qualifiers:
141/// * C99: const, volatile, and restrict
142/// * MS: __unaligned
143/// * Embedded C (TR18037): address spaces
144/// * Objective C: the GC attributes (none, weak, or strong)
145class Qualifiers {
146public:
147 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ.
148 Const = 0x1,
149 Restrict = 0x2,
150 Volatile = 0x4,
151 CVRMask = Const | Volatile | Restrict
152 };
153
154 enum GC {
155 GCNone = 0,
156 Weak,
157 Strong
158 };
159
160 enum ObjCLifetime {
161 /// There is no lifetime qualification on this type.
162 OCL_None,
163
164 /// This object can be modified without requiring retains or
165 /// releases.
166 OCL_ExplicitNone,
167
168 /// Assigning into this object requires the old value to be
169 /// released and the new value to be retained. The timing of the
170 /// release of the old value is inexact: it may be moved to
171 /// immediately after the last known point where the value is
172 /// live.
173 OCL_Strong,
174
175 /// Reading or writing from this object requires a barrier call.
176 OCL_Weak,
177
178 /// Assigning into this object requires a lifetime extension.
179 OCL_Autoreleasing
180 };
181
182 enum {
183 /// The maximum supported address space number.
184 /// 23 bits should be enough for anyone.
185 MaxAddressSpace = 0x7fffffu,
186
187 /// The width of the "fast" qualifier mask.
188 FastWidth = 3,
189
190 /// The fast qualifier mask.
191 FastMask = (1 << FastWidth) - 1
192 };
193
194 /// Returns the common set of qualifiers while removing them from
195 /// the given sets.
196 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) {
197 // If both are only CVR-qualified, bit operations are sufficient.
198 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) {
199 Qualifiers Q;
200 Q.Mask = L.Mask & R.Mask;
201 L.Mask &= ~Q.Mask;
202 R.Mask &= ~Q.Mask;
203 return Q;
204 }
205
206 Qualifiers Q;
207 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers();
208 Q.addCVRQualifiers(CommonCRV);
209 L.removeCVRQualifiers(CommonCRV);
210 R.removeCVRQualifiers(CommonCRV);
211
212 if (L.getObjCGCAttr() == R.getObjCGCAttr()) {
213 Q.setObjCGCAttr(L.getObjCGCAttr());
214 L.removeObjCGCAttr();
215 R.removeObjCGCAttr();
216 }
217
218 if (L.getObjCLifetime() == R.getObjCLifetime()) {
219 Q.setObjCLifetime(L.getObjCLifetime());
220 L.removeObjCLifetime();
221 R.removeObjCLifetime();
222 }
223
224 if (L.getAddressSpace() == R.getAddressSpace()) {
225 Q.setAddressSpace(L.getAddressSpace());
226 L.removeAddressSpace();
227 R.removeAddressSpace();
228 }
229 return Q;
230 }
231
232 static Qualifiers fromFastMask(unsigned Mask) {
233 Qualifiers Qs;
234 Qs.addFastQualifiers(Mask);
235 return Qs;
236 }
237
238 static Qualifiers fromCVRMask(unsigned CVR) {
239 Qualifiers Qs;
240 Qs.addCVRQualifiers(CVR);
241 return Qs;
242 }
243
244 static Qualifiers fromCVRUMask(unsigned CVRU) {
245 Qualifiers Qs;
246 Qs.addCVRUQualifiers(CVRU);
247 return Qs;
248 }
249
250 // Deserialize qualifiers from an opaque representation.
251 static Qualifiers fromOpaqueValue(unsigned opaque) {
252 Qualifiers Qs;
253 Qs.Mask = opaque;
254 return Qs;
255 }
256
257 // Serialize these qualifiers into an opaque representation.
258 unsigned getAsOpaqueValue() const {
259 return Mask;
260 }
261
262 bool hasConst() const { return Mask & Const; }
263 bool hasOnlyConst() const { return Mask == Const; }
264 void removeConst() { Mask &= ~Const; }
265 void addConst() { Mask |= Const; }
266
267 bool hasVolatile() const { return Mask & Volatile; }
268 bool hasOnlyVolatile() const { return Mask == Volatile; }
269 void removeVolatile() { Mask &= ~Volatile; }
270 void addVolatile() { Mask |= Volatile; }
271
272 bool hasRestrict() const { return Mask & Restrict; }
273 bool hasOnlyRestrict() const { return Mask == Restrict; }
274 void removeRestrict() { Mask &= ~Restrict; }
275 void addRestrict() { Mask |= Restrict; }
276
277 bool hasCVRQualifiers() const { return getCVRQualifiers(); }
278 unsigned getCVRQualifiers() const { return Mask & CVRMask; }
279 unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); }
280
281 void setCVRQualifiers(unsigned mask) {
282 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast<void> (0));
283 Mask = (Mask & ~CVRMask) | mask;
284 }
285 void removeCVRQualifiers(unsigned mask) {
286 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast<void> (0));
287 Mask &= ~mask;
288 }
289 void removeCVRQualifiers() {
290 removeCVRQualifiers(CVRMask);
291 }
292 void addCVRQualifiers(unsigned mask) {
293 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast<void> (0));
294 Mask |= mask;
295 }
296 void addCVRUQualifiers(unsigned mask) {
297 assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits")(static_cast<void> (0));
298 Mask |= mask;
299 }
300
301 bool hasUnaligned() const { return Mask & UMask; }
302 void setUnaligned(bool flag) {
303 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
304 }
305 void removeUnaligned() { Mask &= ~UMask; }
306 void addUnaligned() { Mask |= UMask; }
307
308 bool hasObjCGCAttr() const { return Mask & GCAttrMask; }
309 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); }
310 void setObjCGCAttr(GC type) {
311 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift);
312 }
313 void removeObjCGCAttr() { setObjCGCAttr(GCNone); }
314 void addObjCGCAttr(GC type) {
315 assert(type)(static_cast<void> (0));
316 setObjCGCAttr(type);
317 }
318 Qualifiers withoutObjCGCAttr() const {
319 Qualifiers qs = *this;
320 qs.removeObjCGCAttr();
321 return qs;
322 }
323 Qualifiers withoutObjCLifetime() const {
324 Qualifiers qs = *this;
325 qs.removeObjCLifetime();
326 return qs;
327 }
328 Qualifiers withoutAddressSpace() const {
329 Qualifiers qs = *this;
330 qs.removeAddressSpace();
331 return qs;
332 }
333
334 bool hasObjCLifetime() const { return Mask & LifetimeMask; }
335 ObjCLifetime getObjCLifetime() const {
336 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
337 }
338 void setObjCLifetime(ObjCLifetime type) {
339 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift);
340 }
341 void removeObjCLifetime() { setObjCLifetime(OCL_None); }
342 void addObjCLifetime(ObjCLifetime type) {
343 assert(type)(static_cast<void> (0));
344 assert(!hasObjCLifetime())(static_cast<void> (0));
345 Mask |= (type << LifetimeShift);
346 }
347
348 /// True if the lifetime is neither None or ExplicitNone.
349 bool hasNonTrivialObjCLifetime() const {
350 ObjCLifetime lifetime = getObjCLifetime();
351 return (lifetime > OCL_ExplicitNone);
352 }
353
354 /// True if the lifetime is either strong or weak.
355 bool hasStrongOrWeakObjCLifetime() const {
356 ObjCLifetime lifetime = getObjCLifetime();
357 return (lifetime == OCL_Strong || lifetime == OCL_Weak);
358 }
359
360 bool hasAddressSpace() const { return Mask & AddressSpaceMask; }
361 LangAS getAddressSpace() const {
362 return static_cast<LangAS>(Mask >> AddressSpaceShift);
363 }
364 bool hasTargetSpecificAddressSpace() const {
365 return isTargetAddressSpace(getAddressSpace());
366 }
367 /// Get the address space attribute value to be printed by diagnostics.
368 unsigned getAddressSpaceAttributePrintValue() const {
369 auto Addr = getAddressSpace();
370 // This function is not supposed to be used with language specific
371 // address spaces. If that happens, the diagnostic message should consider
372 // printing the QualType instead of the address space value.
373 assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace())(static_cast<void> (0));
374 if (Addr != LangAS::Default)
375 return toTargetAddressSpace(Addr);
376 // TODO: The diagnostic messages where Addr may be 0 should be fixed
377 // since it cannot differentiate the situation where 0 denotes the default
378 // address space or user specified __attribute__((address_space(0))).
379 return 0;
380 }
381 void setAddressSpace(LangAS space) {
382 assert((unsigned)space <= MaxAddressSpace)(static_cast<void> (0));
383 Mask = (Mask & ~AddressSpaceMask)
384 | (((uint32_t) space) << AddressSpaceShift);
385 }
386 void removeAddressSpace() { setAddressSpace(LangAS::Default); }
387 void addAddressSpace(LangAS space) {
388 assert(space != LangAS::Default)(static_cast<void> (0));
389 setAddressSpace(space);
390 }
391
392 // Fast qualifiers are those that can be allocated directly
393 // on a QualType object.
394 bool hasFastQualifiers() const { return getFastQualifiers(); }
395 unsigned getFastQualifiers() const { return Mask & FastMask; }
396 void setFastQualifiers(unsigned mask) {
397 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast<void> (0));
398 Mask = (Mask & ~FastMask) | mask;
399 }
400 void removeFastQualifiers(unsigned mask) {
401 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast<void> (0));
402 Mask &= ~mask;
403 }
404 void removeFastQualifiers() {
405 removeFastQualifiers(FastMask);
406 }
407 void addFastQualifiers(unsigned mask) {
408 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast<void> (0));
409 Mask |= mask;
410 }
411
412 /// Return true if the set contains any qualifiers which require an ExtQuals
413 /// node to be allocated.
414 bool hasNonFastQualifiers() const { return Mask & ~FastMask; }
415 Qualifiers getNonFastQualifiers() const {
416 Qualifiers Quals = *this;
417 Quals.setFastQualifiers(0);
418 return Quals;
419 }
420
421 /// Return true if the set contains any qualifiers.
422 bool hasQualifiers() const { return Mask; }
423 bool empty() const { return !Mask; }
424
425 /// Add the qualifiers from the given set to this set.
426 void addQualifiers(Qualifiers Q) {
427 // If the other set doesn't have any non-boolean qualifiers, just
428 // bit-or it in.
429 if (!(Q.Mask & ~CVRMask))
430 Mask |= Q.Mask;
431 else {
432 Mask |= (Q.Mask & CVRMask);
433 if (Q.hasAddressSpace())
434 addAddressSpace(Q.getAddressSpace());
435 if (Q.hasObjCGCAttr())
436 addObjCGCAttr(Q.getObjCGCAttr());
437 if (Q.hasObjCLifetime())
438 addObjCLifetime(Q.getObjCLifetime());
439 }
440 }
441
442 /// Remove the qualifiers from the given set from this set.
443 void removeQualifiers(Qualifiers Q) {
444 // If the other set doesn't have any non-boolean qualifiers, just
445 // bit-and the inverse in.
446 if (!(Q.Mask & ~CVRMask))
447 Mask &= ~Q.Mask;
448 else {
449 Mask &= ~(Q.Mask & CVRMask);
450 if (getObjCGCAttr() == Q.getObjCGCAttr())
451 removeObjCGCAttr();
452 if (getObjCLifetime() == Q.getObjCLifetime())
453 removeObjCLifetime();
454 if (getAddressSpace() == Q.getAddressSpace())
455 removeAddressSpace();
456 }
457 }
458
459 /// Add the qualifiers from the given set to this set, given that
460 /// they don't conflict.
461 void addConsistentQualifiers(Qualifiers qs) {
462 assert(getAddressSpace() == qs.getAddressSpace() ||(static_cast<void> (0))
463 !hasAddressSpace() || !qs.hasAddressSpace())(static_cast<void> (0));
464 assert(getObjCGCAttr() == qs.getObjCGCAttr() ||(static_cast<void> (0))
465 !hasObjCGCAttr() || !qs.hasObjCGCAttr())(static_cast<void> (0));
466 assert(getObjCLifetime() == qs.getObjCLifetime() ||(static_cast<void> (0))
467 !hasObjCLifetime() || !qs.hasObjCLifetime())(static_cast<void> (0));
468 Mask |= qs.Mask;
469 }
470
471 /// Returns true if address space A is equal to or a superset of B.
472 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of
473 /// overlapping address spaces.
474 /// CL1.1 or CL1.2:
475 /// every address space is a superset of itself.
476 /// CL2.0 adds:
477 /// __generic is a superset of any address space except for __constant.
478 static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) {
479 // Address spaces must match exactly.
480 return A == B ||
481 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except
482 // for __constant can be used as __generic.
483 (A == LangAS::opencl_generic && B != LangAS::opencl_constant) ||
484 // We also define global_device and global_host address spaces,
485 // to distinguish global pointers allocated on host from pointers
486 // allocated on device, which are a subset of __global.
487 (A == LangAS::opencl_global && (B == LangAS::opencl_global_device ||
488 B == LangAS::opencl_global_host)) ||
489 (A == LangAS::sycl_global && (B == LangAS::sycl_global_device ||
490 B == LangAS::sycl_global_host)) ||
491 // Consider pointer size address spaces to be equivalent to default.
492 ((isPtrSizeAddressSpace(A) || A == LangAS::Default) &&
493 (isPtrSizeAddressSpace(B) || B == LangAS::Default)) ||
494 // Default is a superset of SYCL address spaces.
495 (A == LangAS::Default &&
496 (B == LangAS::sycl_private || B == LangAS::sycl_local ||
497 B == LangAS::sycl_global || B == LangAS::sycl_global_device ||
498 B == LangAS::sycl_global_host)) ||
499 // In HIP device compilation, any cuda address space is allowed
500 // to implicitly cast into the default address space.
501 (A == LangAS::Default &&
502 (B == LangAS::cuda_constant || B == LangAS::cuda_device ||
503 B == LangAS::cuda_shared));
504 }
505
506 /// Returns true if the address space in these qualifiers is equal to or
507 /// a superset of the address space in the argument qualifiers.
508 bool isAddressSpaceSupersetOf(Qualifiers other) const {
509 return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace());
510 }
511
512 /// Determines if these qualifiers compatibly include another set.
513 /// Generally this answers the question of whether an object with the other
514 /// qualifiers can be safely used as an object with these qualifiers.
515 bool compatiblyIncludes(Qualifiers other) const {
516 return isAddressSpaceSupersetOf(other) &&
517 // ObjC GC qualifiers can match, be added, or be removed, but can't
518 // be changed.
519 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() ||
520 !other.hasObjCGCAttr()) &&
521 // ObjC lifetime qualifiers must match exactly.
522 getObjCLifetime() == other.getObjCLifetime() &&
523 // CVR qualifiers may subset.
524 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) &&
525 // U qualifier may superset.
526 (!other.hasUnaligned() || hasUnaligned());
527 }
528
529 /// Determines if these qualifiers compatibly include another set of
530 /// qualifiers from the narrow perspective of Objective-C ARC lifetime.
531 ///
532 /// One set of Objective-C lifetime qualifiers compatibly includes the other
533 /// if the lifetime qualifiers match, or if both are non-__weak and the
534 /// including set also contains the 'const' qualifier, or both are non-__weak
535 /// and one is None (which can only happen in non-ARC modes).
536 bool compatiblyIncludesObjCLifetime(Qualifiers other) const {
537 if (getObjCLifetime() == other.getObjCLifetime())
538 return true;
539
540 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak)
541 return false;
542
543 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None)
544 return true;
545
546 return hasConst();
547 }
548
549 /// Determine whether this set of qualifiers is a strict superset of
550 /// another set of qualifiers, not considering qualifier compatibility.
551 bool isStrictSupersetOf(Qualifiers Other) const;
552
553 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; }
554 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; }
555
556 explicit operator bool() const { return hasQualifiers(); }
557
558 Qualifiers &operator+=(Qualifiers R) {
559 addQualifiers(R);
560 return *this;
561 }
562
563 // Union two qualifier sets. If an enumerated qualifier appears
564 // in both sets, use the one from the right.
565 friend Qualifiers operator+(Qualifiers L, Qualifiers R) {
566 L += R;
567 return L;
568 }
569
570 Qualifiers &operator-=(Qualifiers R) {
571 removeQualifiers(R);
572 return *this;
573 }
574
575 /// Compute the difference between two qualifier sets.
576 friend Qualifiers operator-(Qualifiers L, Qualifiers R) {
577 L -= R;
578 return L;
579 }
580
581 std::string getAsString() const;
582 std::string getAsString(const PrintingPolicy &Policy) const;
583
584 static std::string getAddrSpaceAsString(LangAS AS);
585
586 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const;
587 void print(raw_ostream &OS, const PrintingPolicy &Policy,
588 bool appendSpaceIfNonEmpty = false) const;
589
590 void Profile(llvm::FoldingSetNodeID &ID) const {
591 ID.AddInteger(Mask);
592 }
593
594private:
595 // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31|
596 // |C R V|U|GCAttr|Lifetime|AddressSpace|
597 uint32_t Mask = 0;
598
599 static const uint32_t UMask = 0x8;
600 static const uint32_t UShift = 3;
601 static const uint32_t GCAttrMask = 0x30;
602 static const uint32_t GCAttrShift = 4;
603 static const uint32_t LifetimeMask = 0x1C0;
604 static const uint32_t LifetimeShift = 6;
605 static const uint32_t AddressSpaceMask =
606 ~(CVRMask | UMask | GCAttrMask | LifetimeMask);
607 static const uint32_t AddressSpaceShift = 9;
608};
609
610/// A std::pair-like structure for storing a qualified type split
611/// into its local qualifiers and its locally-unqualified type.
612struct SplitQualType {
613 /// The locally-unqualified type.
614 const Type *Ty = nullptr;
615
616 /// The local qualifiers.
617 Qualifiers Quals;
618
619 SplitQualType() = default;
620 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {}
621
622 SplitQualType getSingleStepDesugaredType() const; // end of this file
623
624 // Make std::tie work.
625 std::pair<const Type *,Qualifiers> asPair() const {
626 return std::pair<const Type *, Qualifiers>(Ty, Quals);
627 }
628
629 friend bool operator==(SplitQualType a, SplitQualType b) {
630 return a.Ty == b.Ty && a.Quals == b.Quals;
631 }
632 friend bool operator!=(SplitQualType a, SplitQualType b) {
633 return a.Ty != b.Ty || a.Quals != b.Quals;
634 }
635};
636
637/// The kind of type we are substituting Objective-C type arguments into.
638///
639/// The kind of substitution affects the replacement of type parameters when
640/// no concrete type information is provided, e.g., when dealing with an
641/// unspecialized type.
642enum class ObjCSubstitutionContext {
643 /// An ordinary type.
644 Ordinary,
645
646 /// The result type of a method or function.
647 Result,
648
649 /// The parameter type of a method or function.
650 Parameter,
651
652 /// The type of a property.
653 Property,
654
655 /// The superclass of a type.
656 Superclass,
657};
658
659/// A (possibly-)qualified type.
660///
661/// For efficiency, we don't store CV-qualified types as nodes on their
662/// own: instead each reference to a type stores the qualifiers. This
663/// greatly reduces the number of nodes we need to allocate for types (for
664/// example we only need one for 'int', 'const int', 'volatile int',
665/// 'const volatile int', etc).
666///
667/// As an added efficiency bonus, instead of making this a pair, we
668/// just store the two bits we care about in the low bits of the
669/// pointer. To handle the packing/unpacking, we make QualType be a
670/// simple wrapper class that acts like a smart pointer. A third bit
671/// indicates whether there are extended qualifiers present, in which
672/// case the pointer points to a special structure.
673class QualType {
674 friend class QualifierCollector;
675
676 // Thankfully, these are efficiently composable.
677 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
678 Qualifiers::FastWidth> Value;
679
680 const ExtQuals *getExtQualsUnsafe() const {
681 return Value.getPointer().get<const ExtQuals*>();
682 }
683
684 const Type *getTypePtrUnsafe() const {
685 return Value.getPointer().get<const Type*>();
686 }
687
688 const ExtQualsTypeCommonBase *getCommonPtr() const {
689 assert(!isNull() && "Cannot retrieve a NULL type pointer")(static_cast<void> (0));
690 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue());
691 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1);
692 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal);
693 }
694
695public:
696 QualType() = default;
697 QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
698 QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
699
700 unsigned getLocalFastQualifiers() const { return Value.getInt(); }
701 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); }
702
703 /// Retrieves a pointer to the underlying (unqualified) type.
704 ///
705 /// This function requires that the type not be NULL. If the type might be
706 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull().
707 const Type *getTypePtr() const;
708
709 const Type *getTypePtrOrNull() const;
710
711 /// Retrieves a pointer to the name of the base type.
712 const IdentifierInfo *getBaseTypeIdentifier() const;
713
714 /// Divides a QualType into its unqualified type and a set of local
715 /// qualifiers.
716 SplitQualType split() const;
717
718 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); }
719
720 static QualType getFromOpaquePtr(const void *Ptr) {
721 QualType T;
722 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr));
723 return T;
724 }
725
726 const Type &operator*() const {
727 return *getTypePtr();
728 }
729
730 const Type *operator->() const {
731 return getTypePtr();
732 }
733
734 bool isCanonical() const;
735 bool isCanonicalAsParam() const;
736
737 /// Return true if this QualType doesn't point to a type yet.
738 bool isNull() const {
739 return Value.getPointer().isNull();
740 }
741
742 /// Determine whether this particular QualType instance has the
743 /// "const" qualifier set, without looking through typedefs that may have
744 /// added "const" at a different level.
745 bool isLocalConstQualified() const {
746 return (getLocalFastQualifiers() & Qualifiers::Const);
747 }
748
749 /// Determine whether this type is const-qualified.
750 bool isConstQualified() const;
751
752 /// Determine whether this particular QualType instance has the
753 /// "restrict" qualifier set, without looking through typedefs that may have
754 /// added "restrict" at a different level.
755 bool isLocalRestrictQualified() const {
756 return (getLocalFastQualifiers() & Qualifiers::Restrict);
757 }
758
759 /// Determine whether this type is restrict-qualified.
760 bool isRestrictQualified() const;
761
762 /// Determine whether this particular QualType instance has the
763 /// "volatile" qualifier set, without looking through typedefs that may have
764 /// added "volatile" at a different level.
765 bool isLocalVolatileQualified() const {
766 return (getLocalFastQualifiers() & Qualifiers::Volatile);
767 }
768
769 /// Determine whether this type is volatile-qualified.
770 bool isVolatileQualified() const;
771
772 /// Determine whether this particular QualType instance has any
773 /// qualifiers, without looking through any typedefs that might add
774 /// qualifiers at a different level.
775 bool hasLocalQualifiers() const {
776 return getLocalFastQualifiers() || hasLocalNonFastQualifiers();
777 }
778
779 /// Determine whether this type has any qualifiers.
780 bool hasQualifiers() const;
781
782 /// Determine whether this particular QualType instance has any
783 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType
784 /// instance.
785 bool hasLocalNonFastQualifiers() const {
786 return Value.getPointer().is<const ExtQuals*>();
787 }
788
789 /// Retrieve the set of qualifiers local to this particular QualType
790 /// instance, not including any qualifiers acquired through typedefs or
791 /// other sugar.
792 Qualifiers getLocalQualifiers() const;
793
794 /// Retrieve the set of qualifiers applied to this type.
795 Qualifiers getQualifiers() const;
796
797 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
798 /// local to this particular QualType instance, not including any qualifiers
799 /// acquired through typedefs or other sugar.
800 unsigned getLocalCVRQualifiers() const {
801 return getLocalFastQualifiers();
802 }
803
804 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
805 /// applied to this type.
806 unsigned getCVRQualifiers() const;
807
808 bool isConstant(const ASTContext& Ctx) const {
809 return QualType::isConstant(*this, Ctx);
810 }
811
812 /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
813 bool isPODType(const ASTContext &Context) const;
814
815 /// Return true if this is a POD type according to the rules of the C++98
816 /// standard, regardless of the current compilation's language.
817 bool isCXX98PODType(const ASTContext &Context) const;
818
819 /// Return true if this is a POD type according to the more relaxed rules
820 /// of the C++11 standard, regardless of the current compilation's language.
821 /// (C++0x [basic.types]p9). Note that, unlike
822 /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account.
823 bool isCXX11PODType(const ASTContext &Context) const;
824
825 /// Return true if this is a trivial type per (C++0x [basic.types]p9)
826 bool isTrivialType(const ASTContext &Context) const;
827
828 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9)
829 bool isTriviallyCopyableType(const ASTContext &Context) const;
830
831
832 /// Returns true if it is a class and it might be dynamic.
833 bool mayBeDynamicClass() const;
834
835 /// Returns true if it is not a class or if the class might not be dynamic.
836 bool mayBeNotDynamicClass() const;
837
838 // Don't promise in the API that anything besides 'const' can be
839 // easily added.
840
841 /// Add the `const` type qualifier to this QualType.
842 void addConst() {
843 addFastQualifiers(Qualifiers::Const);
844 }
845 QualType withConst() const {
846 return withFastQualifiers(Qualifiers::Const);
847 }
848
849 /// Add the `volatile` type qualifier to this QualType.
850 void addVolatile() {
851 addFastQualifiers(Qualifiers::Volatile);
852 }
853 QualType withVolatile() const {
854 return withFastQualifiers(Qualifiers::Volatile);
855 }
856
857 /// Add the `restrict` qualifier to this QualType.
858 void addRestrict() {
859 addFastQualifiers(Qualifiers::Restrict);
860 }
861 QualType withRestrict() const {
862 return withFastQualifiers(Qualifiers::Restrict);
863 }
864
865 QualType withCVRQualifiers(unsigned CVR) const {
866 return withFastQualifiers(CVR);
867 }
868
869 void addFastQualifiers(unsigned TQs) {
870 assert(!(TQs & ~Qualifiers::FastMask)(static_cast<void> (0))
871 && "non-fast qualifier bits set in mask!")(static_cast<void> (0));
872 Value.setInt(Value.getInt() | TQs);
873 }
874
875 void removeLocalConst();
876 void removeLocalVolatile();
877 void removeLocalRestrict();
878 void removeLocalCVRQualifiers(unsigned Mask);
879
880 void removeLocalFastQualifiers() { Value.setInt(0); }
881 void removeLocalFastQualifiers(unsigned Mask) {
882 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers")(static_cast<void> (0));
883 Value.setInt(Value.getInt() & ~Mask);
884 }
885
886 // Creates a type with the given qualifiers in addition to any
887 // qualifiers already on this type.
888 QualType withFastQualifiers(unsigned TQs) const {
889 QualType T = *this;
890 T.addFastQualifiers(TQs);
891 return T;
892 }
893
894 // Creates a type with exactly the given fast qualifiers, removing
895 // any existing fast qualifiers.
896 QualType withExactLocalFastQualifiers(unsigned TQs) const {
897 return withoutLocalFastQualifiers().withFastQualifiers(TQs);
898 }
899
900 // Removes fast qualifiers, but leaves any extended qualifiers in place.
901 QualType withoutLocalFastQualifiers() const {
902 QualType T = *this;
903 T.removeLocalFastQualifiers();
904 return T;
905 }
906
907 QualType getCanonicalType() const;
908
909 /// Return this type with all of the instance-specific qualifiers
910 /// removed, but without removing any qualifiers that may have been applied
911 /// through typedefs.
912 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); }
913
914 /// Retrieve the unqualified variant of the given type,
915 /// removing as little sugar as possible.
916 ///
917 /// This routine looks through various kinds of sugar to find the
918 /// least-desugared type that is unqualified. For example, given:
919 ///
920 /// \code
921 /// typedef int Integer;
922 /// typedef const Integer CInteger;
923 /// typedef CInteger DifferenceType;
924 /// \endcode
925 ///
926 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will
927 /// desugar until we hit the type \c Integer, which has no qualifiers on it.
928 ///
929 /// The resulting type might still be qualified if it's sugar for an array
930 /// type. To strip qualifiers even from within a sugared array type, use
931 /// ASTContext::getUnqualifiedArrayType.
932 inline QualType getUnqualifiedType() const;
933
934 /// Retrieve the unqualified variant of the given type, removing as little
935 /// sugar as possible.
936 ///
937 /// Like getUnqualifiedType(), but also returns the set of
938 /// qualifiers that were built up.
939 ///
940 /// The resulting type might still be qualified if it's sugar for an array
941 /// type. To strip qualifiers even from within a sugared array type, use
942 /// ASTContext::getUnqualifiedArrayType.
943 inline SplitQualType getSplitUnqualifiedType() const;
944
945 /// Determine whether this type is more qualified than the other
946 /// given type, requiring exact equality for non-CVR qualifiers.
947 bool isMoreQualifiedThan(QualType Other) const;
948
949 /// Determine whether this type is at least as qualified as the other
950 /// given type, requiring exact equality for non-CVR qualifiers.
951 bool isAtLeastAsQualifiedAs(QualType Other) const;
952
953 QualType getNonReferenceType() const;
954
955 /// Determine the type of a (typically non-lvalue) expression with the
956 /// specified result type.
957 ///
958 /// This routine should be used for expressions for which the return type is
959 /// explicitly specified (e.g., in a cast or call) and isn't necessarily
960 /// an lvalue. It removes a top-level reference (since there are no
961 /// expressions of reference type) and deletes top-level cvr-qualifiers
962 /// from non-class types (in C++) or all types (in C).
963 QualType getNonLValueExprType(const ASTContext &Context) const;
964
965 /// Remove an outer pack expansion type (if any) from this type. Used as part
966 /// of converting the type of a declaration to the type of an expression that
967 /// references that expression. It's meaningless for an expression to have a
968 /// pack expansion type.
969 QualType getNonPackExpansionType() const;
970
971 /// Return the specified type with any "sugar" removed from
972 /// the type. This takes off typedefs, typeof's etc. If the outer level of
973 /// the type is already concrete, it returns it unmodified. This is similar
974 /// to getting the canonical type, but it doesn't remove *all* typedefs. For
975 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
976 /// concrete.
977 ///
978 /// Qualifiers are left in place.
979 QualType getDesugaredType(const ASTContext &Context) const {
980 return getDesugaredType(*this, Context);
981 }
982
983 SplitQualType getSplitDesugaredType() const {
984 return getSplitDesugaredType(*this);
985 }
986
987 /// Return the specified type with one level of "sugar" removed from
988 /// the type.
989 ///
990 /// This routine takes off the first typedef, typeof, etc. If the outer level
991 /// of the type is already concrete, it returns it unmodified.
992 QualType getSingleStepDesugaredType(const ASTContext &Context) const {
993 return getSingleStepDesugaredTypeImpl(*this, Context);
994 }
995
996 /// Returns the specified type after dropping any
997 /// outer-level parentheses.
998 QualType IgnoreParens() const {
999 if (isa<ParenType>(*this))
1000 return QualType::IgnoreParens(*this);
1001 return *this;
1002 }
1003
1004 /// Indicate whether the specified types and qualifiers are identical.
1005 friend bool operator==(const QualType &LHS, const QualType &RHS) {
1006 return LHS.Value == RHS.Value;
1007 }
1008 friend bool operator!=(const QualType &LHS, const QualType &RHS) {
1009 return LHS.Value != RHS.Value;
1010 }
1011 friend bool operator<(const QualType &LHS, const QualType &RHS) {
1012 return LHS.Value < RHS.Value;
1013 }
1014
1015 static std::string getAsString(SplitQualType split,
1016 const PrintingPolicy &Policy) {
1017 return getAsString(split.Ty, split.Quals, Policy);
1018 }
1019 static std::string getAsString(const Type *ty, Qualifiers qs,
1020 const PrintingPolicy &Policy);
1021
1022 std::string getAsString() const;
1023 std::string getAsString(const PrintingPolicy &Policy) const;
1024
1025 void print(raw_ostream &OS, const PrintingPolicy &Policy,
1026 const Twine &PlaceHolder = Twine(),
1027 unsigned Indentation = 0) const;
1028
1029 static void print(SplitQualType split, raw_ostream &OS,
1030 const PrintingPolicy &policy, const Twine &PlaceHolder,
1031 unsigned Indentation = 0) {
1032 return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation);
1033 }
1034
1035 static void print(const Type *ty, Qualifiers qs,
1036 raw_ostream &OS, const PrintingPolicy &policy,
1037 const Twine &PlaceHolder,
1038 unsigned Indentation = 0);
1039
1040 void getAsStringInternal(std::string &Str,
1041 const PrintingPolicy &Policy) const;
1042
1043 static void getAsStringInternal(SplitQualType split, std::string &out,
1044 const PrintingPolicy &policy) {
1045 return getAsStringInternal(split.Ty, split.Quals, out, policy);
1046 }
1047
1048 static void getAsStringInternal(const Type *ty, Qualifiers qs,
1049 std::string &out,
1050 const PrintingPolicy &policy);
1051
1052 class StreamedQualTypeHelper {
1053 const QualType &T;
1054 const PrintingPolicy &Policy;
1055 const Twine &PlaceHolder;
1056 unsigned Indentation;
1057
1058 public:
1059 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy,
1060 const Twine &PlaceHolder, unsigned Indentation)
1061 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1062 Indentation(Indentation) {}
1063
1064 friend raw_ostream &operator<<(raw_ostream &OS,
1065 const StreamedQualTypeHelper &SQT) {
1066 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1067 return OS;
1068 }
1069 };
1070
1071 StreamedQualTypeHelper stream(const PrintingPolicy &Policy,
1072 const Twine &PlaceHolder = Twine(),
1073 unsigned Indentation = 0) const {
1074 return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation);
1075 }
1076
1077 void dump(const char *s) const;
1078 void dump() const;
1079 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const;
1080
1081 void Profile(llvm::FoldingSetNodeID &ID) const {
1082 ID.AddPointer(getAsOpaquePtr());
1083 }
1084
1085 /// Check if this type has any address space qualifier.
1086 inline bool hasAddressSpace() const;
1087
1088 /// Return the address space of this type.
1089 inline LangAS getAddressSpace() const;
1090
1091 /// Returns true if address space qualifiers overlap with T address space
1092 /// qualifiers.
1093 /// OpenCL C defines conversion rules for pointers to different address spaces
1094 /// and notion of overlapping address spaces.
1095 /// CL1.1 or CL1.2:
1096 /// address spaces overlap iff they are they same.
1097 /// OpenCL C v2.0 s6.5.5 adds:
1098 /// __generic overlaps with any address space except for __constant.
1099 bool isAddressSpaceOverlapping(QualType T) const {
1100 Qualifiers Q = getQualifiers();
1101 Qualifiers TQ = T.getQualifiers();
1102 // Address spaces overlap if at least one of them is a superset of another
1103 return Q.isAddressSpaceSupersetOf(TQ) || TQ.isAddressSpaceSupersetOf(Q);
1104 }
1105
1106 /// Returns gc attribute of this type.
1107 inline Qualifiers::GC getObjCGCAttr() const;
1108
1109 /// true when Type is objc's weak.
1110 bool isObjCGCWeak() const {
1111 return getObjCGCAttr() == Qualifiers::Weak;
1112 }
1113
1114 /// true when Type is objc's strong.
1115 bool isObjCGCStrong() const {
1116 return getObjCGCAttr() == Qualifiers::Strong;
1117 }
1118
1119 /// Returns lifetime attribute of this type.
1120 Qualifiers::ObjCLifetime getObjCLifetime() const {
1121 return getQualifiers().getObjCLifetime();
1122 }
1123
1124 bool hasNonTrivialObjCLifetime() const {
1125 return getQualifiers().hasNonTrivialObjCLifetime();
1126 }
1127
1128 bool hasStrongOrWeakObjCLifetime() const {
1129 return getQualifiers().hasStrongOrWeakObjCLifetime();
1130 }
1131
1132 // true when Type is objc's weak and weak is enabled but ARC isn't.
1133 bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const;
1134
1135 enum PrimitiveDefaultInitializeKind {
1136 /// The type does not fall into any of the following categories. Note that
1137 /// this case is zero-valued so that values of this enum can be used as a
1138 /// boolean condition for non-triviality.
1139 PDIK_Trivial,
1140
1141 /// The type is an Objective-C retainable pointer type that is qualified
1142 /// with the ARC __strong qualifier.
1143 PDIK_ARCStrong,
1144
1145 /// The type is an Objective-C retainable pointer type that is qualified
1146 /// with the ARC __weak qualifier.
1147 PDIK_ARCWeak,
1148
1149 /// The type is a struct containing a field whose type is not PCK_Trivial.
1150 PDIK_Struct
1151 };
1152
1153 /// Functions to query basic properties of non-trivial C struct types.
1154
1155 /// Check if this is a non-trivial type that would cause a C struct
1156 /// transitively containing this type to be non-trivial to default initialize
1157 /// and return the kind.
1158 PrimitiveDefaultInitializeKind
1159 isNonTrivialToPrimitiveDefaultInitialize() const;
1160
1161 enum PrimitiveCopyKind {
1162 /// The type does not fall into any of the following categories. Note that
1163 /// this case is zero-valued so that values of this enum can be used as a
1164 /// boolean condition for non-triviality.
1165 PCK_Trivial,
1166
1167 /// The type would be trivial except that it is volatile-qualified. Types
1168 /// that fall into one of the other non-trivial cases may additionally be
1169 /// volatile-qualified.
1170 PCK_VolatileTrivial,
1171
1172 /// The type is an Objective-C retainable pointer type that is qualified
1173 /// with the ARC __strong qualifier.
1174 PCK_ARCStrong,
1175
1176 /// The type is an Objective-C retainable pointer type that is qualified
1177 /// with the ARC __weak qualifier.
1178 PCK_ARCWeak,
1179
1180 /// The type is a struct containing a field whose type is neither
1181 /// PCK_Trivial nor PCK_VolatileTrivial.
1182 /// Note that a C++ struct type does not necessarily match this; C++ copying
1183 /// semantics are too complex to express here, in part because they depend
1184 /// on the exact constructor or assignment operator that is chosen by
1185 /// overload resolution to do the copy.
1186 PCK_Struct
1187 };
1188
1189 /// Check if this is a non-trivial type that would cause a C struct
1190 /// transitively containing this type to be non-trivial to copy and return the
1191 /// kind.
1192 PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const;
1193
1194 /// Check if this is a non-trivial type that would cause a C struct
1195 /// transitively containing this type to be non-trivial to destructively
1196 /// move and return the kind. Destructive move in this context is a C++-style
1197 /// move in which the source object is placed in a valid but unspecified state
1198 /// after it is moved, as opposed to a truly destructive move in which the
1199 /// source object is placed in an uninitialized state.
1200 PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const;
1201
1202 enum DestructionKind {
1203 DK_none,
1204 DK_cxx_destructor,
1205 DK_objc_strong_lifetime,
1206 DK_objc_weak_lifetime,
1207 DK_nontrivial_c_struct
1208 };
1209
1210 /// Returns a nonzero value if objects of this type require
1211 /// non-trivial work to clean up after. Non-zero because it's
1212 /// conceivable that qualifiers (objc_gc(weak)?) could make
1213 /// something require destruction.
1214 DestructionKind isDestructedType() const {
1215 return isDestructedTypeImpl(*this);
1216 }
1217
1218 /// Check if this is or contains a C union that is non-trivial to
1219 /// default-initialize, which is a union that has a member that is non-trivial
1220 /// to default-initialize. If this returns true,
1221 /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct.
1222 bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const;
1223
1224 /// Check if this is or contains a C union that is non-trivial to destruct,
1225 /// which is a union that has a member that is non-trivial to destruct. If
1226 /// this returns true, isDestructedType returns DK_nontrivial_c_struct.
1227 bool hasNonTrivialToPrimitiveDestructCUnion() const;
1228
1229 /// Check if this is or contains a C union that is non-trivial to copy, which
1230 /// is a union that has a member that is non-trivial to copy. If this returns
1231 /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct.
1232 bool hasNonTrivialToPrimitiveCopyCUnion() const;
1233
1234 /// Determine whether expressions of the given type are forbidden
1235 /// from being lvalues in C.
1236 ///
1237 /// The expression types that are forbidden to be lvalues are:
1238 /// - 'void', but not qualified void
1239 /// - function types
1240 ///
1241 /// The exact rule here is C99 6.3.2.1:
1242 /// An lvalue is an expression with an object type or an incomplete
1243 /// type other than void.
1244 bool isCForbiddenLValueType() const;
1245
1246 /// Substitute type arguments for the Objective-C type parameters used in the
1247 /// subject type.
1248 ///
1249 /// \param ctx ASTContext in which the type exists.
1250 ///
1251 /// \param typeArgs The type arguments that will be substituted for the
1252 /// Objective-C type parameters in the subject type, which are generally
1253 /// computed via \c Type::getObjCSubstitutions. If empty, the type
1254 /// parameters will be replaced with their bounds or id/Class, as appropriate
1255 /// for the context.
1256 ///
1257 /// \param context The context in which the subject type was written.
1258 ///
1259 /// \returns the resulting type.
1260 QualType substObjCTypeArgs(ASTContext &ctx,
1261 ArrayRef<QualType> typeArgs,
1262 ObjCSubstitutionContext context) const;
1263
1264 /// Substitute type arguments from an object type for the Objective-C type
1265 /// parameters used in the subject type.
1266 ///
1267 /// This operation combines the computation of type arguments for
1268 /// substitution (\c Type::getObjCSubstitutions) with the actual process of
1269 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of
1270 /// callers that need to perform a single substitution in isolation.
1271 ///
1272 /// \param objectType The type of the object whose member type we're
1273 /// substituting into. For example, this might be the receiver of a message
1274 /// or the base of a property access.
1275 ///
1276 /// \param dc The declaration context from which the subject type was
1277 /// retrieved, which indicates (for example) which type parameters should
1278 /// be substituted.
1279 ///
1280 /// \param context The context in which the subject type was written.
1281 ///
1282 /// \returns the subject type after replacing all of the Objective-C type
1283 /// parameters with their corresponding arguments.
1284 QualType substObjCMemberType(QualType objectType,
1285 const DeclContext *dc,
1286 ObjCSubstitutionContext context) const;
1287
1288 /// Strip Objective-C "__kindof" types from the given type.
1289 QualType stripObjCKindOfType(const ASTContext &ctx) const;
1290
1291 /// Remove all qualifiers including _Atomic.
1292 QualType getAtomicUnqualifiedType() const;
1293
1294private:
1295 // These methods are implemented in a separate translation unit;
1296 // "static"-ize them to avoid creating temporary QualTypes in the
1297 // caller.
1298 static bool isConstant(QualType T, const ASTContext& Ctx);
1299 static QualType getDesugaredType(QualType T, const ASTContext &Context);
1300 static SplitQualType getSplitDesugaredType(QualType T);
1301 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type);
1302 static QualType getSingleStepDesugaredTypeImpl(QualType type,
1303 const ASTContext &C);
1304 static QualType IgnoreParens(QualType T);
1305 static DestructionKind isDestructedTypeImpl(QualType type);
1306
1307 /// Check if \param RD is or contains a non-trivial C union.
1308 static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD);
1309 static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD);
1310 static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD);
1311};
1312
1313} // namespace clang
1314
1315namespace llvm {
1316
1317/// Implement simplify_type for QualType, so that we can dyn_cast from QualType
1318/// to a specific Type class.
1319template<> struct simplify_type< ::clang::QualType> {
1320 using SimpleType = const ::clang::Type *;
1321
1322 static SimpleType getSimplifiedValue(::clang::QualType Val) {
1323 return Val.getTypePtr();
1324 }
1325};
1326
1327// Teach SmallPtrSet that QualType is "basically a pointer".
1328template<>
1329struct PointerLikeTypeTraits<clang::QualType> {
1330 static inline void *getAsVoidPointer(clang::QualType P) {
1331 return P.getAsOpaquePtr();
1332 }
1333
1334 static inline clang::QualType getFromVoidPointer(void *P) {
1335 return clang::QualType::getFromOpaquePtr(P);
1336 }
1337
1338 // Various qualifiers go in low bits.
1339 static constexpr int NumLowBitsAvailable = 0;
1340};
1341
1342} // namespace llvm
1343
1344namespace clang {
1345
1346/// Base class that is common to both the \c ExtQuals and \c Type
1347/// classes, which allows \c QualType to access the common fields between the
1348/// two.
1349class ExtQualsTypeCommonBase {
1350 friend class ExtQuals;
1351 friend class QualType;
1352 friend class Type;
1353
1354 /// The "base" type of an extended qualifiers type (\c ExtQuals) or
1355 /// a self-referential pointer (for \c Type).
1356 ///
1357 /// This pointer allows an efficient mapping from a QualType to its
1358 /// underlying type pointer.
1359 const Type *const BaseType;
1360
1361 /// The canonical type of this type. A QualType.
1362 QualType CanonicalType;
1363
1364 ExtQualsTypeCommonBase(const Type *baseType, QualType canon)
1365 : BaseType(baseType), CanonicalType(canon) {}
1366};
1367
1368/// We can encode up to four bits in the low bits of a
1369/// type pointer, but there are many more type qualifiers that we want
1370/// to be able to apply to an arbitrary type. Therefore we have this
1371/// struct, intended to be heap-allocated and used by QualType to
1372/// store qualifiers.
1373///
1374/// The current design tags the 'const', 'restrict', and 'volatile' qualifiers
1375/// in three low bits on the QualType pointer; a fourth bit records whether
1376/// the pointer is an ExtQuals node. The extended qualifiers (address spaces,
1377/// Objective-C GC attributes) are much more rare.
1378class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode {
1379 // NOTE: changing the fast qualifiers should be straightforward as
1380 // long as you don't make 'const' non-fast.
1381 // 1. Qualifiers:
1382 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ).
1383 // Fast qualifiers must occupy the low-order bits.
1384 // b) Update Qualifiers::FastWidth and FastMask.
1385 // 2. QualType:
1386 // a) Update is{Volatile,Restrict}Qualified(), defined inline.
1387 // b) Update remove{Volatile,Restrict}, defined near the end of
1388 // this header.
1389 // 3. ASTContext:
1390 // a) Update get{Volatile,Restrict}Type.
1391
1392 /// The immutable set of qualifiers applied by this node. Always contains
1393 /// extended qualifiers.
1394 Qualifiers Quals;
1395
1396 ExtQuals *this_() { return this; }
1397
1398public:
1399 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
1400 : ExtQualsTypeCommonBase(baseType,
1401 canon.isNull() ? QualType(this_(), 0) : canon),
1402 Quals(quals) {
1403 assert(Quals.hasNonFastQualifiers()(static_cast<void> (0))
1404 && "ExtQuals created with no fast qualifiers")(static_cast<void> (0));
1405 assert(!Quals.hasFastQualifiers()(static_cast<void> (0))
1406 && "ExtQuals created with fast qualifiers")(static_cast<void> (0));
1407 }
1408
1409 Qualifiers getQualifiers() const { return Quals; }
1410
1411 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); }
1412 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); }
1413
1414 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); }
1415 Qualifiers::ObjCLifetime getObjCLifetime() const {
1416 return Quals.getObjCLifetime();
1417 }
1418
1419 bool hasAddressSpace() const { return Quals.hasAddressSpace(); }
1420 LangAS getAddressSpace() const { return Quals.getAddressSpace(); }
1421
1422 const Type *getBaseType() const { return BaseType; }
1423
1424public:
1425 void Profile(llvm::FoldingSetNodeID &ID) const {
1426 Profile(ID, getBaseType(), Quals);
1427 }
1428
1429 static void Profile(llvm::FoldingSetNodeID &ID,
1430 const Type *BaseType,
1431 Qualifiers Quals) {
1432 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!")(static_cast<void> (0));
1433 ID.AddPointer(BaseType);
1434 Quals.Profile(ID);
1435 }
1436};
1437
1438/// The kind of C++11 ref-qualifier associated with a function type.
1439/// This determines whether a member function's "this" object can be an
1440/// lvalue, rvalue, or neither.
1441enum RefQualifierKind {
1442 /// No ref-qualifier was provided.
1443 RQ_None = 0,
1444
1445 /// An lvalue ref-qualifier was provided (\c &).
1446 RQ_LValue,
1447
1448 /// An rvalue ref-qualifier was provided (\c &&).
1449 RQ_RValue
1450};
1451
1452/// Which keyword(s) were used to create an AutoType.
1453enum class AutoTypeKeyword {
1454 /// auto
1455 Auto,
1456
1457 /// decltype(auto)
1458 DecltypeAuto,
1459
1460 /// __auto_type (GNU extension)
1461 GNUAutoType
1462};
1463
1464/// The base class of the type hierarchy.
1465///
1466/// A central concept with types is that each type always has a canonical
1467/// type. A canonical type is the type with any typedef names stripped out
1468/// of it or the types it references. For example, consider:
1469///
1470/// typedef int foo;
1471/// typedef foo* bar;
1472/// 'int *' 'foo *' 'bar'
1473///
1474/// There will be a Type object created for 'int'. Since int is canonical, its
1475/// CanonicalType pointer points to itself. There is also a Type for 'foo' (a
1476/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next
1477/// there is a PointerType that represents 'int*', which, like 'int', is
1478/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical
1479/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type
1480/// is also 'int*'.
1481///
1482/// Non-canonical types are useful for emitting diagnostics, without losing
1483/// information about typedefs being used. Canonical types are useful for type
1484/// comparisons (they allow by-pointer equality tests) and useful for reasoning
1485/// about whether something has a particular form (e.g. is a function type),
1486/// because they implicitly, recursively, strip all typedefs out of a type.
1487///
1488/// Types, once created, are immutable.
1489///
1490class alignas(8) Type : public ExtQualsTypeCommonBase {
1491public:
1492 enum TypeClass {
1493#define TYPE(Class, Base) Class,
1494#define LAST_TYPE(Class) TypeLast = Class
1495#define ABSTRACT_TYPE(Class, Base)
1496#include "clang/AST/TypeNodes.inc"
1497 };
1498
1499private:
1500 /// Bitfields required by the Type class.
1501 class TypeBitfields {
1502 friend class Type;
1503 template <class T> friend class TypePropertyCache;
1504
1505 /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
1506 unsigned TC : 8;
1507
1508 /// Store information on the type dependency.
1509 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1510
1511 /// True if the cache (i.e. the bitfields here starting with
1512 /// 'Cache') is valid.
1513 mutable unsigned CacheValid : 1;
1514
1515 /// Linkage of this type.
1516 mutable unsigned CachedLinkage : 3;
1517
1518 /// Whether this type involves and local or unnamed types.
1519 mutable unsigned CachedLocalOrUnnamed : 1;
1520
1521 /// Whether this type comes from an AST file.
1522 mutable unsigned FromAST : 1;
1523
1524 bool isCacheValid() const {
1525 return CacheValid;
1526 }
1527
1528 Linkage getLinkage() const {
1529 assert(isCacheValid() && "getting linkage from invalid cache")(static_cast<void> (0));
1530 return static_cast<Linkage>(CachedLinkage);
1531 }
1532
1533 bool hasLocalOrUnnamedType() const {
1534 assert(isCacheValid() && "getting linkage from invalid cache")(static_cast<void> (0));
1535 return CachedLocalOrUnnamed;
1536 }
1537 };
1538 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1539
1540protected:
1541 // These classes allow subclasses to somewhat cleanly pack bitfields
1542 // into Type.
1543
1544 class ArrayTypeBitfields {
1545 friend class ArrayType;
1546
1547 unsigned : NumTypeBits;
1548
1549 /// CVR qualifiers from declarations like
1550 /// 'int X[static restrict 4]'. For function parameters only.
1551 unsigned IndexTypeQuals : 3;
1552
1553 /// Storage class qualifiers from declarations like
1554 /// 'int X[static restrict 4]'. For function parameters only.
1555 /// Actually an ArrayType::ArraySizeModifier.
1556 unsigned SizeModifier : 3;
1557 };
1558
1559 class ConstantArrayTypeBitfields {
1560 friend class ConstantArrayType;
1561
1562 unsigned : NumTypeBits + 3 + 3;
1563
1564 /// Whether we have a stored size expression.
1565 unsigned HasStoredSizeExpr : 1;
1566 };
1567
1568 class BuiltinTypeBitfields {
1569 friend class BuiltinType;
1570
1571 unsigned : NumTypeBits;
1572
1573 /// The kind (BuiltinType::Kind) of builtin type this is.
1574 unsigned Kind : 8;
1575 };
1576
1577 /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.
1578 /// Only common bits are stored here. Additional uncommon bits are stored
1579 /// in a trailing object after FunctionProtoType.
1580 class FunctionTypeBitfields {
1581 friend class FunctionProtoType;
1582 friend class FunctionType;
1583
1584 unsigned : NumTypeBits;
1585
1586 /// Extra information which affects how the function is called, like
1587 /// regparm and the calling convention.
1588 unsigned ExtInfo : 13;
1589
1590 /// The ref-qualifier associated with a \c FunctionProtoType.
1591 ///
1592 /// This is a value of type \c RefQualifierKind.
1593 unsigned RefQualifier : 2;
1594
1595 /// Used only by FunctionProtoType, put here to pack with the
1596 /// other bitfields.
1597 /// The qualifiers are part of FunctionProtoType because...
1598 ///
1599 /// C++ 8.3.5p4: The return type, the parameter type list and the
1600 /// cv-qualifier-seq, [...], are part of the function type.
1601 unsigned FastTypeQuals : Qualifiers::FastWidth;
1602 /// Whether this function has extended Qualifiers.
1603 unsigned HasExtQuals : 1;
1604
1605 /// The number of parameters this function has, not counting '...'.
1606 /// According to [implimits] 8 bits should be enough here but this is
1607 /// somewhat easy to exceed with metaprogramming and so we would like to
1608 /// keep NumParams as wide as reasonably possible.
1609 unsigned NumParams : 16;
1610
1611 /// The type of exception specification this function has.
1612 unsigned ExceptionSpecType : 4;
1613
1614 /// Whether this function has extended parameter information.
1615 unsigned HasExtParameterInfos : 1;
1616
1617 /// Whether the function is variadic.
1618 unsigned Variadic : 1;
1619
1620 /// Whether this function has a trailing return type.
1621 unsigned HasTrailingReturn : 1;
1622 };
1623
1624 class ObjCObjectTypeBitfields {
1625 friend class ObjCObjectType;
1626
1627 unsigned : NumTypeBits;
1628
1629 /// The number of type arguments stored directly on this object type.
1630 unsigned NumTypeArgs : 7;
1631
1632 /// The number of protocols stored directly on this object type.
1633 unsigned NumProtocols : 6;
1634
1635 /// Whether this is a "kindof" type.
1636 unsigned IsKindOf : 1;
1637 };
1638
1639 class ReferenceTypeBitfields {
1640 friend class ReferenceType;
1641
1642 unsigned : NumTypeBits;
1643
1644 /// True if the type was originally spelled with an lvalue sigil.
1645 /// This is never true of rvalue references but can also be false
1646 /// on lvalue references because of C++0x [dcl.typedef]p9,
1647 /// as follows:
1648 ///
1649 /// typedef int &ref; // lvalue, spelled lvalue
1650 /// typedef int &&rvref; // rvalue
1651 /// ref &a; // lvalue, inner ref, spelled lvalue
1652 /// ref &&a; // lvalue, inner ref
1653 /// rvref &a; // lvalue, inner ref, spelled lvalue
1654 /// rvref &&a; // rvalue, inner ref
1655 unsigned SpelledAsLValue : 1;
1656
1657 /// True if the inner type is a reference type. This only happens
1658 /// in non-canonical forms.
1659 unsigned InnerRef : 1;
1660 };
1661
1662 class TypeWithKeywordBitfields {
1663 friend class TypeWithKeyword;
1664
1665 unsigned : NumTypeBits;
1666
1667 /// An ElaboratedTypeKeyword. 8 bits for efficient access.
1668 unsigned Keyword : 8;
1669 };
1670
1671 enum { NumTypeWithKeywordBits = 8 };
1672
1673 class ElaboratedTypeBitfields {
1674 friend class ElaboratedType;
1675
1676 unsigned : NumTypeBits;
1677 unsigned : NumTypeWithKeywordBits;
1678
1679 /// Whether the ElaboratedType has a trailing OwnedTagDecl.
1680 unsigned HasOwnedTagDecl : 1;
1681 };
1682
1683 class VectorTypeBitfields {
1684 friend class VectorType;
1685 friend class DependentVectorType;
1686
1687 unsigned : NumTypeBits;
1688
1689 /// The kind of vector, either a generic vector type or some
1690 /// target-specific vector type such as for AltiVec or Neon.
1691 unsigned VecKind : 3;
1692 /// The number of elements in the vector.
1693 uint32_t NumElements;
1694 };
1695
1696 class AttributedTypeBitfields {
1697 friend class AttributedType;
1698
1699 unsigned : NumTypeBits;
1700
1701 /// An AttributedType::Kind
1702 unsigned AttrKind : 32 - NumTypeBits;
1703 };
1704
1705 class AutoTypeBitfields {
1706 friend class AutoType;
1707
1708 unsigned : NumTypeBits;
1709
1710 /// Was this placeholder type spelled as 'auto', 'decltype(auto)',
1711 /// or '__auto_type'? AutoTypeKeyword value.
1712 unsigned Keyword : 2;
1713
1714 /// The number of template arguments in the type-constraints, which is
1715 /// expected to be able to hold at least 1024 according to [implimits].
1716 /// However as this limit is somewhat easy to hit with template
1717 /// metaprogramming we'd prefer to keep it as large as possible.
1718 /// At the moment it has been left as a non-bitfield since this type
1719 /// safely fits in 64 bits as an unsigned, so there is no reason to
1720 /// introduce the performance impact of a bitfield.
1721 unsigned NumArgs;
1722 };
1723
1724 class SubstTemplateTypeParmPackTypeBitfields {
1725 friend class SubstTemplateTypeParmPackType;
1726
1727 unsigned : NumTypeBits;
1728
1729 /// The number of template arguments in \c Arguments, which is
1730 /// expected to be able to hold at least 1024 according to [implimits].
1731 /// However as this limit is somewhat easy to hit with template
1732 /// metaprogramming we'd prefer to keep it as large as possible.
1733 /// At the moment it has been left as a non-bitfield since this type
1734 /// safely fits in 64 bits as an unsigned, so there is no reason to
1735 /// introduce the performance impact of a bitfield.
1736 unsigned NumArgs;
1737 };
1738
1739 class TemplateSpecializationTypeBitfields {
1740 friend class TemplateSpecializationType;
1741
1742 unsigned : NumTypeBits;
1743
1744 /// Whether this template specialization type is a substituted type alias.
1745 unsigned TypeAlias : 1;
1746
1747 /// The number of template arguments named in this class template
1748 /// specialization, which is expected to be able to hold at least 1024
1749 /// according to [implimits]. However, as this limit is somewhat easy to
1750 /// hit with template metaprogramming we'd prefer to keep it as large
1751 /// as possible. At the moment it has been left as a non-bitfield since
1752 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1753 /// to introduce the performance impact of a bitfield.
1754 unsigned NumArgs;
1755 };
1756
1757 class DependentTemplateSpecializationTypeBitfields {
1758 friend class DependentTemplateSpecializationType;
1759
1760 unsigned : NumTypeBits;
1761 unsigned : NumTypeWithKeywordBits;
1762
1763 /// The number of template arguments named in this class template
1764 /// specialization, which is expected to be able to hold at least 1024
1765 /// according to [implimits]. However, as this limit is somewhat easy to
1766 /// hit with template metaprogramming we'd prefer to keep it as large
1767 /// as possible. At the moment it has been left as a non-bitfield since
1768 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1769 /// to introduce the performance impact of a bitfield.
1770 unsigned NumArgs;
1771 };
1772
1773 class PackExpansionTypeBitfields {
1774 friend class PackExpansionType;
1775
1776 unsigned : NumTypeBits;
1777
1778 /// The number of expansions that this pack expansion will
1779 /// generate when substituted (+1), which is expected to be able to
1780 /// hold at least 1024 according to [implimits]. However, as this limit
1781 /// is somewhat easy to hit with template metaprogramming we'd prefer to
1782 /// keep it as large as possible. At the moment it has been left as a
1783 /// non-bitfield since this type safely fits in 64 bits as an unsigned, so
1784 /// there is no reason to introduce the performance impact of a bitfield.
1785 ///
1786 /// This field will only have a non-zero value when some of the parameter
1787 /// packs that occur within the pattern have been substituted but others
1788 /// have not.
1789 unsigned NumExpansions;
1790 };
1791
1792 union {
1793 TypeBitfields TypeBits;
1794 ArrayTypeBitfields ArrayTypeBits;
1795 ConstantArrayTypeBitfields ConstantArrayTypeBits;
1796 AttributedTypeBitfields AttributedTypeBits;
1797 AutoTypeBitfields AutoTypeBits;
1798 BuiltinTypeBitfields BuiltinTypeBits;
1799 FunctionTypeBitfields FunctionTypeBits;
1800 ObjCObjectTypeBitfields ObjCObjectTypeBits;
1801 ReferenceTypeBitfields ReferenceTypeBits;
1802 TypeWithKeywordBitfields TypeWithKeywordBits;
1803 ElaboratedTypeBitfields ElaboratedTypeBits;
1804 VectorTypeBitfields VectorTypeBits;
1805 SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
1806 TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
1807 DependentTemplateSpecializationTypeBitfields
1808 DependentTemplateSpecializationTypeBits;
1809 PackExpansionTypeBitfields PackExpansionTypeBits;
1810 };
1811
1812private:
1813 template <class T> friend class TypePropertyCache;
1814
1815 /// Set whether this type comes from an AST file.
1816 void setFromAST(bool V = true) const {
1817 TypeBits.FromAST = V;
1818 }
1819
1820protected:
1821 friend class ASTContext;
1822
1823 Type(TypeClass tc, QualType canon, TypeDependence Dependence)
1824 : ExtQualsTypeCommonBase(this,
1825 canon.isNull() ? QualType(this_(), 0) : canon) {
1826 static_assert(sizeof(*this) <= 8 + sizeof(ExtQualsTypeCommonBase),
1827 "changing bitfields changed sizeof(Type)!");
1828 static_assert(alignof(decltype(*this)) % sizeof(void *) == 0,
1829 "Insufficient alignment!");
1830 TypeBits.TC = tc;
1831 TypeBits.Dependence = static_cast<unsigned>(Dependence);
1832 TypeBits.CacheValid = false;
1833 TypeBits.CachedLocalOrUnnamed = false;
1834 TypeBits.CachedLinkage = NoLinkage;
1835 TypeBits.FromAST = false;
1836 }
1837
1838 // silence VC++ warning C4355: 'this' : used in base member initializer list
1839 Type *this_() { return this; }
1840
1841 void setDependence(TypeDependence D) {
1842 TypeBits.Dependence = static_cast<unsigned>(D);
1843 }
1844
1845 void addDependence(TypeDependence D) { setDependence(getDependence() | D); }
1846
1847public:
1848 friend class ASTReader;
1849 friend class ASTWriter;
1850 template <class T> friend class serialization::AbstractTypeReader;
1851 template <class T> friend class serialization::AbstractTypeWriter;
1852
1853 Type(const Type &) = delete;
1854 Type(Type &&) = delete;
1855 Type &operator=(const Type &) = delete;
1856 Type &operator=(Type &&) = delete;
1857
1858 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); }
1859
1860 /// Whether this type comes from an AST file.
1861 bool isFromAST() const { return TypeBits.FromAST; }
1862
1863 /// Whether this type is or contains an unexpanded parameter
1864 /// pack, used to support C++0x variadic templates.
1865 ///
1866 /// A type that contains a parameter pack shall be expanded by the
1867 /// ellipsis operator at some point. For example, the typedef in the
1868 /// following example contains an unexpanded parameter pack 'T':
1869 ///
1870 /// \code
1871 /// template<typename ...T>
1872 /// struct X {
1873 /// typedef T* pointer_types; // ill-formed; T is a parameter pack.
1874 /// };
1875 /// \endcode
1876 ///
1877 /// Note that this routine does not specify which
1878 bool containsUnexpandedParameterPack() const {
1879 return getDependence() & TypeDependence::UnexpandedPack;
1880 }
1881
1882 /// Determines if this type would be canonical if it had no further
1883 /// qualification.
1884 bool isCanonicalUnqualified() const {
1885 return CanonicalType == QualType(this, 0);
1886 }
1887
1888 /// Pull a single level of sugar off of this locally-unqualified type.
1889 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType()
1890 /// or QualType::getSingleStepDesugaredType(const ASTContext&).
1891 QualType getLocallyUnqualifiedSingleStepDesugaredType() const;
1892
1893 /// As an extension, we classify types as one of "sized" or "sizeless";
1894 /// every type is one or the other. Standard types are all sized;
1895 /// sizeless types are purely an extension.
1896 ///
1897 /// Sizeless types contain data with no specified size, alignment,
1898 /// or layout.
1899 bool isSizelessType() const;
1900 bool isSizelessBuiltinType() const;
1901
1902 /// Determines if this is a sizeless type supported by the
1903 /// 'arm_sve_vector_bits' type attribute, which can be applied to a single
1904 /// SVE vector or predicate, excluding tuple types such as svint32x4_t.
1905 bool isVLSTBuiltinType() const;
1906
1907 /// Returns the representative type for the element of an SVE builtin type.
1908 /// This is used to represent fixed-length SVE vectors created with the
1909 /// 'arm_sve_vector_bits' type attribute as VectorType.
1910 QualType getSveEltType(const ASTContext &Ctx) const;
1911
1912 /// Types are partitioned into 3 broad categories (C99 6.2.5p1):
1913 /// object types, function types, and incomplete types.
1914
1915 /// Return true if this is an incomplete type.
1916 /// A type that can describe objects, but which lacks information needed to
1917 /// determine its size (e.g. void, or a fwd declared struct). Clients of this
1918 /// routine will need to determine if the size is actually required.
1919 ///
1920 /// Def If non-null, and the type refers to some kind of declaration
1921 /// that can be completed (such as a C struct, C++ class, or Objective-C
1922 /// class), will be set to the declaration.
1923 bool isIncompleteType(NamedDecl **Def = nullptr) const;
1924
1925 /// Return true if this is an incomplete or object
1926 /// type, in other words, not a function type.
1927 bool isIncompleteOrObjectType() const {
1928 return !isFunctionType();
1929 }
1930
1931 /// Determine whether this type is an object type.
1932 bool isObjectType() const {
1933 // C++ [basic.types]p8:
1934 // An object type is a (possibly cv-qualified) type that is not a
1935 // function type, not a reference type, and not a void type.
1936 return !isReferenceType() && !isFunctionType() && !isVoidType();
1937 }
1938
1939 /// Return true if this is a literal type
1940 /// (C++11 [basic.types]p10)
1941 bool isLiteralType(const ASTContext &Ctx) const;
1942
1943 /// Determine if this type is a structural type, per C++20 [temp.param]p7.
1944 bool isStructuralType() const;
1945
1946 /// Test if this type is a standard-layout type.
1947 /// (C++0x [basic.type]p9)
1948 bool isStandardLayoutType() const;
1949
1950 /// Helper methods to distinguish type categories. All type predicates
1951 /// operate on the canonical type, ignoring typedefs and qualifiers.
1952
1953 /// Returns true if the type is a builtin type.
1954 bool isBuiltinType() const;
1955
1956 /// Test for a particular builtin type.
1957 bool isSpecificBuiltinType(unsigned K) const;
1958
1959 /// Test for a type which does not represent an actual type-system type but
1960 /// is instead used as a placeholder for various convenient purposes within
1961 /// Clang. All such types are BuiltinTypes.
1962 bool isPlaceholderType() const;
1963 const BuiltinType *getAsPlaceholderType() const;
1964
1965 /// Test for a specific placeholder type.
1966 bool isSpecificPlaceholderType(unsigned K) const;
1967
1968 /// Test for a placeholder type other than Overload; see
1969 /// BuiltinType::isNonOverloadPlaceholderType.
1970 bool isNonOverloadPlaceholderType() const;
1971
1972 /// isIntegerType() does *not* include complex integers (a GCC extension).
1973 /// isComplexIntegerType() can be used to test for complex integers.
1974 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum)
1975 bool isEnumeralType() const;
1976
1977 /// Determine whether this type is a scoped enumeration type.
1978 bool isScopedEnumeralType() const;
1979 bool isBooleanType() const;
1980 bool isCharType() const;
1981 bool isWideCharType() const;
1982 bool isChar8Type() const;
1983 bool isChar16Type() const;
1984 bool isChar32Type() const;
1985 bool isAnyCharacterType() const;
1986 bool isIntegralType(const ASTContext &Ctx) const;
1987
1988 /// Determine whether this type is an integral or enumeration type.
1989 bool isIntegralOrEnumerationType() const;
1990
1991 /// Determine whether this type is an integral or unscoped enumeration type.
1992 bool isIntegralOrUnscopedEnumerationType() const;
1993 bool isUnscopedEnumerationType() const;
1994
1995 /// Floating point categories.
1996 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
1997 /// isComplexType() does *not* include complex integers (a GCC extension).
1998 /// isComplexIntegerType() can be used to test for complex integers.
1999 bool isComplexType() const; // C99 6.2.5p11 (complex)
2000 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int.
2001 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex)
2002 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half)
2003 bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661
2004 bool isBFloat16Type() const;
2005 bool isFloat128Type() const;
2006 bool isRealType() const; // C99 6.2.5p17 (real floating + integer)
2007 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating)
2008 bool isVoidType() const; // C99 6.2.5p19
2009 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers)
2010 bool isAggregateType() const;
2011 bool isFundamentalType() const;
2012 bool isCompoundType() const;
2013
2014 // Type Predicates: Check to see if this type is structurally the specified
2015 // type, ignoring typedefs and qualifiers.
2016 bool isFunctionType() const;
2017 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); }
2018 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); }
2019 bool isPointerType() const;
2020 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer
2021 bool isBlockPointerType() const;
2022 bool isVoidPointerType() const;
2023 bool isReferenceType() const;
2024 bool isLValueReferenceType() const;
2025 bool isRValueReferenceType() const;
2026 bool isObjectPointerType() const;
2027 bool isFunctionPointerType() const;
2028 bool isFunctionReferenceType() const;
2029 bool isMemberPointerType() const;
2030 bool isMemberFunctionPointerType() const;
2031 bool isMemberDataPointerType() const;
2032 bool isArrayType() const;
2033 bool isConstantArrayType() const;
2034 bool isIncompleteArrayType() const;
2035 bool isVariableArrayType() const;
2036 bool isDependentSizedArrayType() const;
2037 bool isRecordType() const;
2038 bool isClassType() const;
2039 bool isStructureType() const;
2040 bool isObjCBoxableRecordType() const;
2041 bool isInterfaceType() const;
2042 bool isStructureOrClassType() const;
2043 bool isUnionType() const;
2044 bool isComplexIntegerType() const; // GCC _Complex integer type.
2045 bool isVectorType() const; // GCC vector type.
2046 bool isExtVectorType() const; // Extended vector type.
2047 bool isMatrixType() const; // Matrix type.
2048 bool isConstantMatrixType() const; // Constant matrix type.
2049 bool isDependentAddressSpaceType() const; // value-dependent address space qualifier
2050 bool isObjCObjectPointerType() const; // pointer to ObjC object
2051 bool isObjCRetainableType() const; // ObjC object or block pointer
2052 bool isObjCLifetimeType() const; // (array of)* retainable type
2053 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type
2054 bool isObjCNSObjectType() const; // __attribute__((NSObject))
2055 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class))
2056 // FIXME: change this to 'raw' interface type, so we can used 'interface' type
2057 // for the common case.
2058 bool isObjCObjectType() const; // NSString or typeof(*(id)0)
2059 bool isObjCQualifiedInterfaceType() const; // NSString<foo>
2060 bool isObjCQualifiedIdType() const; // id<foo>
2061 bool isObjCQualifiedClassType() const; // Class<foo>
2062 bool isObjCObjectOrInterfaceType() const;
2063 bool isObjCIdType() const; // id
2064 bool isDecltypeType() const;
2065 /// Was this type written with the special inert-in-ARC __unsafe_unretained
2066 /// qualifier?
2067 ///
2068 /// This approximates the answer to the following question: if this
2069 /// translation unit were compiled in ARC, would this type be qualified
2070 /// with __unsafe_unretained?
2071 bool isObjCInertUnsafeUnretainedType() const {
2072 return hasAttr(attr::ObjCInertUnsafeUnretained);
2073 }
2074
2075 /// Whether the type is Objective-C 'id' or a __kindof type of an
2076 /// object type, e.g., __kindof NSView * or __kindof id
2077 /// <NSCopying>.
2078 ///
2079 /// \param bound Will be set to the bound on non-id subtype types,
2080 /// which will be (possibly specialized) Objective-C class type, or
2081 /// null for 'id.
2082 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx,
2083 const ObjCObjectType *&bound) const;
2084
2085 bool isObjCClassType() const; // Class
2086
2087 /// Whether the type is Objective-C 'Class' or a __kindof type of an
2088 /// Class type, e.g., __kindof Class <NSCopying>.
2089 ///
2090 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound
2091 /// here because Objective-C's type system cannot express "a class
2092 /// object for a subclass of NSFoo".
2093 bool isObjCClassOrClassKindOfType() const;
2094
2095 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const;
2096 bool isObjCSelType() const; // Class
2097 bool isObjCBuiltinType() const; // 'id' or 'Class'
2098 bool isObjCARCBridgableType() const;
2099 bool isCARCBridgableType() const;
2100 bool isTemplateTypeParmType() const; // C++ template type parameter
2101 bool isNullPtrType() const; // C++11 std::nullptr_t
2102 bool isNothrowT() const; // C++ std::nothrow_t
2103 bool isAlignValT() const; // C++17 std::align_val_t
2104 bool isStdByteType() const; // C++17 std::byte
2105 bool isAtomicType() const; // C11 _Atomic()
2106 bool isUndeducedAutoType() const; // C++11 auto or
2107 // C++14 decltype(auto)
2108 bool isTypedefNameType() const; // typedef or alias template
2109
2110#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2111 bool is##Id##Type() const;
2112#include "clang/Basic/OpenCLImageTypes.def"
2113
2114 bool isImageType() const; // Any OpenCL image type
2115
2116 bool isSamplerT() const; // OpenCL sampler_t
2117 bool isEventT() const; // OpenCL event_t
2118 bool isClkEventT() const; // OpenCL clk_event_t
2119 bool isQueueT() const; // OpenCL queue_t
2120 bool isReserveIDT() const; // OpenCL reserve_id_t
2121
2122#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2123 bool is##Id##Type() const;
2124#include "clang/Basic/OpenCLExtensionTypes.def"
2125 // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension
2126 bool isOCLIntelSubgroupAVCType() const;
2127 bool isOCLExtOpaqueType() const; // Any OpenCL extension type
2128
2129 bool isPipeType() const; // OpenCL pipe type
2130 bool isExtIntType() const; // Extended Int Type
2131 bool isOpenCLSpecificType() const; // Any OpenCL specific type
2132
2133 /// Determines if this type, which must satisfy
2134 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather
2135 /// than implicitly __strong.
2136 bool isObjCARCImplicitlyUnretainedType() const;
2137
2138 /// Check if the type is the CUDA device builtin surface type.
2139 bool isCUDADeviceBuiltinSurfaceType() const;
2140 /// Check if the type is the CUDA device builtin texture type.
2141 bool isCUDADeviceBuiltinTextureType() const;
2142
2143 /// Return the implicit lifetime for this type, which must not be dependent.
2144 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const;
2145
2146 enum ScalarTypeKind {
2147 STK_CPointer,
2148 STK_BlockPointer,
2149 STK_ObjCObjectPointer,
2150 STK_MemberPointer,
2151 STK_Bool,
2152 STK_Integral,
2153 STK_Floating,
2154 STK_IntegralComplex,
2155 STK_FloatingComplex,
2156 STK_FixedPoint
2157 };
2158
2159 /// Given that this is a scalar type, classify it.
2160 ScalarTypeKind getScalarTypeKind() const;
2161
2162 TypeDependence getDependence() const {
2163 return static_cast<TypeDependence>(TypeBits.Dependence);
2164 }
2165
2166 /// Whether this type is an error type.
2167 bool containsErrors() const {
2168 return getDependence() & TypeDependence::Error;
2169 }
2170
2171 /// Whether this type is a dependent type, meaning that its definition
2172 /// somehow depends on a template parameter (C++ [temp.dep.type]).
2173 bool isDependentType() const {
2174 return getDependence() & TypeDependence::Dependent;
2175 }
2176
2177 /// Determine whether this type is an instantiation-dependent type,
2178 /// meaning that the type involves a template parameter (even if the
2179 /// definition does not actually depend on the type substituted for that
2180 /// template parameter).
2181 bool isInstantiationDependentType() const {
2182 return getDependence() & TypeDependence::Instantiation;
2183 }
2184
2185 /// Determine whether this type is an undeduced type, meaning that
2186 /// it somehow involves a C++11 'auto' type or similar which has not yet been
2187 /// deduced.
2188 bool isUndeducedType() const;
2189
2190 /// Whether this type is a variably-modified type (C99 6.7.5).
2191 bool isVariablyModifiedType() const {
2192 return getDependence() & TypeDependence::VariablyModified;
2193 }
2194
2195 /// Whether this type involves a variable-length array type
2196 /// with a definite size.
2197 bool hasSizedVLAType() const;
2198
2199 /// Whether this type is or contains a local or unnamed type.
2200 bool hasUnnamedOrLocalType() const;
2201
2202 bool isOverloadableType() const;
2203
2204 /// Determine wither this type is a C++ elaborated-type-specifier.
2205 bool isElaboratedTypeSpecifier() const;
2206
2207 bool canDecayToPointerType() const;
2208
2209 /// Whether this type is represented natively as a pointer. This includes
2210 /// pointers, references, block pointers, and Objective-C interface,
2211 /// qualified id, and qualified interface types, as well as nullptr_t.
2212 bool hasPointerRepresentation() const;
2213
2214 /// Whether this type can represent an objective pointer type for the
2215 /// purpose of GC'ability
2216 bool hasObjCPointerRepresentation() const;
2217
2218 /// Determine whether this type has an integer representation
2219 /// of some sort, e.g., it is an integer type or a vector.
2220 bool hasIntegerRepresentation() const;
2221
2222 /// Determine whether this type has an signed integer representation
2223 /// of some sort, e.g., it is an signed integer type or a vector.
2224 bool hasSignedIntegerRepresentation() const;
2225
2226 /// Determine whether this type has an unsigned integer representation
2227 /// of some sort, e.g., it is an unsigned integer type or a vector.
2228 bool hasUnsignedIntegerRepresentation() const;
2229
2230 /// Determine whether this type has a floating-point representation
2231 /// of some sort, e.g., it is a floating-point type or a vector thereof.
2232 bool hasFloatingRepresentation() const;
2233
2234 // Type Checking Functions: Check to see if this type is structurally the
2235 // specified type, ignoring typedefs and qualifiers, and return a pointer to
2236 // the best type we can.
2237 const RecordType *getAsStructureType() const;
2238 /// NOTE: getAs*ArrayType are methods on ASTContext.
2239 const RecordType *getAsUnionType() const;
2240 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type.
2241 const ObjCObjectType *getAsObjCInterfaceType() const;
2242
2243 // The following is a convenience method that returns an ObjCObjectPointerType
2244 // for object declared using an interface.
2245 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const;
2246 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const;
2247 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const;
2248 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const;
2249
2250 /// Retrieves the CXXRecordDecl that this type refers to, either
2251 /// because the type is a RecordType or because it is the injected-class-name
2252 /// type of a class template or class template partial specialization.
2253 CXXRecordDecl *getAsCXXRecordDecl() const;
2254
2255 /// Retrieves the RecordDecl this type refers to.
2256 RecordDecl *getAsRecordDecl() const;
2257
2258 /// Retrieves the TagDecl that this type refers to, either
2259 /// because the type is a TagType or because it is the injected-class-name
2260 /// type of a class template or class template partial specialization.
2261 TagDecl *getAsTagDecl() const;
2262
2263 /// If this is a pointer or reference to a RecordType, return the
2264 /// CXXRecordDecl that the type refers to.
2265 ///
2266 /// If this is not a pointer or reference, or the type being pointed to does
2267 /// not refer to a CXXRecordDecl, returns NULL.
2268 const CXXRecordDecl *getPointeeCXXRecordDecl() const;
2269
2270 /// Get the DeducedType whose type will be deduced for a variable with
2271 /// an initializer of this type. This looks through declarators like pointer
2272 /// types, but not through decltype or typedefs.
2273 DeducedType *getContainedDeducedType() const;
2274
2275 /// Get the AutoType whose type will be deduced for a variable with
2276 /// an initializer of this type. This looks through declarators like pointer
2277 /// types, but not through decltype or typedefs.
2278 AutoType *getContainedAutoType() const {
2279 return dyn_cast_or_null<AutoType>(getContainedDeducedType());
2280 }
2281
2282 /// Determine whether this type was written with a leading 'auto'
2283 /// corresponding to a trailing return type (possibly for a nested
2284 /// function type within a pointer to function type or similar).
2285 bool hasAutoForTrailingReturnType() const;
2286
2287 /// Member-template getAs<specific type>'. Look through sugar for
2288 /// an instance of \<specific type>. This scheme will eventually
2289 /// replace the specific getAsXXXX methods above.
2290 ///
2291 /// There are some specializations of this member template listed
2292 /// immediately following this class.
2293 template <typename T> const T *getAs() const;
2294
2295 /// Member-template getAsAdjusted<specific type>. Look through specific kinds
2296 /// of sugar (parens, attributes, etc) for an instance of \<specific type>.
2297 /// This is used when you need to walk over sugar nodes that represent some
2298 /// kind of type adjustment from a type that was written as a \<specific type>
2299 /// to another type that is still canonically a \<specific type>.
2300 template <typename T> const T *getAsAdjusted() const;
2301
2302 /// A variant of getAs<> for array types which silently discards
2303 /// qualifiers from the outermost type.
2304 const ArrayType *getAsArrayTypeUnsafe() const;
2305
2306 /// Member-template castAs<specific type>. Look through sugar for
2307 /// the underlying instance of \<specific type>.
2308 ///
2309 /// This method has the same relationship to getAs<T> as cast<T> has
2310 /// to dyn_cast<T>; which is to say, the underlying type *must*
2311 /// have the intended type, and this method will never return null.
2312 template <typename T> const T *castAs() const;
2313
2314 /// A variant of castAs<> for array type which silently discards
2315 /// qualifiers from the outermost type.
2316 const ArrayType *castAsArrayTypeUnsafe() const;
2317
2318 /// Determine whether this type had the specified attribute applied to it
2319 /// (looking through top-level type sugar).
2320 bool hasAttr(attr::Kind AK) const;
2321
2322 /// Get the base element type of this type, potentially discarding type
2323 /// qualifiers. This should never be used when type qualifiers
2324 /// are meaningful.
2325 const Type *getBaseElementTypeUnsafe() const;
2326
2327 /// If this is an array type, return the element type of the array,
2328 /// potentially with type qualifiers missing.
2329 /// This should never be used when type qualifiers are meaningful.
2330 const Type *getArrayElementTypeNoTypeQual() const;
2331
2332 /// If this is a pointer type, return the pointee type.
2333 /// If this is an array type, return the array element type.
2334 /// This should never be used when type qualifiers are meaningful.
2335 const Type *getPointeeOrArrayElementType() const;
2336
2337 /// If this is a pointer, ObjC object pointer, or block
2338 /// pointer, this returns the respective pointee.
2339 QualType getPointeeType() const;
2340
2341 /// Return the specified type with any "sugar" removed from the type,
2342 /// removing any typedefs, typeofs, etc., as well as any qualifiers.
2343 const Type *getUnqualifiedDesugaredType() const;
2344
2345 /// More type predicates useful for type checking/promotion
2346 bool isPromotableIntegerType() const; // C99 6.3.1.1p2
2347
2348 /// Return true if this is an integer type that is
2349 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
2350 /// or an enum decl which has a signed representation.
2351 bool isSignedIntegerType() const;
2352
2353 /// Return true if this is an integer type that is
2354 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool],
2355 /// or an enum decl which has an unsigned representation.
2356 bool isUnsignedIntegerType() const;
2357
2358 /// Determines whether this is an integer type that is signed or an
2359 /// enumeration types whose underlying type is a signed integer type.
2360 bool isSignedIntegerOrEnumerationType() const;
2361
2362 /// Determines whether this is an integer type that is unsigned or an
2363 /// enumeration types whose underlying type is a unsigned integer type.
2364 bool isUnsignedIntegerOrEnumerationType() const;
2365
2366 /// Return true if this is a fixed point type according to
2367 /// ISO/IEC JTC1 SC22 WG14 N1169.
2368 bool isFixedPointType() const;
2369
2370 /// Return true if this is a fixed point or integer type.
2371 bool isFixedPointOrIntegerType() const;
2372
2373 /// Return true if this is a saturated fixed point type according to
2374 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2375 bool isSaturatedFixedPointType() const;
2376
2377 /// Return true if this is a saturated fixed point type according to
2378 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2379 bool isUnsaturatedFixedPointType() const;
2380
2381 /// Return true if this is a fixed point type that is signed according
2382 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2383 bool isSignedFixedPointType() const;
2384
2385 /// Return true if this is a fixed point type that is unsigned according
2386 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2387 bool isUnsignedFixedPointType() const;
2388
2389 /// Return true if this is not a variable sized type,
2390 /// according to the rules of C99 6.7.5p3. It is not legal to call this on
2391 /// incomplete types.
2392 bool isConstantSizeType() const;
2393
2394 /// Returns true if this type can be represented by some
2395 /// set of type specifiers.
2396 bool isSpecifierType() const;
2397
2398 /// Determine the linkage of this type.
2399 Linkage getLinkage() const;
2400
2401 /// Determine the visibility of this type.
2402 Visibility getVisibility() const {
2403 return getLinkageAndVisibility().getVisibility();
2404 }
2405
2406 /// Return true if the visibility was explicitly set is the code.
2407 bool isVisibilityExplicit() const {
2408 return getLinkageAndVisibility().isVisibilityExplicit();
2409 }
2410
2411 /// Determine the linkage and visibility of this type.
2412 LinkageInfo getLinkageAndVisibility() const;
2413
2414 /// True if the computed linkage is valid. Used for consistency
2415 /// checking. Should always return true.
2416 bool isLinkageValid() const;
2417
2418 /// Determine the nullability of the given type.
2419 ///
2420 /// Note that nullability is only captured as sugar within the type
2421 /// system, not as part of the canonical type, so nullability will
2422 /// be lost by canonicalization and desugaring.
2423 Optional<NullabilityKind> getNullability(const ASTContext &context) const;
2424
2425 /// Determine whether the given type can have a nullability
2426 /// specifier applied to it, i.e., if it is any kind of pointer type.
2427 ///
2428 /// \param ResultIfUnknown The value to return if we don't yet know whether
2429 /// this type can have nullability because it is dependent.
2430 bool canHaveNullability(bool ResultIfUnknown = true) const;
2431
2432 /// Retrieve the set of substitutions required when accessing a member
2433 /// of the Objective-C receiver type that is declared in the given context.
2434 ///
2435 /// \c *this is the type of the object we're operating on, e.g., the
2436 /// receiver for a message send or the base of a property access, and is
2437 /// expected to be of some object or object pointer type.
2438 ///
2439 /// \param dc The declaration context for which we are building up a
2440 /// substitution mapping, which should be an Objective-C class, extension,
2441 /// category, or method within.
2442 ///
2443 /// \returns an array of type arguments that can be substituted for
2444 /// the type parameters of the given declaration context in any type described
2445 /// within that context, or an empty optional to indicate that no
2446 /// substitution is required.
2447 Optional<ArrayRef<QualType>>
2448 getObjCSubstitutions(const DeclContext *dc) const;
2449
2450 /// Determines if this is an ObjC interface type that may accept type
2451 /// parameters.
2452 bool acceptsObjCTypeParams() const;
2453
2454 const char *getTypeClassName() const;
2455
2456 QualType getCanonicalTypeInternal() const {
2457 return CanonicalType;
2458 }
2459
2460 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h
2461 void dump() const;
2462 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const;
2463};
2464
2465/// This will check for a TypedefType by removing any existing sugar
2466/// until it reaches a TypedefType or a non-sugared type.
2467template <> const TypedefType *Type::getAs() const;
2468
2469/// This will check for a TemplateSpecializationType by removing any
2470/// existing sugar until it reaches a TemplateSpecializationType or a
2471/// non-sugared type.
2472template <> const TemplateSpecializationType *Type::getAs() const;
2473
2474/// This will check for an AttributedType by removing any existing sugar
2475/// until it reaches an AttributedType or a non-sugared type.
2476template <> const AttributedType *Type::getAs() const;
2477
2478// We can do canonical leaf types faster, because we don't have to
2479// worry about preserving child type decoration.
2480#define TYPE(Class, Base)
2481#define LEAF_TYPE(Class) \
2482template <> inline const Class##Type *Type::getAs() const { \
2483 return dyn_cast<Class##Type>(CanonicalType); \
2484} \
2485template <> inline const Class##Type *Type::castAs() const { \
2486 return cast<Class##Type>(CanonicalType); \
2487}
2488#include "clang/AST/TypeNodes.inc"
2489
2490/// This class is used for builtin types like 'int'. Builtin
2491/// types are always canonical and have a literal name field.
2492class BuiltinType : public Type {
2493public:
2494 enum Kind {
2495// OpenCL image types
2496#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
2497#include "clang/Basic/OpenCLImageTypes.def"
2498// OpenCL extension types
2499#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
2500#include "clang/Basic/OpenCLExtensionTypes.def"
2501// SVE Types
2502#define SVE_TYPE(Name, Id, SingletonId) Id,
2503#include "clang/Basic/AArch64SVEACLETypes.def"
2504// PPC MMA Types
2505#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
2506#include "clang/Basic/PPCTypes.def"
2507// RVV Types
2508#define RVV_TYPE(Name, Id, SingletonId) Id,
2509#include "clang/Basic/RISCVVTypes.def"
2510// All other builtin types
2511#define BUILTIN_TYPE(Id, SingletonId) Id,
2512#define LAST_BUILTIN_TYPE(Id) LastKind = Id
2513#include "clang/AST/BuiltinTypes.def"
2514 };
2515
2516private:
2517 friend class ASTContext; // ASTContext creates these.
2518
2519 BuiltinType(Kind K)
2520 : Type(Builtin, QualType(),
2521 K == Dependent ? TypeDependence::DependentInstantiation
2522 : TypeDependence::None) {
2523 BuiltinTypeBits.Kind = K;
2524 }
2525
2526public:
2527 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); }
2528 StringRef getName(const PrintingPolicy &Policy) const;
2529
2530 const char *getNameAsCString(const PrintingPolicy &Policy) const {
2531 // The StringRef is null-terminated.
2532 StringRef str = getName(Policy);
2533 assert(!str.empty() && str.data()[str.size()] == '\0')(static_cast<void> (0));
2534 return str.data();
2535 }
2536
2537 bool isSugared() const { return false; }
2538 QualType desugar() const { return QualType(this, 0); }
2539
2540 bool isInteger() const {
2541 return getKind() >= Bool && getKind() <= Int128;
2542 }
2543
2544 bool isSignedInteger() const {
2545 return getKind() >= Char_S && getKind() <= Int128;
2546 }
2547
2548 bool isUnsignedInteger() const {
2549 return getKind() >= Bool && getKind() <= UInt128;
2550 }
2551
2552 bool isFloatingPoint() const {
2553 return getKind() >= Half && getKind() <= Float128;
2554 }
2555
2556 /// Determines whether the given kind corresponds to a placeholder type.
2557 static bool isPlaceholderTypeKind(Kind K) {
2558 return K >= Overload;
2559 }
2560
2561 /// Determines whether this type is a placeholder type, i.e. a type
2562 /// which cannot appear in arbitrary positions in a fully-formed
2563 /// expression.
2564 bool isPlaceholderType() const {
2565 return isPlaceholderTypeKind(getKind());
2566 }
2567
2568 /// Determines whether this type is a placeholder type other than
2569 /// Overload. Most placeholder types require only syntactic
2570 /// information about their context in order to be resolved (e.g.
2571 /// whether it is a call expression), which means they can (and
2572 /// should) be resolved in an earlier "phase" of analysis.
2573 /// Overload expressions sometimes pick up further information
2574 /// from their context, like whether the context expects a
2575 /// specific function-pointer type, and so frequently need
2576 /// special treatment.
2577 bool isNonOverloadPlaceholderType() const {
2578 return getKind() > Overload;
2579 }
2580
2581 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
2582};
2583
2584/// Complex values, per C99 6.2.5p11. This supports the C99 complex
2585/// types (_Complex float etc) as well as the GCC integer complex extensions.
2586class ComplexType : public Type, public llvm::FoldingSetNode {
2587 friend class ASTContext; // ASTContext creates these.
2588
2589 QualType ElementType;
2590
2591 ComplexType(QualType Element, QualType CanonicalPtr)
2592 : Type(Complex, CanonicalPtr, Element->getDependence()),
2593 ElementType(Element) {}
2594
2595public:
2596 QualType getElementType() const { return ElementType; }
2597
2598 bool isSugared() const { return false; }
2599 QualType desugar() const { return QualType(this, 0); }
2600
2601 void Profile(llvm::FoldingSetNodeID &ID) {
2602 Profile(ID, getElementType());
2603 }
2604
2605 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) {
2606 ID.AddPointer(Element.getAsOpaquePtr());
2607 }
2608
2609 static bool classof(const Type *T) { return T->getTypeClass() == Complex; }
2610};
2611
2612/// Sugar for parentheses used when specifying types.
2613class ParenType : public Type, public llvm::FoldingSetNode {
2614 friend class ASTContext; // ASTContext creates these.
2615
2616 QualType Inner;
2617
2618 ParenType(QualType InnerType, QualType CanonType)
2619 : Type(Paren, CanonType, InnerType->getDependence()), Inner(InnerType) {}
2620
2621public:
2622 QualType getInnerType() const { return Inner; }
2623
2624 bool isSugared() const { return true; }
2625 QualType desugar() const { return getInnerType(); }
2626
2627 void Profile(llvm::FoldingSetNodeID &ID) {
2628 Profile(ID, getInnerType());
2629 }
2630
2631 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) {
2632 Inner.Profile(ID);
2633 }
2634
2635 static bool classof(const Type *T) { return T->getTypeClass() == Paren; }
2636};
2637
2638/// PointerType - C99 6.7.5.1 - Pointer Declarators.
2639class PointerType : public Type, public llvm::FoldingSetNode {
2640 friend class ASTContext; // ASTContext creates these.
2641
2642 QualType PointeeType;
2643
2644 PointerType(QualType Pointee, QualType CanonicalPtr)
2645 : Type(Pointer, CanonicalPtr, Pointee->getDependence()),
2646 PointeeType(Pointee) {}
2647
2648public:
2649 QualType getPointeeType() const { return PointeeType; }
2650
2651 bool isSugared() const { return false; }
2652 QualType desugar() const { return QualType(this, 0); }
2653
2654 void Profile(llvm::FoldingSetNodeID &ID) {
2655 Profile(ID, getPointeeType());
2656 }
2657
2658 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2659 ID.AddPointer(Pointee.getAsOpaquePtr());
2660 }
2661
2662 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; }
2663};
2664
2665/// Represents a type which was implicitly adjusted by the semantic
2666/// engine for arbitrary reasons. For example, array and function types can
2667/// decay, and function types can have their calling conventions adjusted.
2668class AdjustedType : public Type, public llvm::FoldingSetNode {
2669 QualType OriginalTy;
2670 QualType AdjustedTy;
2671
2672protected:
2673 friend class ASTContext; // ASTContext creates these.
2674
2675 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy,
2676 QualType CanonicalPtr)
2677 : Type(TC, CanonicalPtr, OriginalTy->getDependence()),
2678 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
2679
2680public:
2681 QualType getOriginalType() const { return OriginalTy; }
2682 QualType getAdjustedType() const { return AdjustedTy; }
2683
2684 bool isSugared() const { return true; }
2685 QualType desugar() const { return AdjustedTy; }
2686
2687 void Profile(llvm::FoldingSetNodeID &ID) {
2688 Profile(ID, OriginalTy, AdjustedTy);
2689 }
2690
2691 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) {
2692 ID.AddPointer(Orig.getAsOpaquePtr());
2693 ID.AddPointer(New.getAsOpaquePtr());
2694 }
2695
2696 static bool classof(const Type *T) {
2697 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
2698 }
2699};
2700
2701/// Represents a pointer type decayed from an array or function type.
2702class DecayedType : public AdjustedType {
2703 friend class ASTContext; // ASTContext creates these.
2704
2705 inline
2706 DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical);
2707
2708public:
2709 QualType getDecayedType() const { return getAdjustedType(); }
2710
2711 inline QualType getPointeeType() const;
2712
2713 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; }
2714};
2715
2716/// Pointer to a block type.
2717/// This type is to represent types syntactically represented as
2718/// "void (^)(int)", etc. Pointee is required to always be a function type.
2719class BlockPointerType : public Type, public llvm::FoldingSetNode {
2720 friend class ASTContext; // ASTContext creates these.
2721
2722 // Block is some kind of pointer type
2723 QualType PointeeType;
2724
2725 BlockPointerType(QualType Pointee, QualType CanonicalCls)
2726 : Type(BlockPointer, CanonicalCls, Pointee->getDependence()),
2727 PointeeType(Pointee) {}
2728
2729public:
2730 // Get the pointee type. Pointee is required to always be a function type.
2731 QualType getPointeeType() const { return PointeeType; }
2732
2733 bool isSugared() const { return false; }
2734 QualType desugar() const { return QualType(this, 0); }
2735
2736 void Profile(llvm::FoldingSetNodeID &ID) {
2737 Profile(ID, getPointeeType());
2738 }
2739
2740 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2741 ID.AddPointer(Pointee.getAsOpaquePtr());
2742 }
2743
2744 static bool classof(const Type *T) {
2745 return T->getTypeClass() == BlockPointer;
2746 }
2747};
2748
2749/// Base for LValueReferenceType and RValueReferenceType
2750class ReferenceType : public Type, public llvm::FoldingSetNode {
2751 QualType PointeeType;
2752
2753protected:
2754 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
2755 bool SpelledAsLValue)
2756 : Type(tc, CanonicalRef, Referencee->getDependence()),
2757 PointeeType(Referencee) {
2758 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue;
2759 ReferenceTypeBits.InnerRef = Referencee->isReferenceType();
2760 }
2761
2762public:
2763 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; }
2764 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; }
2765
2766 QualType getPointeeTypeAsWritten() const { return PointeeType; }
2767
2768 QualType getPointeeType() const {
2769 // FIXME: this might strip inner qualifiers; okay?
2770 const ReferenceType *T = this;
2771 while (T->isInnerRef())
2772 T = T->PointeeType->castAs<ReferenceType>();
2773 return T->PointeeType;
2774 }
2775
2776 void Profile(llvm::FoldingSetNodeID &ID) {
2777 Profile(ID, PointeeType, isSpelledAsLValue());
2778 }
2779
2780 static void Profile(llvm::FoldingSetNodeID &ID,
2781 QualType Referencee,
2782 bool SpelledAsLValue) {
2783 ID.AddPointer(Referencee.getAsOpaquePtr());
2784 ID.AddBoolean(SpelledAsLValue);
2785 }
2786
2787 static bool classof(const Type *T) {
2788 return T->getTypeClass() == LValueReference ||
2789 T->getTypeClass() == RValueReference;
2790 }
2791};
2792
2793/// An lvalue reference type, per C++11 [dcl.ref].
2794class LValueReferenceType : public ReferenceType {
2795 friend class ASTContext; // ASTContext creates these
2796
2797 LValueReferenceType(QualType Referencee, QualType CanonicalRef,
2798 bool SpelledAsLValue)
2799 : ReferenceType(LValueReference, Referencee, CanonicalRef,
2800 SpelledAsLValue) {}
2801
2802public:
2803 bool isSugared() const { return false; }
2804 QualType desugar() const { return QualType(this, 0); }
2805
2806 static bool classof(const Type *T) {
2807 return T->getTypeClass() == LValueReference;
2808 }
2809};
2810
2811/// An rvalue reference type, per C++11 [dcl.ref].
2812class RValueReferenceType : public ReferenceType {
2813 friend class ASTContext; // ASTContext creates these
2814
2815 RValueReferenceType(QualType Referencee, QualType CanonicalRef)
2816 : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {}
2817
2818public:
2819 bool isSugared() const { return false; }
2820 QualType desugar() const { return QualType(this, 0); }
2821
2822 static bool classof(const Type *T) {
2823 return T->getTypeClass() == RValueReference;
2824 }
2825};
2826
2827/// A pointer to member type per C++ 8.3.3 - Pointers to members.
2828///
2829/// This includes both pointers to data members and pointer to member functions.
2830class MemberPointerType : public Type, public llvm::FoldingSetNode {
2831 friend class ASTContext; // ASTContext creates these.
2832
2833 QualType PointeeType;
2834
2835 /// The class of which the pointee is a member. Must ultimately be a
2836 /// RecordType, but could be a typedef or a template parameter too.
2837 const Type *Class;
2838
2839 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr)
2840 : Type(MemberPointer, CanonicalPtr,
2841 (Cls->getDependence() & ~TypeDependence::VariablyModified) |
2842 Pointee->getDependence()),
2843 PointeeType(Pointee), Class(Cls) {}
2844
2845public:
2846 QualType getPointeeType() const { return PointeeType; }
2847
2848 /// Returns true if the member type (i.e. the pointee type) is a
2849 /// function type rather than a data-member type.
2850 bool isMemberFunctionPointer() const {
2851 return PointeeType->isFunctionProtoType();
2852 }
2853
2854 /// Returns true if the member type (i.e. the pointee type) is a
2855 /// data type rather than a function type.
2856 bool isMemberDataPointer() const {
2857 return !PointeeType->isFunctionProtoType();
2858 }
2859
2860 const Type *getClass() const { return Class; }
2861 CXXRecordDecl *getMostRecentCXXRecordDecl() const;
2862
2863 bool isSugared() const { return false; }
2864 QualType desugar() const { return QualType(this, 0); }
2865
2866 void Profile(llvm::FoldingSetNodeID &ID) {
2867 Profile(ID, getPointeeType(), getClass());
2868 }
2869
2870 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee,
2871 const Type *Class) {
2872 ID.AddPointer(Pointee.getAsOpaquePtr());
2873 ID.AddPointer(Class);
2874 }
2875
2876 static bool classof(const Type *T) {
2877 return T->getTypeClass() == MemberPointer;
2878 }
2879};
2880
2881/// Represents an array type, per C99 6.7.5.2 - Array Declarators.
2882class ArrayType : public Type, public llvm::FoldingSetNode {
2883public:
2884 /// Capture whether this is a normal array (e.g. int X[4])
2885 /// an array with a static size (e.g. int X[static 4]), or an array
2886 /// with a star size (e.g. int X[*]).
2887 /// 'static' is only allowed on function parameters.
2888 enum ArraySizeModifier {
2889 Normal, Static, Star
2890 };
2891
2892private:
2893 /// The element type of the array.
2894 QualType ElementType;
2895
2896protected:
2897 friend class ASTContext; // ASTContext creates these.
2898
2899 ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm,
2900 unsigned tq, const Expr *sz = nullptr);
2901
2902public:
2903 QualType getElementType() const { return ElementType; }
2904
2905 ArraySizeModifier getSizeModifier() const {
2906 return ArraySizeModifier(ArrayTypeBits.SizeModifier);
2907 }
2908
2909 Qualifiers getIndexTypeQualifiers() const {
2910 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers());
2911 }
2912
2913 unsigned getIndexTypeCVRQualifiers() const {
2914 return ArrayTypeBits.IndexTypeQuals;
2915 }
2916
2917 static bool classof(const Type *T) {
2918 return T->getTypeClass() == ConstantArray ||
2919 T->getTypeClass() == VariableArray ||
2920 T->getTypeClass() == IncompleteArray ||
2921 T->getTypeClass() == DependentSizedArray;
2922 }
2923};
2924
2925/// Represents the canonical version of C arrays with a specified constant size.
2926/// For example, the canonical type for 'int A[4 + 4*100]' is a
2927/// ConstantArrayType where the element type is 'int' and the size is 404.
2928class ConstantArrayType final
2929 : public ArrayType,
2930 private llvm::TrailingObjects<ConstantArrayType, const Expr *> {
2931 friend class ASTContext; // ASTContext creates these.
2932 friend TrailingObjects;
2933
2934 llvm::APInt Size; // Allows us to unique the type.
2935
2936 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size,
2937 const Expr *sz, ArraySizeModifier sm, unsigned tq)
2938 : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) {
2939 ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr;
2940 if (ConstantArrayTypeBits.HasStoredSizeExpr) {
2941 assert(!can.isNull() && "canonical constant array should not have size")(static_cast<void> (0));
2942 *getTrailingObjects<const Expr*>() = sz;
2943 }
2944 }
2945
2946 unsigned numTrailingObjects(OverloadToken<const Expr*>) const {
2947 return ConstantArrayTypeBits.HasStoredSizeExpr;
2948 }
2949
2950public:
2951 const llvm::APInt &getSize() const { return Size; }
2952 const Expr *getSizeExpr() const {
2953 return ConstantArrayTypeBits.HasStoredSizeExpr
2954 ? *getTrailingObjects<const Expr *>()
2955 : nullptr;
2956 }
2957 bool isSugared() const { return false; }
2958 QualType desugar() const { return QualType(this, 0); }
2959
2960 /// Determine the number of bits required to address a member of
2961 // an array with the given element type and number of elements.
2962 static unsigned getNumAddressingBits(const ASTContext &Context,
2963 QualType ElementType,
2964 const llvm::APInt &NumElements);
2965
2966 /// Determine the maximum number of active bits that an array's size
2967 /// can require, which limits the maximum size of the array.
2968 static unsigned getMaxSizeBits(const ASTContext &Context);
2969
2970 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
2971 Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(),
2972 getSizeModifier(), getIndexTypeCVRQualifiers());
2973 }
2974
2975 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx,
2976 QualType ET, const llvm::APInt &ArraySize,
2977 const Expr *SizeExpr, ArraySizeModifier SizeMod,
2978 unsigned TypeQuals);
2979
2980 static bool classof(const Type *T) {
2981 return T->getTypeClass() == ConstantArray;
2982 }
2983};
2984
2985/// Represents a C array with an unspecified size. For example 'int A[]' has
2986/// an IncompleteArrayType where the element type is 'int' and the size is
2987/// unspecified.
2988class IncompleteArrayType : public ArrayType {
2989 friend class ASTContext; // ASTContext creates these.
2990
2991 IncompleteArrayType(QualType et, QualType can,
2992 ArraySizeModifier sm, unsigned tq)
2993 : ArrayType(IncompleteArray, et, can, sm, tq) {}
2994
2995public:
2996 friend class StmtIteratorBase;
2997
2998 bool isSugared() const { return false; }
2999 QualType desugar() const { return QualType(this, 0); }
3000
3001 static bool classof(const Type *T) {
3002 return T->getTypeClass() == IncompleteArray;
3003 }
3004
3005 void Profile(llvm::FoldingSetNodeID &ID) {
3006 Profile(ID, getElementType(), getSizeModifier(),
3007 getIndexTypeCVRQualifiers());
3008 }
3009
3010 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET,
3011 ArraySizeModifier SizeMod, unsigned TypeQuals) {
3012 ID.AddPointer(ET.getAsOpaquePtr());
3013 ID.AddInteger(SizeMod);
3014 ID.AddInteger(TypeQuals);
3015 }
3016};
3017
3018/// Represents a C array with a specified size that is not an
3019/// integer-constant-expression. For example, 'int s[x+foo()]'.
3020/// Since the size expression is an arbitrary expression, we store it as such.
3021///
3022/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and
3023/// should not be: two lexically equivalent variable array types could mean
3024/// different things, for example, these variables do not have the same type
3025/// dynamically:
3026///
3027/// void foo(int x) {
3028/// int Y[x];
3029/// ++x;
3030/// int Z[x];
3031/// }
3032class VariableArrayType : public ArrayType {
3033 friend class ASTContext; // ASTContext creates these.
3034
3035 /// An assignment-expression. VLA's are only permitted within
3036 /// a function block.
3037 Stmt *SizeExpr;
3038
3039 /// The range spanned by the left and right array brackets.
3040 SourceRange Brackets;
3041
3042 VariableArrayType(QualType et, QualType can, Expr *e,
3043 ArraySizeModifier sm, unsigned tq,
3044 SourceRange brackets)
3045 : ArrayType(VariableArray, et, can, sm, tq, e),
3046 SizeExpr((Stmt*) e), Brackets(brackets) {}
3047
3048public:
3049 friend class StmtIteratorBase;
3050
3051 Expr *getSizeExpr() const {
3052 // We use C-style casts instead of cast<> here because we do not wish
3053 // to have a dependency of Type.h on Stmt.h/Expr.h.
3054 return (Expr*) SizeExpr;
3055 }
3056
3057 SourceRange getBracketsRange() const { return Brackets; }
3058 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3059 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3060
3061 bool isSugared() const { return false; }
3062 QualType desugar() const { return QualType(this, 0); }
3063
3064 static bool classof(const Type *T) {
3065 return T->getTypeClass() == VariableArray;
3066 }
3067
3068 void Profile(llvm::FoldingSetNodeID &ID) {
3069 llvm_unreachable("Cannot unique VariableArrayTypes.")__builtin_unreachable();
3070 }
3071};
3072
3073/// Represents an array type in C++ whose size is a value-dependent expression.
3074///
3075/// For example:
3076/// \code
3077/// template<typename T, int Size>
3078/// class array {
3079/// T data[Size];
3080/// };
3081/// \endcode
3082///
3083/// For these types, we won't actually know what the array bound is
3084/// until template instantiation occurs, at which point this will
3085/// become either a ConstantArrayType or a VariableArrayType.
3086class DependentSizedArrayType : public ArrayType {
3087 friend class ASTContext; // ASTContext creates these.
3088
3089 const ASTContext &Context;
3090
3091 /// An assignment expression that will instantiate to the
3092 /// size of the array.
3093 ///
3094 /// The expression itself might be null, in which case the array
3095 /// type will have its size deduced from an initializer.
3096 Stmt *SizeExpr;
3097
3098 /// The range spanned by the left and right array brackets.
3099 SourceRange Brackets;
3100
3101 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can,
3102 Expr *e, ArraySizeModifier sm, unsigned tq,
3103 SourceRange brackets);
3104
3105public:
3106 friend class StmtIteratorBase;
3107
3108 Expr *getSizeExpr() const {
3109 // We use C-style casts instead of cast<> here because we do not wish
3110 // to have a dependency of Type.h on Stmt.h/Expr.h.
3111 return (Expr*) SizeExpr;
3112 }
3113
3114 SourceRange getBracketsRange() const { return Brackets; }
3115 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3116 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3117
3118 bool isSugared() const { return false; }
3119 QualType desugar() const { return QualType(this, 0); }
3120
3121 static bool classof(const Type *T) {
3122 return T->getTypeClass() == DependentSizedArray;
3123 }
3124
3125 void Profile(llvm::FoldingSetNodeID &ID) {
3126 Profile(ID, Context, getElementType(),
3127 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr());
3128 }
3129
3130 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3131 QualType ET, ArraySizeModifier SizeMod,
3132 unsigned TypeQuals, Expr *E);
3133};
3134
3135/// Represents an extended address space qualifier where the input address space
3136/// value is dependent. Non-dependent address spaces are not represented with a
3137/// special Type subclass; they are stored on an ExtQuals node as part of a QualType.
3138///
3139/// For example:
3140/// \code
3141/// template<typename T, int AddrSpace>
3142/// class AddressSpace {
3143/// typedef T __attribute__((address_space(AddrSpace))) type;
3144/// }
3145/// \endcode
3146class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode {
3147 friend class ASTContext;
3148
3149 const ASTContext &Context;
3150 Expr *AddrSpaceExpr;
3151 QualType PointeeType;
3152 SourceLocation loc;
3153
3154 DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType,
3155 QualType can, Expr *AddrSpaceExpr,
3156 SourceLocation loc);
3157
3158public:
3159 Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; }
3160 QualType getPointeeType() const { return PointeeType; }
3161 SourceLocation getAttributeLoc() const { return loc; }
3162
3163 bool isSugared() const { return false; }
3164 QualType desugar() const { return QualType(this, 0); }
3165
3166 static bool classof(const Type *T) {
3167 return T->getTypeClass() == DependentAddressSpace;
3168 }
3169
3170 void Profile(llvm::FoldingSetNodeID &ID) {
3171 Profile(ID, Context, getPointeeType(), getAddrSpaceExpr());
3172 }
3173
3174 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3175 QualType PointeeType, Expr *AddrSpaceExpr);
3176};
3177
3178/// Represents an extended vector type where either the type or size is
3179/// dependent.
3180///
3181/// For example:
3182/// \code
3183/// template<typename T, int Size>
3184/// class vector {
3185/// typedef T __attribute__((ext_vector_type(Size))) type;
3186/// }
3187/// \endcode
3188class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode {
3189 friend class ASTContext;
3190
3191 const ASTContext &Context;
3192 Expr *SizeExpr;
3193
3194 /// The element type of the array.
3195 QualType ElementType;
3196
3197 SourceLocation loc;
3198
3199 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType,
3200 QualType can, Expr *SizeExpr, SourceLocation loc);
3201
3202public:
3203 Expr *getSizeExpr() const { return SizeExpr; }
3204 QualType getElementType() const { return ElementType; }
3205 SourceLocation getAttributeLoc() const { return loc; }
3206
3207 bool isSugared() const { return false; }
3208 QualType desugar() const { return QualType(this, 0); }
3209
3210 static bool classof(const Type *T) {
3211 return T->getTypeClass() == DependentSizedExtVector;
3212 }
3213
3214 void Profile(llvm::FoldingSetNodeID &ID) {
3215 Profile(ID, Context, getElementType(), getSizeExpr());
3216 }
3217
3218 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3219 QualType ElementType, Expr *SizeExpr);
3220};
3221
3222
3223/// Represents a GCC generic vector type. This type is created using
3224/// __attribute__((vector_size(n)), where "n" specifies the vector size in
3225/// bytes; or from an Altivec __vector or vector declaration.
3226/// Since the constructor takes the number of vector elements, the
3227/// client is responsible for converting the size into the number of elements.
3228class VectorType : public Type, public llvm::FoldingSetNode {
3229public:
3230 enum VectorKind {
3231 /// not a target-specific vector type
3232 GenericVector,
3233
3234 /// is AltiVec vector
3235 AltiVecVector,
3236
3237 /// is AltiVec 'vector Pixel'
3238 AltiVecPixel,
3239
3240 /// is AltiVec 'vector bool ...'
3241 AltiVecBool,
3242
3243 /// is ARM Neon vector
3244 NeonVector,
3245
3246 /// is ARM Neon polynomial vector
3247 NeonPolyVector,
3248
3249 /// is AArch64 SVE fixed-length data vector
3250 SveFixedLengthDataVector,
3251
3252 /// is AArch64 SVE fixed-length predicate vector
3253 SveFixedLengthPredicateVector
3254 };
3255
3256protected:
3257 friend class ASTContext; // ASTContext creates these.
3258
3259 /// The element type of the vector.
3260 QualType ElementType;
3261
3262 VectorType(QualType vecType, unsigned nElements, QualType canonType,
3263 VectorKind vecKind);
3264
3265 VectorType(TypeClass tc, QualType vecType, unsigned nElements,
3266 QualType canonType, VectorKind vecKind);
3267
3268public:
3269 QualType getElementType() const { return ElementType; }
3270 unsigned getNumElements() const { return VectorTypeBits.NumElements; }
3271
3272 bool isSugared() const { return false; }
3273 QualType desugar() const { return QualType(this, 0); }
3274
3275 VectorKind getVectorKind() const {
3276 return VectorKind(VectorTypeBits.VecKind);
3277 }
3278
3279 void Profile(llvm::FoldingSetNodeID &ID) {
3280 Profile(ID, getElementType(), getNumElements(),
3281 getTypeClass(), getVectorKind());
3282 }
3283
3284 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3285 unsigned NumElements, TypeClass TypeClass,
3286 VectorKind VecKind) {
3287 ID.AddPointer(ElementType.getAsOpaquePtr());
3288 ID.AddInteger(NumElements);
3289 ID.AddInteger(TypeClass);
3290 ID.AddInteger(VecKind);
3291 }
3292
3293 static bool classof(const Type *T) {
3294 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector;
3295 }
3296};
3297
3298/// Represents a vector type where either the type or size is dependent.
3299////
3300/// For example:
3301/// \code
3302/// template<typename T, int Size>
3303/// class vector {
3304/// typedef T __attribute__((vector_size(Size))) type;
3305/// }
3306/// \endcode
3307class DependentVectorType : public Type, public llvm::FoldingSetNode {
3308 friend class ASTContext;
3309
3310 const ASTContext &Context;
3311 QualType ElementType;
3312 Expr *SizeExpr;
3313 SourceLocation Loc;
3314
3315 DependentVectorType(const ASTContext &Context, QualType ElementType,
3316 QualType CanonType, Expr *SizeExpr,
3317 SourceLocation Loc, VectorType::VectorKind vecKind);
3318
3319public:
3320 Expr *getSizeExpr() const { return SizeExpr; }
3321 QualType getElementType() const { return ElementType; }
3322 SourceLocation getAttributeLoc() const { return Loc; }
3323 VectorType::VectorKind getVectorKind() const {
3324 return VectorType::VectorKind(VectorTypeBits.VecKind);
3325 }
3326
3327 bool isSugared() const { return false; }
3328 QualType desugar() const { return QualType(this, 0); }
3329
3330 static bool classof(const Type *T) {
3331 return T->getTypeClass() == DependentVector;
3332 }
3333
3334 void Profile(llvm::FoldingSetNodeID &ID) {
3335 Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind());
3336 }
3337
3338 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3339 QualType ElementType, const Expr *SizeExpr,
3340 VectorType::VectorKind VecKind);
3341};
3342
3343/// ExtVectorType - Extended vector type. This type is created using
3344/// __attribute__((ext_vector_type(n)), where "n" is the number of elements.
3345/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This
3346/// class enables syntactic extensions, like Vector Components for accessing
3347/// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL
3348/// Shading Language).
3349class ExtVectorType : public VectorType {
3350 friend class ASTContext; // ASTContext creates these.
3351
3352 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType)
3353 : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {}
3354
3355public:
3356 static int getPointAccessorIdx(char c) {
3357 switch (c) {
3358 default: return -1;
3359 case 'x': case 'r': return 0;
3360 case 'y': case 'g': return 1;
3361 case 'z': case 'b': return 2;
3362 case 'w': case 'a': return 3;
3363 }
3364 }
3365
3366 static int getNumericAccessorIdx(char c) {
3367 switch (c) {
3368 default: return -1;
3369 case '0': return 0;
3370 case '1': return 1;
3371 case '2': return 2;
3372 case '3': return 3;
3373 case '4': return 4;
3374 case '5': return 5;
3375 case '6': return 6;
3376 case '7': return 7;
3377 case '8': return 8;
3378 case '9': return 9;
3379 case 'A':
3380 case 'a': return 10;
3381 case 'B':
3382 case 'b': return 11;
3383 case 'C':
3384 case 'c': return 12;
3385 case 'D':
3386 case 'd': return 13;
3387 case 'E':
3388 case 'e': return 14;
3389 case 'F':
3390 case 'f': return 15;
3391 }
3392 }
3393
3394 static int getAccessorIdx(char c, bool isNumericAccessor) {
3395 if (isNumericAccessor)
3396 return getNumericAccessorIdx(c);
3397 else
3398 return getPointAccessorIdx(c);
3399 }
3400
3401 bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const {
3402 if (int idx = getAccessorIdx(c, isNumericAccessor)+1)
3403 return unsigned(idx-1) < getNumElements();
3404 return false;
3405 }
3406
3407 bool isSugared() const { return false; }
3408 QualType desugar() const { return QualType(this, 0); }
3409
3410 static bool classof(const Type *T) {
3411 return T->getTypeClass() == ExtVector;
3412 }
3413};
3414
3415/// Represents a matrix type, as defined in the Matrix Types clang extensions.
3416/// __attribute__((matrix_type(rows, columns))), where "rows" specifies
3417/// number of rows and "columns" specifies the number of columns.
3418class MatrixType : public Type, public llvm::FoldingSetNode {
3419protected:
3420 friend class ASTContext;
3421
3422 /// The element type of the matrix.
3423 QualType ElementType;
3424
3425 MatrixType(QualType ElementTy, QualType CanonElementTy);
3426
3427 MatrixType(TypeClass TypeClass, QualType ElementTy, QualType CanonElementTy,
3428 const Expr *RowExpr = nullptr, const Expr *ColumnExpr = nullptr);
3429
3430public:
3431 /// Returns type of the elements being stored in the matrix
3432 QualType getElementType() const { return ElementType; }
3433
3434 /// Valid elements types are the following:
3435 /// * an integer type (as in C2x 6.2.5p19), but excluding enumerated types
3436 /// and _Bool
3437 /// * the standard floating types float or double
3438 /// * a half-precision floating point type, if one is supported on the target
3439 static bool isValidElementType(QualType T) {
3440 return T->isDependentType() ||
3441 (T->isRealType() && !T->isBooleanType() && !T->isEnumeralType());
3442 }
3443
3444 bool isSugared() const { return false; }
3445 QualType desugar() const { return QualType(this, 0); }
3446
3447 static bool classof(const Type *T) {
3448 return T->getTypeClass() == ConstantMatrix ||
3449 T->getTypeClass() == DependentSizedMatrix;
3450 }
3451};
3452
3453/// Represents a concrete matrix type with constant number of rows and columns
3454class ConstantMatrixType final : public MatrixType {
3455protected:
3456 friend class ASTContext;
3457
3458 /// Number of rows and columns.
3459 unsigned NumRows;
3460 unsigned NumColumns;
3461
3462 static constexpr unsigned MaxElementsPerDimension = (1 << 20) - 1;
3463
3464 ConstantMatrixType(QualType MatrixElementType, unsigned NRows,
3465 unsigned NColumns, QualType CanonElementType);
3466
3467 ConstantMatrixType(TypeClass typeClass, QualType MatrixType, unsigned NRows,
3468 unsigned NColumns, QualType CanonElementType);
3469
3470public:
3471 /// Returns the number of rows in the matrix.
3472 unsigned getNumRows() const { return NumRows; }
3473
3474 /// Returns the number of columns in the matrix.
3475 unsigned getNumColumns() const { return NumColumns; }
3476
3477 /// Returns the number of elements required to embed the matrix into a vector.
3478 unsigned getNumElementsFlattened() const {
3479 return getNumRows() * getNumColumns();
3480 }
3481
3482 /// Returns true if \p NumElements is a valid matrix dimension.
3483 static constexpr bool isDimensionValid(size_t NumElements) {
3484 return NumElements > 0 && NumElements <= MaxElementsPerDimension;
3485 }
3486
3487 /// Returns the maximum number of elements per dimension.
3488 static constexpr unsigned getMaxElementsPerDimension() {
3489 return MaxElementsPerDimension;
3490 }
3491
3492 void Profile(llvm::FoldingSetNodeID &ID) {
3493 Profile(ID, getElementType(), getNumRows(), getNumColumns(),
3494 getTypeClass());
3495 }
3496
3497 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3498 unsigned NumRows, unsigned NumColumns,
3499 TypeClass TypeClass) {
3500 ID.AddPointer(ElementType.getAsOpaquePtr());
3501 ID.AddInteger(NumRows);
3502 ID.AddInteger(NumColumns);
3503 ID.AddInteger(TypeClass);
3504 }
3505
3506 static bool classof(const Type *T) {
3507 return T->getTypeClass() == ConstantMatrix;
3508 }
3509};
3510
3511/// Represents a matrix type where the type and the number of rows and columns
3512/// is dependent on a template.
3513class DependentSizedMatrixType final : public MatrixType {
3514 friend class ASTContext;
3515
3516 const ASTContext &Context;
3517 Expr *RowExpr;
3518 Expr *ColumnExpr;
3519
3520 SourceLocation loc;
3521
3522 DependentSizedMatrixType(const ASTContext &Context, QualType ElementType,
3523 QualType CanonicalType, Expr *RowExpr,
3524 Expr *ColumnExpr, SourceLocation loc);
3525
3526public:
3527 Expr *getRowExpr() const { return RowExpr; }
3528 Expr *getColumnExpr() const { return ColumnExpr; }
3529 SourceLocation getAttributeLoc() const { return loc; }
3530
3531 static bool classof(const Type *T) {
3532 return T->getTypeClass() == DependentSizedMatrix;
3533 }
3534
3535 void Profile(llvm::FoldingSetNodeID &ID) {
3536 Profile(ID, Context, getElementType(), getRowExpr(), getColumnExpr());
3537 }
3538
3539 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3540 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr);
3541};
3542
3543/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base
3544/// class of FunctionNoProtoType and FunctionProtoType.
3545class FunctionType : public Type {
3546 // The type returned by the function.
3547 QualType ResultType;
3548
3549public:
3550 /// Interesting information about a specific parameter that can't simply
3551 /// be reflected in parameter's type. This is only used by FunctionProtoType
3552 /// but is in FunctionType to make this class available during the
3553 /// specification of the bases of FunctionProtoType.
3554 ///
3555 /// It makes sense to model language features this way when there's some
3556 /// sort of parameter-specific override (such as an attribute) that
3557 /// affects how the function is called. For example, the ARC ns_consumed
3558 /// attribute changes whether a parameter is passed at +0 (the default)
3559 /// or +1 (ns_consumed). This must be reflected in the function type,
3560 /// but isn't really a change to the parameter type.
3561 ///
3562 /// One serious disadvantage of modelling language features this way is
3563 /// that they generally do not work with language features that attempt
3564 /// to destructure types. For example, template argument deduction will
3565 /// not be able to match a parameter declared as
3566 /// T (*)(U)
3567 /// against an argument of type
3568 /// void (*)(__attribute__((ns_consumed)) id)
3569 /// because the substitution of T=void, U=id into the former will
3570 /// not produce the latter.
3571 class ExtParameterInfo {
3572 enum {
3573 ABIMask = 0x0F,
3574 IsConsumed = 0x10,
3575 HasPassObjSize = 0x20,
3576 IsNoEscape = 0x40,
3577 };
3578 unsigned char Data = 0;
3579
3580 public:
3581 ExtParameterInfo() = default;
3582
3583 /// Return the ABI treatment of this parameter.
3584 ParameterABI getABI() const { return ParameterABI(Data & ABIMask); }
3585 ExtParameterInfo withABI(ParameterABI kind) const {
3586 ExtParameterInfo copy = *this;
3587 copy.Data = (copy.Data & ~ABIMask) | unsigned(kind);
3588 return copy;
3589 }
3590
3591 /// Is this parameter considered "consumed" by Objective-C ARC?
3592 /// Consumed parameters must have retainable object type.
3593 bool isConsumed() const { return (Data & IsConsumed); }
3594 ExtParameterInfo withIsConsumed(bool consumed) const {
3595 ExtParameterInfo copy = *this;
3596 if (consumed)
3597 copy.Data |= IsConsumed;
3598 else
3599 copy.Data &= ~IsConsumed;
3600 return copy;
3601 }
3602
3603 bool hasPassObjectSize() const { return Data & HasPassObjSize; }
3604 ExtParameterInfo withHasPassObjectSize() const {
3605 ExtParameterInfo Copy = *this;
3606 Copy.Data |= HasPassObjSize;
3607 return Copy;
3608 }
3609
3610 bool isNoEscape() const { return Data & IsNoEscape; }
3611 ExtParameterInfo withIsNoEscape(bool NoEscape) const {
3612 ExtParameterInfo Copy = *this;
3613 if (NoEscape)
3614 Copy.Data |= IsNoEscape;
3615 else
3616 Copy.Data &= ~IsNoEscape;
3617 return Copy;
3618 }
3619
3620 unsigned char getOpaqueValue() const { return Data; }
3621 static ExtParameterInfo getFromOpaqueValue(unsigned char data) {
3622 ExtParameterInfo result;
3623 result.Data = data;
3624 return result;
3625 }
3626
3627 friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3628 return lhs.Data == rhs.Data;
3629 }
3630
3631 friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3632 return lhs.Data != rhs.Data;
3633 }
3634 };
3635
3636 /// A class which abstracts out some details necessary for
3637 /// making a call.
3638 ///
3639 /// It is not actually used directly for storing this information in
3640 /// a FunctionType, although FunctionType does currently use the
3641 /// same bit-pattern.
3642 ///
3643 // If you add a field (say Foo), other than the obvious places (both,
3644 // constructors, compile failures), what you need to update is
3645 // * Operator==
3646 // * getFoo
3647 // * withFoo
3648 // * functionType. Add Foo, getFoo.
3649 // * ASTContext::getFooType
3650 // * ASTContext::mergeFunctionTypes
3651 // * FunctionNoProtoType::Profile
3652 // * FunctionProtoType::Profile
3653 // * TypePrinter::PrintFunctionProto
3654 // * AST read and write
3655 // * Codegen
3656 class ExtInfo {
3657 friend class FunctionType;
3658
3659 // Feel free to rearrange or add bits, but if you go over 16, you'll need to
3660 // adjust the Bits field below, and if you add bits, you'll need to adjust
3661 // Type::FunctionTypeBitfields::ExtInfo as well.
3662
3663 // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|cmsenscall|
3664 // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 | 12 |
3665 //
3666 // regparm is either 0 (no regparm attribute) or the regparm value+1.
3667 enum { CallConvMask = 0x1F };
3668 enum { NoReturnMask = 0x20 };
3669 enum { ProducesResultMask = 0x40 };
3670 enum { NoCallerSavedRegsMask = 0x80 };
3671 enum {
3672 RegParmMask = 0x700,
3673 RegParmOffset = 8
3674 };
3675 enum { NoCfCheckMask = 0x800 };
3676 enum { CmseNSCallMask = 0x1000 };
3677 uint16_t Bits = CC_C;
3678
3679 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
3680
3681 public:
3682 // Constructor with no defaults. Use this when you know that you
3683 // have all the elements (when reading an AST file for example).
3684 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
3685 bool producesResult, bool noCallerSavedRegs, bool NoCfCheck,
3686 bool cmseNSCall) {
3687 assert((!hasRegParm || regParm < 7) && "Invalid regparm value")(static_cast<void> (0));
3688 Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) |
3689 (producesResult ? ProducesResultMask : 0) |
3690 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
3691 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
3692 (NoCfCheck ? NoCfCheckMask : 0) |
3693 (cmseNSCall ? CmseNSCallMask : 0);
3694 }
3695
3696 // Constructor with all defaults. Use when for example creating a
3697 // function known to use defaults.
3698 ExtInfo() = default;
3699
3700 // Constructor with just the calling convention, which is an important part
3701 // of the canonical type.
3702 ExtInfo(CallingConv CC) : Bits(CC) {}
3703
3704 bool getNoReturn() const { return Bits & NoReturnMask; }
3705 bool getProducesResult() const { return Bits & ProducesResultMask; }
3706 bool getCmseNSCall() const { return Bits & CmseNSCallMask; }
3707 bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; }
3708 bool getNoCfCheck() const { return Bits & NoCfCheckMask; }
3709 bool getHasRegParm() const { return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
3710
3711 unsigned getRegParm() const {
3712 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
3713 if (RegParm > 0)
3714 --RegParm;
3715 return RegParm;
3716 }
3717
3718 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
3719
3720 bool operator==(ExtInfo Other) const {
3721 return Bits == Other.Bits;
3722 }
3723 bool operator!=(ExtInfo Other) const {
3724 return Bits != Other.Bits;
3725 }
3726
3727 // Note that we don't have setters. That is by design, use
3728 // the following with methods instead of mutating these objects.
3729
3730 ExtInfo withNoReturn(bool noReturn) const {
3731 if (noReturn)
3732 return ExtInfo(Bits | NoReturnMask);
3733 else
3734 return ExtInfo(Bits & ~NoReturnMask);
3735 }
3736
3737 ExtInfo withProducesResult(bool producesResult) const {
3738 if (producesResult)
3739 return ExtInfo(Bits | ProducesResultMask);
3740 else
3741 return ExtInfo(Bits & ~ProducesResultMask);
3742 }
3743
3744 ExtInfo withCmseNSCall(bool cmseNSCall) const {
3745 if (cmseNSCall)
3746 return ExtInfo(Bits | CmseNSCallMask);
3747 else
3748 return ExtInfo(Bits & ~CmseNSCallMask);
3749 }
3750
3751 ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const {
3752 if (noCallerSavedRegs)
3753 return ExtInfo(Bits | NoCallerSavedRegsMask);
3754 else
3755 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
3756 }
3757
3758 ExtInfo withNoCfCheck(bool noCfCheck) const {
3759 if (noCfCheck)
3760 return ExtInfo(Bits | NoCfCheckMask);
3761 else
3762 return ExtInfo(Bits & ~NoCfCheckMask);
3763 }
3764
3765 ExtInfo withRegParm(unsigned RegParm) const {
3766 assert(RegParm < 7 && "Invalid regparm value")(static_cast<void> (0));
3767 return ExtInfo((Bits & ~RegParmMask) |
3768 ((RegParm + 1) << RegParmOffset));
3769 }
3770
3771 ExtInfo withCallingConv(CallingConv cc) const {
3772 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc);
3773 }
3774
3775 void Profile(llvm::FoldingSetNodeID &ID) const {
3776 ID.AddInteger(Bits);
3777 }
3778 };
3779
3780 /// A simple holder for a QualType representing a type in an
3781 /// exception specification. Unfortunately needed by FunctionProtoType
3782 /// because TrailingObjects cannot handle repeated types.
3783 struct ExceptionType { QualType Type; };
3784
3785 /// A simple holder for various uncommon bits which do not fit in
3786 /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the
3787 /// alignment of subsequent objects in TrailingObjects. You must update
3788 /// hasExtraBitfields in FunctionProtoType after adding extra data here.
3789 struct alignas(void *) FunctionTypeExtraBitfields {
3790 /// The number of types in the exception specification.
3791 /// A whole unsigned is not needed here and according to
3792 /// [implimits] 8 bits would be enough here.
3793 unsigned NumExceptionType;
3794 };
3795
3796protected:
3797 FunctionType(TypeClass tc, QualType res, QualType Canonical,
3798 TypeDependence Dependence, ExtInfo Info)
3799 : Type(tc, Canonical, Dependence), ResultType(res) {
3800 FunctionTypeBits.ExtInfo = Info.Bits;
3801 }
3802
3803 Qualifiers getFastTypeQuals() const {
3804 return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals);
3805 }
3806
3807public:
3808 QualType getReturnType() const { return ResultType; }
3809
3810 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); }
3811 unsigned getRegParmType() const { return getExtInfo().getRegParm(); }
3812
3813 /// Determine whether this function type includes the GNU noreturn
3814 /// attribute. The C++11 [[noreturn]] attribute does not affect the function
3815 /// type.
3816 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); }
3817
3818 bool getCmseNSCallAttr() const { return getExtInfo().getCmseNSCall(); }
3819 CallingConv getCallConv() const { return getExtInfo().getCC(); }
3820 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); }
3821
3822 static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0,
3823 "Const, volatile and restrict are assumed to be a subset of "
3824 "the fast qualifiers.");
3825
3826 bool isConst() const { return getFastTypeQuals().hasConst(); }
3827 bool isVolatile() const { return getFastTypeQuals().hasVolatile(); }
3828 bool isRestrict() const { return getFastTypeQuals().hasRestrict(); }
3829
3830 /// Determine the type of an expression that calls a function of
3831 /// this type.
3832 QualType getCallResultType(const ASTContext &Context) const {
3833 return getReturnType().getNonLValueExprType(Context);
3834 }
3835
3836 static StringRef getNameForCallConv(CallingConv CC);
3837
3838 static bool classof(const Type *T) {
3839 return T->getTypeClass() == FunctionNoProto ||
3840 T->getTypeClass() == FunctionProto;
3841 }
3842};
3843
3844/// Represents a K&R-style 'int foo()' function, which has
3845/// no information available about its arguments.
3846class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode {
3847 friend class ASTContext; // ASTContext creates these.
3848
3849 FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info)
3850 : FunctionType(FunctionNoProto, Result, Canonical,
3851 Result->getDependence() &
3852 ~(TypeDependence::DependentInstantiation |
3853 TypeDependence::UnexpandedPack),
3854 Info) {}
3855
3856public:
3857 // No additional state past what FunctionType provides.
3858
3859 bool isSugared() const { return false; }
3860 QualType desugar() const { return QualType(this, 0); }
3861
3862 void Profile(llvm::FoldingSetNodeID &ID) {
3863 Profile(ID, getReturnType(), getExtInfo());
3864 }
3865
3866 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType,
3867 ExtInfo Info) {
3868 Info.Profile(ID);
3869 ID.AddPointer(ResultType.getAsOpaquePtr());
3870 }
3871
3872 static bool classof(const Type *T) {
3873 return T->getTypeClass() == FunctionNoProto;
3874 }
3875};
3876
3877/// Represents a prototype with parameter type info, e.g.
3878/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no
3879/// parameters, not as having a single void parameter. Such a type can have
3880/// an exception specification, but this specification is not part of the
3881/// canonical type. FunctionProtoType has several trailing objects, some of
3882/// which optional. For more information about the trailing objects see
3883/// the first comment inside FunctionProtoType.
3884class FunctionProtoType final
3885 : public FunctionType,
3886 public llvm::FoldingSetNode,
3887 private llvm::TrailingObjects<
3888 FunctionProtoType, QualType, SourceLocation,
3889 FunctionType::FunctionTypeExtraBitfields, FunctionType::ExceptionType,
3890 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers> {
3891 friend class ASTContext; // ASTContext creates these.
3892 friend TrailingObjects;
3893
3894 // FunctionProtoType is followed by several trailing objects, some of
3895 // which optional. They are in order:
3896 //
3897 // * An array of getNumParams() QualType holding the parameter types.
3898 // Always present. Note that for the vast majority of FunctionProtoType,
3899 // these will be the only trailing objects.
3900 //
3901 // * Optionally if the function is variadic, the SourceLocation of the
3902 // ellipsis.
3903 //
3904 // * Optionally if some extra data is stored in FunctionTypeExtraBitfields
3905 // (see FunctionTypeExtraBitfields and FunctionTypeBitfields):
3906 // a single FunctionTypeExtraBitfields. Present if and only if
3907 // hasExtraBitfields() is true.
3908 //
3909 // * Optionally exactly one of:
3910 // * an array of getNumExceptions() ExceptionType,
3911 // * a single Expr *,
3912 // * a pair of FunctionDecl *,
3913 // * a single FunctionDecl *
3914 // used to store information about the various types of exception
3915 // specification. See getExceptionSpecSize for the details.
3916 //
3917 // * Optionally an array of getNumParams() ExtParameterInfo holding
3918 // an ExtParameterInfo for each of the parameters. Present if and
3919 // only if hasExtParameterInfos() is true.
3920 //
3921 // * Optionally a Qualifiers object to represent extra qualifiers that can't
3922 // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and only
3923 // if hasExtQualifiers() is true.
3924 //
3925 // The optional FunctionTypeExtraBitfields has to be before the data
3926 // related to the exception specification since it contains the number
3927 // of exception types.
3928 //
3929 // We put the ExtParameterInfos last. If all were equal, it would make
3930 // more sense to put these before the exception specification, because
3931 // it's much easier to skip past them compared to the elaborate switch
3932 // required to skip the exception specification. However, all is not
3933 // equal; ExtParameterInfos are used to model very uncommon features,
3934 // and it's better not to burden the more common paths.
3935
3936public:
3937 /// Holds information about the various types of exception specification.
3938 /// ExceptionSpecInfo is not stored as such in FunctionProtoType but is
3939 /// used to group together the various bits of information about the
3940 /// exception specification.
3941 struct ExceptionSpecInfo {
3942 /// The kind of exception specification this is.
3943 ExceptionSpecificationType Type = EST_None;
3944
3945 /// Explicitly-specified list of exception types.
3946 ArrayRef<QualType> Exceptions;
3947
3948 /// Noexcept expression, if this is a computed noexcept specification.
3949 Expr *NoexceptExpr = nullptr;
3950
3951 /// The function whose exception specification this is, for
3952 /// EST_Unevaluated and EST_Uninstantiated.
3953 FunctionDecl *SourceDecl = nullptr;
3954
3955 /// The function template whose exception specification this is instantiated
3956 /// from, for EST_Uninstantiated.
3957 FunctionDecl *SourceTemplate = nullptr;
3958
3959 ExceptionSpecInfo() = default;
3960
3961 ExceptionSpecInfo(ExceptionSpecificationType EST) : Type(EST) {}
3962 };
3963
3964 /// Extra information about a function prototype. ExtProtoInfo is not
3965 /// stored as such in FunctionProtoType but is used to group together
3966 /// the various bits of extra information about a function prototype.
3967 struct ExtProtoInfo {
3968 FunctionType::ExtInfo ExtInfo;
3969 bool Variadic : 1;
3970 bool HasTrailingReturn : 1;
3971 Qualifiers TypeQuals;
3972 RefQualifierKind RefQualifier = RQ_None;
3973 ExceptionSpecInfo ExceptionSpec;
3974 const ExtParameterInfo *ExtParameterInfos = nullptr;
3975 SourceLocation EllipsisLoc;
3976
3977 ExtProtoInfo() : Variadic(false), HasTrailingReturn(false) {}
3978
3979 ExtProtoInfo(CallingConv CC)
3980 : ExtInfo(CC), Variadic(false), HasTrailingReturn(false) {}
3981
3982 ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI) {
3983 ExtProtoInfo Result(*this);
3984 Result.ExceptionSpec = ESI;
3985 return Result;
3986 }
3987 };
3988
3989private:
3990 unsigned numTrailingObjects(OverloadToken<QualType>) const {
3991 return getNumParams();
3992 }
3993
3994 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
3995 return isVariadic();
3996 }
3997
3998 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>) const {
3999 return hasExtraBitfields();
4000 }
4001
4002 unsigned numTrailingObjects(OverloadToken<ExceptionType>) const {
4003 return getExceptionSpecSize().NumExceptionType;
4004 }
4005
4006 unsigned numTrailingObjects(OverloadToken<Expr *>) const {
4007 return getExceptionSpecSize().NumExprPtr;
4008 }
4009
4010 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>) const {
4011 return getExceptionSpecSize().NumFunctionDeclPtr;
4012 }
4013
4014 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>) const {
4015 return hasExtParameterInfos() ? getNumParams() : 0;
4016 }
4017
4018 /// Determine whether there are any argument types that
4019 /// contain an unexpanded parameter pack.
4020 static bool containsAnyUnexpandedParameterPack(const QualType *ArgArray,
4021 unsigned numArgs) {
4022 for (unsigned Idx = 0; Idx < numArgs; ++Idx)
4023 if (ArgArray[Idx]->containsUnexpandedParameterPack())
4024 return true;
4025
4026 return false;
4027 }
4028
4029 FunctionProtoType(QualType result, ArrayRef<QualType> params,
4030 QualType canonical, const ExtProtoInfo &epi);
4031
4032 /// This struct is returned by getExceptionSpecSize and is used to
4033 /// translate an ExceptionSpecificationType to the number and kind
4034 /// of trailing objects related to the exception specification.
4035 struct ExceptionSpecSizeHolder {
4036 unsigned NumExceptionType;
4037 unsigned NumExprPtr;
4038 unsigned NumFunctionDeclPtr;
4039 };
4040
4041 /// Return the number and kind of trailing objects
4042 /// related to the exception specification.
4043 static ExceptionSpecSizeHolder
4044 getExceptionSpecSize(ExceptionSpecificationType EST, unsigned NumExceptions) {
4045 switch (EST) {
4046 case EST_None:
4047 case EST_DynamicNone:
4048 case EST_MSAny:
4049 case EST_BasicNoexcept:
4050 case EST_Unparsed:
4051 case EST_NoThrow:
4052 return {0, 0, 0};
4053
4054 case EST_Dynamic:
4055 return {NumExceptions, 0, 0};
4056
4057 case EST_DependentNoexcept:
4058 case EST_NoexceptFalse:
4059 case EST_NoexceptTrue:
4060 return {0, 1, 0};
4061
4062 case EST_Uninstantiated:
4063 return {0, 0, 2};
4064
4065 case EST_Unevaluated:
4066 return {0, 0, 1};
4067 }
4068 llvm_unreachable("bad exception specification kind")__builtin_unreachable();
4069 }
4070
4071 /// Return the number and kind of trailing objects
4072 /// related to the exception specification.
4073 ExceptionSpecSizeHolder getExceptionSpecSize() const {
4074 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
4075 }
4076
4077 /// Whether the trailing FunctionTypeExtraBitfields is present.
4078 static bool hasExtraBitfields(ExceptionSpecificationType EST) {
4079 // If the exception spec type is EST_Dynamic then we have > 0 exception
4080 // types and the exact number is stored in FunctionTypeExtraBitfields.
4081 return EST == EST_Dynamic;
4082 }
4083
4084 /// Whether the trailing FunctionTypeExtraBitfields is present.
4085 bool hasExtraBitfields() const {
4086 return hasExtraBitfields(getExceptionSpecType());
4087 }
4088
4089 bool hasExtQualifiers() const {
4090 return FunctionTypeBits.HasExtQuals;
4091 }
4092
4093public:
4094 unsigned getNumParams() const { return FunctionTypeBits.NumParams; }
4095
4096 QualType getParamType(unsigned i) const {
4097 assert(i < getNumParams() && "invalid parameter index")(static_cast<void> (0));
4098 return param_type_begin()[i];
4099 }
4100
4101 ArrayRef<QualType> getParamTypes() const {
4102 return llvm::makeArrayRef(param_type_begin(), param_type_end());
4103 }
4104
4105 ExtProtoInfo getExtProtoInfo() const {
4106 ExtProtoInfo EPI;
4107 EPI.ExtInfo = getExtInfo();
4108 EPI.Variadic = isVariadic();
4109 EPI.EllipsisLoc = getEllipsisLoc();
4110 EPI.HasTrailingReturn = hasTrailingReturn();
4111 EPI.ExceptionSpec = getExceptionSpecInfo();
4112 EPI.TypeQuals = getMethodQuals();
4113 EPI.RefQualifier = getRefQualifier();
4114 EPI.ExtParameterInfos = getExtParameterInfosOrNull();
4115 return EPI;
4116 }
4117
4118 /// Get the kind of exception specification on this function.
4119 ExceptionSpecificationType getExceptionSpecType() const {
4120 return static_cast<ExceptionSpecificationType>(
4121 FunctionTypeBits.ExceptionSpecType);
4122 }
4123
4124 /// Return whether this function has any kind of exception spec.
4125 bool hasExceptionSpec() const { return getExceptionSpecType() != EST_None; }
4126
4127 /// Return whether this function has a dynamic (throw) exception spec.
4128 bool hasDynamicExceptionSpec() const {
4129 return isDynamicExceptionSpec(getExceptionSpecType());
4130 }
4131
4132 /// Return whether this function has a noexcept exception spec.
4133 bool hasNoexceptExceptionSpec() const {
4134 return isNoexceptExceptionSpec(getExceptionSpecType());
4135 }
4136
4137 /// Return whether this function has a dependent exception spec.
4138 bool hasDependentExceptionSpec() const;
4139
4140 /// Return whether this function has an instantiation-dependent exception
4141 /// spec.
4142 bool hasInstantiationDependentExceptionSpec() const;
4143
4144 /// Return all the available information about this type's exception spec.
4145 ExceptionSpecInfo getExceptionSpecInfo() const {
4146 ExceptionSpecInfo Result;
4147 Result.Type = getExceptionSpecType();
4148 if (Result.Type == EST_Dynamic) {
4149 Result.Exceptions = exceptions();
4150 } else if (isComputedNoexcept(Result.Type)) {
4151 Result.NoexceptExpr = getNoexceptExpr();
4152 } else if (Result.Type == EST_Uninstantiated) {
4153 Result.SourceDecl = getExceptionSpecDecl();
4154 Result.SourceTemplate = getExceptionSpecTemplate();
4155 } else if (Result.Type == EST_Unevaluated) {
4156 Result.SourceDecl = getExceptionSpecDecl();
4157 }
4158 return Result;
4159 }
4160
4161 /// Return the number of types in the exception specification.
4162 unsigned getNumExceptions() const {
4163 return getExceptionSpecType() == EST_Dynamic
4164 ? getTrailingObjects<FunctionTypeExtraBitfields>()
4165 ->NumExceptionType
4166 : 0;
4167 }
4168
4169 /// Return the ith exception type, where 0 <= i < getNumExceptions().
4170 QualType getExceptionType(unsigned i) const {
4171 assert(i < getNumExceptions() && "Invalid exception number!")(static_cast<void> (0));
4172 return exception_begin()[i];
4173 }
4174
4175 /// Return the expression inside noexcept(expression), or a null pointer
4176 /// if there is none (because the exception spec is not of this form).
4177 Expr *getNoexceptExpr() const {
4178 if (!isComputedNoexcept(getExceptionSpecType()))
4179 return nullptr;
4180 return *getTrailingObjects<Expr *>();
4181 }
4182
4183 /// If this function type has an exception specification which hasn't
4184 /// been determined yet (either because it has not been evaluated or because
4185 /// it has not been instantiated), this is the function whose exception
4186 /// specification is represented by this type.
4187 FunctionDecl *getExceptionSpecDecl() const {
4188 if (getExceptionSpecType() != EST_Uninstantiated &&
4189 getExceptionSpecType() != EST_Unevaluated)
4190 return nullptr;
4191 return getTrailingObjects<FunctionDecl *>()[0];
4192 }
4193
4194 /// If this function type has an uninstantiated exception
4195 /// specification, this is the function whose exception specification
4196 /// should be instantiated to find the exception specification for
4197 /// this type.
4198 FunctionDecl *getExceptionSpecTemplate() const {
4199 if (getExceptionSpecType() != EST_Uninstantiated)
4200 return nullptr;
4201 return getTrailingObjects<FunctionDecl *>()[1];
4202 }
4203
4204 /// Determine whether this function type has a non-throwing exception
4205 /// specification.
4206 CanThrowResult canThrow() const;
4207
4208 /// Determine whether this function type has a non-throwing exception
4209 /// specification. If this depends on template arguments, returns
4210 /// \c ResultIfDependent.
4211 bool isNothrow(bool ResultIfDependent = false) const {
4212 return ResultIfDependent ? canThrow() != CT_Can : canThrow() == CT_Cannot;
4213 }
4214
4215 /// Whether this function prototype is variadic.
4216 bool isVariadic() const { return FunctionTypeBits.Variadic; }
4217
4218 SourceLocation getEllipsisLoc() const {
4219 return isVariadic() ? *getTrailingObjects<SourceLocation>()
4220 : SourceLocation();
4221 }
4222
4223 /// Determines whether this function prototype contains a
4224 /// parameter pack at the end.
4225 ///
4226 /// A function template whose last parameter is a parameter pack can be
4227 /// called with an arbitrary number of arguments, much like a variadic
4228 /// function.
4229 bool isTemplateVariadic() const;
4230
4231 /// Whether this function prototype has a trailing return type.
4232 bool hasTrailingReturn() const { return FunctionTypeBits.HasTrailingReturn; }
4233
4234 Qualifiers getMethodQuals() const {
4235 if (hasExtQualifiers())
4236 return *getTrailingObjects<Qualifiers>();
4237 else
4238 return getFastTypeQuals();
4239 }
4240
4241 /// Retrieve the ref-qualifier associated with this function type.
4242 RefQualifierKind getRefQualifier() const {
4243 return static_cast<RefQualifierKind>(FunctionTypeBits.RefQualifier);
4244 }
4245
4246 using param_type_iterator = const QualType *;
4247 using param_type_range = llvm::iterator_range<param_type_iterator>;
4248
4249 param_type_range param_types() const {
4250 return param_type_range(param_type_begin(), param_type_end());
4251 }
4252
4253 param_type_iterator param_type_begin() const {
4254 return getTrailingObjects<QualType>();
4255 }
4256
4257 param_type_iterator param_type_end() const {
4258 return param_type_begin() + getNumParams();
4259 }
4260
4261 using exception_iterator = const QualType *;
4262
4263 ArrayRef<QualType> exceptions() const {
4264 return llvm::makeArrayRef(exception_begin(), exception_end());
4265 }
4266
4267 exception_iterator exception_begin() const {
4268 return reinterpret_cast<exception_iterator>(
4269 getTrailingObjects<ExceptionType>());
4270 }
4271
4272 exception_iterator exception_end() const {
4273 return exception_begin() + getNumExceptions();
4274 }
4275
4276 /// Is there any interesting extra information for any of the parameters
4277 /// of this function type?
4278 bool hasExtParameterInfos() const {
4279 return FunctionTypeBits.HasExtParameterInfos;
4280 }
4281
4282 ArrayRef<ExtParameterInfo> getExtParameterInfos() const {
4283 assert(hasExtParameterInfos())(static_cast<void> (0));
4284 return ArrayRef<ExtParameterInfo>(getTrailingObjects<ExtParameterInfo>(),
4285 getNumParams());
4286 }
4287
4288 /// Return a pointer to the beginning of the array of extra parameter
4289 /// information, if present, or else null if none of the parameters
4290 /// carry it. This is equivalent to getExtProtoInfo().ExtParameterInfos.
4291 const ExtParameterInfo *getExtParameterInfosOrNull() const {
4292 if (!hasExtParameterInfos())
4293 return nullptr;
4294 return getTrailingObjects<ExtParameterInfo>();
4295 }
4296
4297 ExtParameterInfo getExtParameterInfo(unsigned I) const {
4298 assert(I < getNumParams() && "parameter index out of range")(static_cast<void> (0));
4299 if (hasExtParameterInfos())
4300 return getTrailingObjects<ExtParameterInfo>()[I];
4301 return ExtParameterInfo();
4302 }
4303
4304 ParameterABI getParameterABI(unsigned I) const {
4305 assert(I < getNumParams() && "parameter index out of range")(static_cast<void> (0));
4306 if (hasExtParameterInfos())
4307 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
4308 return ParameterABI::Ordinary;
4309 }
4310
4311 bool isParamConsumed(unsigned I) const {
4312 assert(I < getNumParams() && "parameter index out of range")(static_cast<void> (0));
4313 if (hasExtParameterInfos())
4314 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
4315 return false;
4316 }
4317
4318 bool isSugared() const { return false; }
4319 QualType desugar() const { return QualType(this, 0); }
4320
4321 void printExceptionSpecification(raw_ostream &OS,
4322 const PrintingPolicy &Policy) const;
4323
4324 static bool classof(const Type *T) {
4325 return T->getTypeClass() == FunctionProto;
4326 }
4327
4328 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx);
4329 static void Profile(llvm::FoldingSetNodeID &ID, QualType Result,
4330 param_type_iterator ArgTys, unsigned NumArgs,
4331 const ExtProtoInfo &EPI, const ASTContext &Context,
4332 bool Canonical);
4333};
4334
4335/// Represents the dependent type named by a dependently-scoped
4336/// typename using declaration, e.g.
4337/// using typename Base<T>::foo;
4338///
4339/// Template instantiation turns these into the underlying type.
4340class UnresolvedUsingType : public Type {
4341 friend class ASTContext; // ASTContext creates these.
4342
4343 UnresolvedUsingTypenameDecl *Decl;
4344
4345 UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D)
4346 : Type(UnresolvedUsing, QualType(),
4347 TypeDependence::DependentInstantiation),
4348 Decl(const_cast<UnresolvedUsingTypenameDecl *>(D)) {}
4349
4350public:
4351 UnresolvedUsingTypenameDecl *getDecl() const { return Decl; }
4352
4353 bool isSugared() const { return false; }
4354 QualType desugar() const { return QualType(this, 0); }
4355
4356 static bool classof(const Type *T) {
4357 return T->getTypeClass() == UnresolvedUsing;
4358 }
4359
4360 void Profile(llvm::FoldingSetNodeID &ID) {
4361 return Profile(ID, Decl);
4362 }
4363
4364 static void Profile(llvm::FoldingSetNodeID &ID,
4365 UnresolvedUsingTypenameDecl *D) {
4366 ID.AddPointer(D);
4367 }
4368};
4369
4370class TypedefType : public Type {
4371 TypedefNameDecl *Decl;
4372
4373private:
4374 friend class ASTContext; // ASTContext creates these.
4375
4376 TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType underlying,
4377 QualType can);
4378
4379public:
4380 TypedefNameDecl *getDecl() const { return Decl; }
4381
4382 bool isSugared() const { return true; }
4383 QualType desugar() const;
4384
4385 static bool classof(const Type *T) { return T->getTypeClass() == Typedef; }
4386};
4387
4388/// Sugar type that represents a type that was qualified by a qualifier written
4389/// as a macro invocation.
4390class MacroQualifiedType : public Type {
4391 friend class ASTContext; // ASTContext creates these.
4392
4393 QualType UnderlyingTy;
4394 const IdentifierInfo *MacroII;
4395
4396 MacroQualifiedType(QualType UnderlyingTy, QualType CanonTy,
4397 const IdentifierInfo *MacroII)
4398 : Type(MacroQualified, CanonTy, UnderlyingTy->getDependence()),
4399 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
4400 assert(isa<AttributedType>(UnderlyingTy) &&(static_cast<void> (0))
4401 "Expected a macro qualified type to only wrap attributed types.")(static_cast<void> (0));
4402 }
4403
4404public:
4405 const IdentifierInfo *getMacroIdentifier() const { return MacroII; }
4406 QualType getUnderlyingType() const { return UnderlyingTy; }
4407
4408 /// Return this attributed type's modified type with no qualifiers attached to
4409 /// it.
4410 QualType getModifiedType() const;
4411
4412 bool isSugared() const { return true; }
4413 QualType desugar() const;
4414
4415 static bool classof(const Type *T) {
4416 return T->getTypeClass() == MacroQualified;
4417 }
4418};
4419
4420/// Represents a `typeof` (or __typeof__) expression (a GCC extension).
4421class TypeOfExprType : public Type {
4422 Expr *TOExpr;
4423
4424protected:
4425 friend class ASTContext; // ASTContext creates these.
4426
4427 TypeOfExprType(Expr *E, QualType can = QualType());
4428
4429public:
4430 Expr *getUnderlyingExpr() const { return TOExpr; }
4431
4432 /// Remove a single level of sugar.
4433 QualType desugar() const;
4434
4435 /// Returns whether this type directly provides sugar.
4436 bool isSugared() const;
4437
4438 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; }
4439};
4440
4441/// Internal representation of canonical, dependent
4442/// `typeof(expr)` types.
4443///
4444/// This class is used internally by the ASTContext to manage
4445/// canonical, dependent types, only. Clients will only see instances
4446/// of this class via TypeOfExprType nodes.
4447class DependentTypeOfExprType
4448 : public TypeOfExprType, public llvm::FoldingSetNode {
4449 const ASTContext &Context;
4450
4451public:
4452 DependentTypeOfExprType(const ASTContext &Context, Expr *E)
4453 : TypeOfExprType(E), Context(Context) {}
4454
4455 void Profile(llvm::FoldingSetNodeID &ID) {
4456 Profile(ID, Context, getUnderlyingExpr());
4457 }
4458
4459 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
4460 Expr *E);
4461};
4462
4463/// Represents `typeof(type)`, a GCC extension.
4464class TypeOfType : public Type {
4465 friend class ASTContext; // ASTContext creates these.
4466
4467 QualType TOType;
4468
4469 TypeOfType(QualType T, QualType can)
4470 : Type(TypeOf, can, T->getDependence()), TOType(T) {
4471 assert(!isa<TypedefType>(can) && "Invalid canonical type")(static_cast<void> (0));
4472 }
4473
4474public:
4475 QualType getUnderlyingType() const { return TOType; }
4476
4477 /// Remove a single level of sugar.
4478 QualType desugar() const { return getUnderlyingType(); }
4479
4480 /// Returns whether this type directly provides sugar.
4481 bool isSugared() const { return true; }
4482
4483 static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; }
4484};
4485
4486/// Represents the type `decltype(expr)` (C++11).
4487class DecltypeType : public Type {
4488 Expr *E;
4489 QualType UnderlyingType;
4490
4491protected:
4492 friend class ASTContext; // ASTContext creates these.
4493
4494 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
4495
4496public:
4497 Expr *getUnderlyingExpr() const { return E; }
4498 QualType getUnderlyingType() const { return UnderlyingType; }
4499
4500 /// Remove a single level of sugar.
4501 QualType desugar() const;
4502
4503 /// Returns whether this type directly provides sugar.
4504 bool isSugared() const;
4505
4506 static bool classof(const Type *T) { return T->getTypeClass() == Decltype; }
4507};
4508
4509/// Internal representation of canonical, dependent
4510/// decltype(expr) types.
4511///
4512/// This class is used internally by the ASTContext to manage
4513/// canonical, dependent types, only. Clients will only see instances
4514/// of this class via DecltypeType nodes.
4515class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode {
4516 const ASTContext &Context;
4517
4518public:
4519 DependentDecltypeType(const ASTContext &Context, Expr *E);
4520
4521 void Profile(llvm::FoldingSetNodeID &ID) {
4522 Profile(ID, Context, getUnderlyingExpr());
4523 }
4524
4525 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
4526 Expr *E);
4527};
4528
4529/// A unary type transform, which is a type constructed from another.
4530class UnaryTransformType : public Type {
4531public:
4532 enum UTTKind {
4533 EnumUnderlyingType
4534 };
4535
4536private:
4537 /// The untransformed type.
4538 QualType BaseType;
4539
4540 /// The transformed type if not dependent, otherwise the same as BaseType.
4541 QualType UnderlyingType;
4542
4543 UTTKind UKind;
4544
4545protected:
4546 friend class ASTContext;
4547
4548 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
4549 QualType CanonicalTy);
4550
4551public:
4552 bool isSugared() const { return !isDependentType(); }
4553 QualType desugar() const { return UnderlyingType; }
4554
4555 QualType getUnderlyingType() const { return UnderlyingType; }
4556 QualType getBaseType() const { return BaseType; }
4557
4558 UTTKind getUTTKind() const { return UKind; }
4559
4560 static bool classof(const Type *T) {
4561 return T->getTypeClass() == UnaryTransform;
4562 }
4563};
4564
4565/// Internal representation of canonical, dependent
4566/// __underlying_type(type) types.
4567///
4568/// This class is used internally by the ASTContext to manage
4569/// canonical, dependent types, only. Clients will only see instances
4570/// of this class via UnaryTransformType nodes.
4571class DependentUnaryTransformType : public UnaryTransformType,
4572 public llvm::FoldingSetNode {
4573public:
4574 DependentUnaryTransformType(const ASTContext &C, QualType BaseType,
4575 UTTKind UKind);
4576
4577 void Profile(llvm::FoldingSetNodeID &ID) {
4578 Profile(ID, getBaseType(), getUTTKind());
4579 }
4580
4581 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
4582 UTTKind UKind) {
4583 ID.AddPointer(BaseType.getAsOpaquePtr());
4584 ID.AddInteger((unsigned)UKind);
4585 }
4586};
4587
4588class TagType : public Type {
4589 friend class ASTReader;
4590 template <class T> friend class serialization::AbstractTypeReader;
4591
4592 /// Stores the TagDecl associated with this type. The decl may point to any
4593 /// TagDecl that declares the entity.
4594 TagDecl *decl;
4595
4596protected:
4597 TagType(TypeClass TC, const TagDecl *D, QualType can);
4598
4599public:
4600 TagDecl *getDecl() const;
4601
4602 /// Determines whether this type is in the process of being defined.
4603 bool isBeingDefined() const;
4604
4605 static bool classof(const Type *T) {
4606 return T->getTypeClass() == Enum || T->getTypeClass() == Record;
4607 }
4608};
4609
4610/// A helper class that allows the use of isa/cast/dyncast
4611/// to detect TagType objects of structs/unions/classes.
4612class RecordType : public TagType {
4613protected:
4614 friend class ASTContext; // ASTContext creates these.
4615
4616 explicit RecordType(const RecordDecl *D)
4617 : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4618 explicit RecordType(TypeClass TC, RecordDecl *D)
4619 : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4620
4621public:
4622 RecordDecl *getDecl() const {
4623 return reinterpret_cast<RecordDecl*>(TagType::getDecl());
4624 }
4625
4626 /// Recursively check all fields in the record for const-ness. If any field
4627 /// is declared const, return true. Otherwise, return false.
4628 bool hasConstFields() const;
4629
4630 bool isSugared() const { return false; }
4631 QualType desugar() const { return QualType(this, 0); }
4632
4633 static bool classof(const Type *T) { return T->getTypeClass() == Record; }
4634};
4635
4636/// A helper class that allows the use of isa/cast/dyncast
4637/// to detect TagType objects of enums.
4638class EnumType : public TagType {
4639 friend class ASTContext; // ASTContext creates these.
4640
4641 explicit EnumType(const EnumDecl *D)
4642 : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4643
4644public:
4645 EnumDecl *getDecl() const {
4646 return reinterpret_cast<EnumDecl*>(TagType::getDecl());
4647 }
4648
4649 bool isSugared() const { return false; }
4650 QualType desugar() const { return QualType(this, 0); }
4651
4652 static bool classof(const Type *T) { return T->getTypeClass() == Enum; }
4653};
4654
4655/// An attributed type is a type to which a type attribute has been applied.
4656///
4657/// The "modified type" is the fully-sugared type to which the attributed
4658/// type was applied; generally it is not canonically equivalent to the
4659/// attributed type. The "equivalent type" is the minimally-desugared type
4660/// which the type is canonically equivalent to.
4661///
4662/// For example, in the following attributed type:
4663/// int32_t __attribute__((vector_size(16)))
4664/// - the modified type is the TypedefType for int32_t
4665/// - the equivalent type is VectorType(16, int32_t)
4666/// - the canonical type is VectorType(16, int)
4667class AttributedType : public Type, public llvm::FoldingSetNode {
4668public:
4669 using Kind = attr::Kind;
4670
4671private:
4672 friend class ASTContext; // ASTContext creates these
4673
4674 QualType ModifiedType;
4675 QualType EquivalentType;
4676
4677 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
4678 QualType equivalent)
4679 : Type(Attributed, canon, equivalent->getDependence()),
4680 ModifiedType(modified), EquivalentType(equivalent) {
4681 AttributedTypeBits.AttrKind = attrKind;
4682 }
4683
4684public:
4685 Kind getAttrKind() const {
4686 return static_cast<Kind>(AttributedTypeBits.AttrKind);
4687 }
4688
4689 QualType getModifiedType() const { return ModifiedType; }
4690 QualType getEquivalentType() const { return EquivalentType; }
4691
4692 bool isSugared() const { return true; }
4693 QualType desugar() const { return getEquivalentType(); }
4694
4695 /// Does this attribute behave like a type qualifier?
4696 ///
4697 /// A type qualifier adjusts a type to provide specialized rules for
4698 /// a specific object, like the standard const and volatile qualifiers.
4699 /// This includes attributes controlling things like nullability,
4700 /// address spaces, and ARC ownership. The value of the object is still
4701 /// largely described by the modified type.
4702 ///
4703 /// In contrast, many type attributes "rewrite" their modified type to
4704 /// produce a fundamentally different type, not necessarily related in any
4705 /// formalizable way to the original type. For example, calling convention
4706 /// and vector attributes are not simple type qualifiers.
4707 ///
4708 /// Type qualifiers are often, but not always, reflected in the canonical
4709 /// type.
4710 bool isQualifier() const;
4711
4712 bool isMSTypeSpec() const;
4713
4714 bool isCallingConv() const;
4715
4716 llvm::Optional<NullabilityKind> getImmediateNullability() const;
4717
4718 /// Retrieve the attribute kind corresponding to the given
4719 /// nullability kind.
4720 static Kind getNullabilityAttrKind(NullabilityKind kind) {
4721 switch (kind) {
4722 case NullabilityKind::NonNull:
4723 return attr::TypeNonNull;
4724
4725 case NullabilityKind::Nullable:
4726 return attr::TypeNullable;
4727
4728 case NullabilityKind::NullableResult:
4729 return attr::TypeNullableResult;
4730
4731 case NullabilityKind::Unspecified:
4732 return attr::TypeNullUnspecified;
4733 }
4734 llvm_unreachable("Unknown nullability kind.")__builtin_unreachable();
4735 }
4736
4737 /// Strip off the top-level nullability annotation on the given
4738 /// type, if it's there.
4739 ///
4740 /// \param T The type to strip. If the type is exactly an
4741 /// AttributedType specifying nullability (without looking through
4742 /// type sugar), the nullability is returned and this type changed
4743 /// to the underlying modified type.
4744 ///
4745 /// \returns the top-level nullability, if present.
4746 static Optional<NullabilityKind> stripOuterNullability(QualType &T);
4747
4748 void Profile(llvm::FoldingSetNodeID &ID) {
4749 Profile(ID, getAttrKind(), ModifiedType, EquivalentType);
4750 }
4751
4752 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind,
4753 QualType modified, QualType equivalent) {
4754 ID.AddInteger(attrKind);
4755 ID.AddPointer(modified.getAsOpaquePtr());
4756 ID.AddPointer(equivalent.getAsOpaquePtr());
4757 }
4758
4759 static bool classof(const Type *T) {
4760 return T->getTypeClass() == Attributed;
4761 }
4762};
4763
4764class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
4765 friend class ASTContext; // ASTContext creates these
4766
4767 // Helper data collector for canonical types.
4768 struct CanonicalTTPTInfo {
4769 unsigned Depth : 15;
4770 unsigned ParameterPack : 1;
4771 unsigned Index : 16;
4772 };
4773
4774 union {
4775 // Info for the canonical type.
4776 CanonicalTTPTInfo CanTTPTInfo;
4777
4778 // Info for the non-canonical type.
4779 TemplateTypeParmDecl *TTPDecl;
4780 };
4781
4782 /// Build a non-canonical type.
4783 TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
4784 : Type(TemplateTypeParm, Canon,
4785 TypeDependence::DependentInstantiation |
4786 (Canon->getDependence() & TypeDependence::UnexpandedPack)),
4787 TTPDecl(TTPDecl) {}
4788
4789 /// Build the canonical type.
4790 TemplateTypeParmType(unsigned D, unsigned I, bool PP)
4791 : Type(TemplateTypeParm, QualType(this, 0),
4792 TypeDependence::DependentInstantiation |
4793 (PP ? TypeDependence::UnexpandedPack : TypeDependence::None)) {
4794 CanTTPTInfo.Depth = D;
4795 CanTTPTInfo.Index = I;
4796 CanTTPTInfo.ParameterPack = PP;
4797 }
4798
4799 const CanonicalTTPTInfo& getCanTTPTInfo() const {
4800 QualType Can = getCanonicalTypeInternal();
4801 return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo;
4802 }
4803
4804public:
4805 unsigned getDepth() const { return getCanTTPTInfo().Depth; }
4806 unsigned getIndex() const { return getCanTTPTInfo().Index; }
4807 bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; }
4808
4809 TemplateTypeParmDecl *getDecl() const {
4810 return isCanonicalUnqualified() ? nullptr : TTPDecl;
4811 }
4812
4813 IdentifierInfo *getIdentifier() const;
4814
4815 bool isSugared() const { return false; }
4816 QualType desugar() const { return QualType(this, 0); }
4817
4818 void Profile(llvm::FoldingSetNodeID &ID) {
4819 Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl());
4820 }
4821
4822 static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth,
4823 unsigned Index, bool ParameterPack,
4824 TemplateTypeParmDecl *TTPDecl) {
4825 ID.AddInteger(Depth);
4826 ID.AddInteger(Index);
4827 ID.AddBoolean(ParameterPack);
4828 ID.AddPointer(TTPDecl);
4829 }
4830
4831 static bool classof(const Type *T) {
4832 return T->getTypeClass() == TemplateTypeParm;
4833 }
4834};
4835
4836/// Represents the result of substituting a type for a template
4837/// type parameter.
4838///
4839/// Within an instantiated template, all template type parameters have
4840/// been replaced with these. They are used solely to record that a
4841/// type was originally written as a template type parameter;
4842/// therefore they are never canonical.
4843class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode {
4844 friend class ASTContext;
4845
4846 // The original type parameter.
4847 const TemplateTypeParmType *Replaced;
4848
4849 SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon)
4850 : Type(SubstTemplateTypeParm, Canon, Canon->getDependence()),
4851 Replaced(Param) {}
4852
4853public:
4854 /// Gets the template parameter that was substituted for.
4855 const TemplateTypeParmType *getReplacedParameter() const {
4856 return Replaced;
4857 }
4858
4859 /// Gets the type that was substituted for the template
4860 /// parameter.
4861 QualType getReplacementType() const {
4862 return getCanonicalTypeInternal();
4863 }
4864
4865 bool isSugared() const { return true; }
4866 QualType desugar() const { return getReplacementType(); }
4867
4868 void Profile(llvm::FoldingSetNodeID &ID) {
4869 Profile(ID, getReplacedParameter(), getReplacementType());
4870 }
4871
4872 static void Profile(llvm::FoldingSetNodeID &ID,
4873 const TemplateTypeParmType *Replaced,
4874 QualType Replacement) {
4875 ID.AddPointer(Replaced);
4876 ID.AddPointer(Replacement.getAsOpaquePtr());
4877 }
4878
4879 static bool classof(const Type *T) {
4880 return T->getTypeClass() == SubstTemplateTypeParm;
4881 }
4882};
4883
4884/// Represents the result of substituting a set of types for a template
4885/// type parameter pack.
4886///
4887/// When a pack expansion in the source code contains multiple parameter packs
4888/// and those parameter packs correspond to different levels of template
4889/// parameter lists, this type node is used to represent a template type
4890/// parameter pack from an outer level, which has already had its argument pack
4891/// substituted but that still lives within a pack expansion that itself
4892/// could not be instantiated. When actually performing a substitution into
4893/// that pack expansion (e.g., when all template parameters have corresponding
4894/// arguments), this type will be replaced with the \c SubstTemplateTypeParmType
4895/// at the current pack substitution index.
4896class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode {
4897 friend class ASTContext;
4898
4899 /// The original type parameter.
4900 const TemplateTypeParmType *Replaced;
4901
4902 /// A pointer to the set of template arguments that this
4903 /// parameter pack is instantiated with.
4904 const TemplateArgument *Arguments;
4905
4906 SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
4907 QualType Canon,
4908 const TemplateArgument &ArgPack);
4909
4910public:
4911 IdentifierInfo *getIdentifier() const { return Replaced->getIdentifier(); }
4912
4913 /// Gets the template parameter that was substituted for.
4914 const TemplateTypeParmType *getReplacedParameter() const {
4915 return Replaced;
4916 }
4917
4918 unsigned getNumArgs() const {
4919 return SubstTemplateTypeParmPackTypeBits.NumArgs;
4920 }
4921
4922 bool isSugared() const { return false; }
4923 QualType desugar() const { return QualType(this, 0); }
4924
4925 TemplateArgument getArgumentPack() const;
4926
4927 void Profile(llvm::FoldingSetNodeID &ID);
4928 static void Profile(llvm::FoldingSetNodeID &ID,
4929 const TemplateTypeParmType *Replaced,
4930 const TemplateArgument &ArgPack);
4931
4932 static bool classof(const Type *T) {
4933 return T->getTypeClass() == SubstTemplateTypeParmPack;
4934 }
4935};
4936
4937/// Common base class for placeholders for types that get replaced by
4938/// placeholder type deduction: C++11 auto, C++14 decltype(auto), C++17 deduced
4939/// class template types, and constrained type names.
4940///
4941/// These types are usually a placeholder for a deduced type. However, before
4942/// the initializer is attached, or (usually) if the initializer is
4943/// type-dependent, there is no deduced type and the type is canonical. In
4944/// the latter case, it is also a dependent type.
4945class DeducedType : public Type {
4946protected:
4947 DeducedType(TypeClass TC, QualType DeducedAsType,
4948 TypeDependence ExtraDependence)
4949 : Type(TC,
4950 // FIXME: Retain the sugared deduced type?
4951 DeducedAsType.isNull() ? QualType(this, 0)
4952 : DeducedAsType.getCanonicalType(),
4953 ExtraDependence | (DeducedAsType.isNull()
4954 ? TypeDependence::None
4955 : DeducedAsType->getDependence() &
4956 ~TypeDependence::VariablyModified)) {}
4957
4958public:
4959 bool isSugared() const { return !isCanonicalUnqualified(); }
4960 QualType desugar() const { return getCanonicalTypeInternal(); }
4961
4962 /// Get the type deduced for this placeholder type, or null if it's
4963 /// either not been deduced or was deduced to a dependent type.
4964 QualType getDeducedType() const {
4965 return !isCanonicalUnqualified() ? getCanonicalTypeInternal() : QualType();
4966 }
4967 bool isDeduced() const {
4968 return !isCanonicalUnqualified() || isDependentType();
4969 }
4970
4971 static bool classof(const Type *T) {
4972 return T->getTypeClass() == Auto ||
4973 T->getTypeClass() == DeducedTemplateSpecialization;
4974 }
4975};
4976
4977/// Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained
4978/// by a type-constraint.
4979class alignas(8) AutoType : public DeducedType, public llvm::FoldingSetNode {
4980 friend class ASTContext; // ASTContext creates these
4981
4982 ConceptDecl *TypeConstraintConcept;
4983
4984 AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword,
4985 TypeDependence ExtraDependence, ConceptDecl *CD,
4986 ArrayRef<TemplateArgument> TypeConstraintArgs);
4987
4988 const TemplateArgument *getArgBuffer() const {
4989 return reinterpret_cast<const TemplateArgument*>(this+1);
4990 }
4991
4992 TemplateArgument *getArgBuffer() {
4993 return reinterpret_cast<TemplateArgument*>(this+1);
4994 }
4995
4996public:
4997 /// Retrieve the template arguments.
4998 const TemplateArgument *getArgs() const {
4999 return getArgBuffer();
5000 }
5001
5002 /// Retrieve the number of template arguments.
5003 unsigned getNumArgs() const {
5004 return AutoTypeBits.NumArgs;
5005 }
5006
5007 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5008
5009 ArrayRef<TemplateArgument> getTypeConstraintArguments() const {
5010 return {getArgs(), getNumArgs()};
5011 }
5012
5013 ConceptDecl *getTypeConstraintConcept() const {
5014 return TypeConstraintConcept;
5015 }
5016
5017 bool isConstrained() const {
5018 return TypeConstraintConcept != nullptr;
5019 }
5020
5021 bool isDecltypeAuto() const {
5022 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
5023 }
5024
5025 AutoTypeKeyword getKeyword() const {
5026 return (AutoTypeKeyword)AutoTypeBits.Keyword;
5027 }
5028
5029 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
5030 Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(),
5031 getTypeConstraintConcept(), getTypeConstraintArguments());
5032 }
5033
5034 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
5035 QualType Deduced, AutoTypeKeyword Keyword,
5036 bool IsDependent, ConceptDecl *CD,
5037 ArrayRef<TemplateArgument> Arguments);
5038
5039 static bool classof(const Type *T) {
5040 return T->getTypeClass() == Auto;
5041 }
5042};
5043
5044/// Represents a C++17 deduced template specialization type.
5045class DeducedTemplateSpecializationType : public DeducedType,
5046 public llvm::FoldingSetNode {
5047 friend class ASTContext; // ASTContext creates these
5048
5049 /// The name of the template whose arguments will be deduced.
5050 TemplateName Template;
5051
5052 DeducedTemplateSpecializationType(TemplateName Template,
5053 QualType DeducedAsType,
5054 bool IsDeducedAsDependent)
5055 : DeducedType(DeducedTemplateSpecialization, DeducedAsType,
5056 toTypeDependence(Template.getDependence()) |
5057 (IsDeducedAsDependent
5058 ? TypeDependence::DependentInstantiation
5059 : TypeDependence::None)),
5060 Template(Template) {}
5061
5062public:
5063 /// Retrieve the name of the template that we are deducing.
5064 TemplateName getTemplateName() const { return Template;}
5065
5066 void Profile(llvm::FoldingSetNodeID &ID) {
5067 Profile(ID, getTemplateName(), getDeducedType(), isDependentType());
5068 }
5069
5070 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName Template,
5071 QualType Deduced, bool IsDependent) {
5072 Template.Profile(ID);
5073 ID.AddPointer(Deduced.getAsOpaquePtr());
5074 ID.AddBoolean(IsDependent);
5075 }
5076
5077 static bool classof(const Type *T) {
5078 return T->getTypeClass() == DeducedTemplateSpecialization;
5079 }
5080};
5081
5082/// Represents a type template specialization; the template
5083/// must be a class template, a type alias template, or a template
5084/// template parameter. A template which cannot be resolved to one of
5085/// these, e.g. because it is written with a dependent scope
5086/// specifier, is instead represented as a
5087/// @c DependentTemplateSpecializationType.
5088///
5089/// A non-dependent template specialization type is always "sugar",
5090/// typically for a \c RecordType. For example, a class template
5091/// specialization type of \c vector<int> will refer to a tag type for
5092/// the instantiation \c std::vector<int, std::allocator<int>>
5093///
5094/// Template specializations are dependent if either the template or
5095/// any of the template arguments are dependent, in which case the
5096/// type may also be canonical.
5097///
5098/// Instances of this type are allocated with a trailing array of
5099/// TemplateArguments, followed by a QualType representing the
5100/// non-canonical aliased type when the template is a type alias
5101/// template.
5102class alignas(8) TemplateSpecializationType
5103 : public Type,
5104 public llvm::FoldingSetNode {
5105 friend class ASTContext; // ASTContext creates these
5106
5107 /// The name of the template being specialized. This is
5108 /// either a TemplateName::Template (in which case it is a
5109 /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a
5110 /// TypeAliasTemplateDecl*), a
5111 /// TemplateName::SubstTemplateTemplateParmPack, or a
5112 /// TemplateName::SubstTemplateTemplateParm (in which case the
5113 /// replacement must, recursively, be one of these).
5114 TemplateName Template;
5115
5116 TemplateSpecializationType(TemplateName T,
5117 ArrayRef<TemplateArgument> Args,
5118 QualType Canon,
5119 QualType Aliased);
5120
5121public:
5122 /// Determine whether any of the given template arguments are dependent.
5123 ///
5124 /// The converted arguments should be supplied when known; whether an
5125 /// argument is dependent can depend on the conversions performed on it
5126 /// (for example, a 'const int' passed as a template argument might be
5127 /// dependent if the parameter is a reference but non-dependent if the
5128 /// parameter is an int).
5129 ///
5130 /// Note that the \p Args parameter is unused: this is intentional, to remind
5131 /// the caller that they need to pass in the converted arguments, not the
5132 /// specified arguments.
5133 static bool
5134 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
5135 ArrayRef<TemplateArgument> Converted);
5136 static bool
5137 anyDependentTemplateArguments(const TemplateArgumentListInfo &,
5138 ArrayRef<TemplateArgument> Converted);
5139 static bool anyInstantiationDependentTemplateArguments(
5140 ArrayRef<TemplateArgumentLoc> Args);
5141
5142 /// True if this template specialization type matches a current
5143 /// instantiation in the context in which it is found.
5144 bool isCurrentInstantiation() const {
5145 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
5146 }
5147
5148 /// Determine if this template specialization type is for a type alias
5149 /// template that has been substituted.
5150 ///
5151 /// Nearly every template specialization type whose template is an alias
5152 /// template will be substituted. However, this is not the case when
5153 /// the specialization contains a pack expansion but the template alias
5154 /// does not have a corresponding parameter pack, e.g.,
5155 ///
5156 /// \code
5157 /// template<typename T, typename U, typename V> struct S;
5158 /// template<typename T, typename U> using A = S<T, int, U>;
5159 /// template<typename... Ts> struct X {
5160 /// typedef A<Ts...> type; // not a type alias
5161 /// };
5162 /// \endcode
5163 bool isTypeAlias() const { return TemplateSpecializationTypeBits.TypeAlias; }
5164
5165 /// Get the aliased type, if this is a specialization of a type alias
5166 /// template.
5167 QualType getAliasedType() const {
5168 assert(isTypeAlias() && "not a type alias template specialization")(static_cast<void> (0));
5169 return *reinterpret_cast<const QualType*>(end());
5170 }
5171
5172 using iterator = const TemplateArgument *;
5173
5174 iterator begin() const { return getArgs(); }
5175 iterator end() const; // defined inline in TemplateBase.h
5176
5177 /// Retrieve the name of the template that we are specializing.
5178 TemplateName getTemplateName() const { return Template; }
5179
5180 /// Retrieve the template arguments.
5181 const TemplateArgument *getArgs() const {
5182 return reinterpret_cast<const TemplateArgument *>(this + 1);
5183 }
5184
5185 /// Retrieve the number of template arguments.
5186 unsigned getNumArgs() const {
5187 return TemplateSpecializationTypeBits.NumArgs;
5188 }
5189
5190 /// Retrieve a specific template argument as a type.
5191 /// \pre \c isArgType(Arg)
5192 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5193
5194 ArrayRef<TemplateArgument> template_arguments() const {
5195 return {getArgs(), getNumArgs()};
5196 }
5197
5198 bool isSugared() const {
5199 return !isDependentType() || isCurrentInstantiation() || isTypeAlias();
5200 }
5201
5202 QualType desugar() const {
5203 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
5204 }
5205
5206 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
5207 Profile(ID, Template, template_arguments(), Ctx);
5208 if (isTypeAlias())
5209 getAliasedType().Profile(ID);
5210 }
5211
5212 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T,
5213 ArrayRef<TemplateArgument> Args,
5214 const ASTContext &Context);
5215
5216 static bool classof(const Type *T) {
5217 return T->getTypeClass() == TemplateSpecialization;
5218 }
5219};
5220
5221/// Print a template argument list, including the '<' and '>'
5222/// enclosing the template arguments.
5223void printTemplateArgumentList(raw_ostream &OS,
5224 ArrayRef<TemplateArgument> Args,
5225 const PrintingPolicy &Policy,
5226 const TemplateParameterList *TPL = nullptr);
5227
5228void printTemplateArgumentList(raw_ostream &OS,
5229 ArrayRef<TemplateArgumentLoc> Args,
5230 const PrintingPolicy &Policy,
5231 const TemplateParameterList *TPL = nullptr);
5232
5233void printTemplateArgumentList(raw_ostream &OS,
5234 const TemplateArgumentListInfo &Args,
5235 const PrintingPolicy &Policy,
5236 const TemplateParameterList *TPL = nullptr);
5237
5238/// The injected class name of a C++ class template or class
5239/// template partial specialization. Used to record that a type was
5240/// spelled with a bare identifier rather than as a template-id; the
5241/// equivalent for non-templated classes is just RecordType.
5242///
5243/// Injected class name types are always dependent. Template
5244/// instantiation turns these into RecordTypes.
5245///
5246/// Injected class name types are always canonical. This works
5247/// because it is impossible to compare an injected class name type
5248/// with the corresponding non-injected template type, for the same
5249/// reason that it is impossible to directly compare template
5250/// parameters from different dependent contexts: injected class name
5251/// types can only occur within the scope of a particular templated
5252/// declaration, and within that scope every template specialization
5253/// will canonicalize to the injected class name (when appropriate
5254/// according to the rules of the language).
5255class InjectedClassNameType : public Type {
5256 friend class ASTContext; // ASTContext creates these.
5257 friend class ASTNodeImporter;
5258 friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not
5259 // currently suitable for AST reading, too much
5260 // interdependencies.
5261 template <class T> friend class serialization::AbstractTypeReader;
5262
5263 CXXRecordDecl *Decl;
5264
5265 /// The template specialization which this type represents.
5266 /// For example, in
5267 /// template <class T> class A { ... };
5268 /// this is A<T>, whereas in
5269 /// template <class X, class Y> class A<B<X,Y> > { ... };
5270 /// this is A<B<X,Y> >.
5271 ///
5272 /// It is always unqualified, always a template specialization type,
5273 /// and always dependent.
5274 QualType InjectedType;
5275
5276 InjectedClassNameType(CXXRecordDecl *D, QualType TST)
5277 : Type(InjectedClassName, QualType(),
5278 TypeDependence::DependentInstantiation),
5279 Decl(D), InjectedType(TST) {
5280 assert(isa<TemplateSpecializationType>(TST))(static_cast<void> (0));
5281 assert(!TST.hasQualifiers())(static_cast<void> (0));
5282 assert(TST->isDependentType())(static_cast<void> (0));
5283 }
5284
5285public:
5286 QualType getInjectedSpecializationType() const { return InjectedType; }
5287
5288 const TemplateSpecializationType *getInjectedTST() const {
5289 return cast<TemplateSpecializationType>(InjectedType.getTypePtr());
5290 }
5291
5292 TemplateName getTemplateName() const {
5293 return getInjectedTST()->getTemplateName();
5294 }
5295
5296 CXXRecordDecl *getDecl() const;
5297
5298 bool isSugared() const { return false; }
5299 QualType desugar() const { return QualType(this, 0); }
5300
5301 static bool classof(const Type *T) {
5302 return T->getTypeClass() == InjectedClassName;
5303 }
5304};
5305
5306/// The kind of a tag type.
5307enum TagTypeKind {
5308 /// The "struct" keyword.
5309 TTK_Struct,
5310
5311 /// The "__interface" keyword.
5312 TTK_Interface,
5313
5314 /// The "union" keyword.
5315 TTK_Union,
5316
5317 /// The "class" keyword.
5318 TTK_Class,
5319
5320 /// The "enum" keyword.
5321 TTK_Enum
5322};
5323
5324/// The elaboration keyword that precedes a qualified type name or
5325/// introduces an elaborated-type-specifier.
5326enum ElaboratedTypeKeyword {
5327 /// The "struct" keyword introduces the elaborated-type-specifier.
5328 ETK_Struct,
5329
5330 /// The "__interface" keyword introduces the elaborated-type-specifier.
5331 ETK_Interface,
5332
5333 /// The "union" keyword introduces the elaborated-type-specifier.
5334 ETK_Union,
5335
5336 /// The "class" keyword introduces the elaborated-type-specifier.
5337 ETK_Class,
5338
5339 /// The "enum" keyword introduces the elaborated-type-specifier.
5340 ETK_Enum,
5341
5342 /// The "typename" keyword precedes the qualified type name, e.g.,
5343 /// \c typename T::type.
5344 ETK_Typename,
5345
5346 /// No keyword precedes the qualified type name.
5347 ETK_None
5348};
5349
5350/// A helper class for Type nodes having an ElaboratedTypeKeyword.
5351/// The keyword in stored in the free bits of the base class.
5352/// Also provides a few static helpers for converting and printing
5353/// elaborated type keyword and tag type kind enumerations.
5354class TypeWithKeyword : public Type {
5355protected:
5356 TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc,
5357 QualType Canonical, TypeDependence Dependence)
5358 : Type(tc, Canonical, Dependence) {
5359 TypeWithKeywordBits.Keyword = Keyword;
5360 }
5361
5362public:
5363 ElaboratedTypeKeyword getKeyword() const {
5364 return static_cast<ElaboratedTypeKeyword>(TypeWithKeywordBits.Keyword);
5365 }
5366
5367 /// Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
5368 static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec);
5369
5370 /// Converts a type specifier (DeclSpec::TST) into a tag type kind.
5371 /// It is an error to provide a type specifier which *isn't* a tag kind here.
5372 static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec);
5373
5374 /// Converts a TagTypeKind into an elaborated type keyword.
5375 static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag);
5376
5377 /// Converts an elaborated type keyword into a TagTypeKind.
5378 /// It is an error to provide an elaborated type keyword
5379 /// which *isn't* a tag kind here.
5380 static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword);
5381
5382 static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword);
5383
5384 static StringRef getKeywordName(ElaboratedTypeKeyword Keyword);
5385
5386 static StringRef getTagTypeKindName(TagTypeKind Kind) {
5387 return getKeywordName(getKeywordForTagTypeKind(Kind));
5388 }
5389
5390 class CannotCastToThisType {};
5391 static CannotCastToThisType classof(const Type *);
5392};
5393
5394/// Represents a type that was referred to using an elaborated type
5395/// keyword, e.g., struct S, or via a qualified name, e.g., N::M::type,
5396/// or both.
5397///
5398/// This type is used to keep track of a type name as written in the
5399/// source code, including tag keywords and any nested-name-specifiers.
5400/// The type itself is always "sugar", used to express what was written
5401/// in the source code but containing no additional semantic information.
5402class ElaboratedType final
5403 : public TypeWithKeyword,
5404 public llvm::FoldingSetNode,
5405 private llvm::TrailingObjects<ElaboratedType, TagDecl *> {
5406 friend class ASTContext; // ASTContext creates these
5407 friend TrailingObjects;
5408
5409 /// The nested name specifier containing the qualifier.
5410 NestedNameSpecifier *NNS;
5411
5412 /// The type that this qualified name refers to.
5413 QualType NamedType;
5414
5415 /// The (re)declaration of this tag type owned by this occurrence is stored
5416 /// as a trailing object if there is one. Use getOwnedTagDecl to obtain
5417 /// it, or obtain a null pointer if there is none.
5418
5419 ElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
5420 QualType NamedType, QualType CanonType, TagDecl *OwnedTagDecl)
5421 : TypeWithKeyword(Keyword, Elaborated, CanonType,
5422 // Any semantic dependence on the qualifier will have
5423 // been incorporated into NamedType. We still need to
5424 // track syntactic (instantiation / error / pack)
5425 // dependence on the qualifier.
5426 NamedType->getDependence() |
5427 (NNS ? toSyntacticDependence(
5428 toTypeDependence(NNS->getDependence()))
5429 : TypeDependence::None)),
5430 NNS(NNS), NamedType(NamedType) {
5431 ElaboratedTypeBits.HasOwnedTagDecl = false;
5432 if (OwnedTagDecl) {
5433 ElaboratedTypeBits.HasOwnedTagDecl = true;
5434 *getTrailingObjects<TagDecl *>() = OwnedTagDecl;
5435 }
5436 assert(!(Keyword == ETK_None && NNS == nullptr) &&(static_cast<void> (0))
5437 "ElaboratedType cannot have elaborated type keyword "(static_cast<void> (0))
5438 "and name qualifier both null.")(static_cast<void> (0));
5439 }
5440
5441public:
5442 /// Retrieve the qualification on this type.
5443 NestedNameSpecifier *getQualifier() const { return NNS; }
5444
5445 /// Retrieve the type named by the qualified-id.
5446 QualType getNamedType() const { return NamedType; }
5447
5448 /// Remove a single level of sugar.
5449 QualType desugar() const { return getNamedType(); }
5450
5451 /// Returns whether this type directly provides sugar.
5452 bool isSugared() const { return true; }
5453
5454 /// Return the (re)declaration of this type owned by this occurrence of this
5455 /// type, or nullptr if there is none.
5456 TagDecl *getOwnedTagDecl() const {
5457 return ElaboratedTypeBits.HasOwnedTagDecl ? *getTrailingObjects<TagDecl *>()
5458 : nullptr;
5459 }
5460
5461 void Profile(llvm::FoldingSetNodeID &ID) {
5462 Profile(ID, getKeyword(), NNS, NamedType, getOwnedTagDecl());
5463 }
5464
5465 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
5466 NestedNameSpecifier *NNS, QualType NamedType,
5467 TagDecl *OwnedTagDecl) {
5468 ID.AddInteger(Keyword);
5469 ID.AddPointer(NNS);
5470 NamedType.Profile(ID);
5471 ID.AddPointer(OwnedTagDecl);
5472 }
5473
5474 static bool classof(const Type *T) { return T->getTypeClass() == Elaborated; }
5475};
5476
5477/// Represents a qualified type name for which the type name is
5478/// dependent.
5479///
5480/// DependentNameType represents a class of dependent types that involve a
5481/// possibly dependent nested-name-specifier (e.g., "T::") followed by a
5482/// name of a type. The DependentNameType may start with a "typename" (for a
5483/// typename-specifier), "class", "struct", "union", or "enum" (for a
5484/// dependent elaborated-type-specifier), or nothing (in contexts where we
5485/// know that we must be referring to a type, e.g., in a base class specifier).
5486/// Typically the nested-name-specifier is dependent, but in MSVC compatibility
5487/// mode, this type is used with non-dependent names to delay name lookup until
5488/// instantiation.
5489class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode {
5490 friend class ASTContext; // ASTContext creates these
5491
5492 /// The nested name specifier containing the qualifier.
5493 NestedNameSpecifier *NNS;
5494
5495 /// The type that this typename specifier refers to.
5496 const IdentifierInfo *Name;
5497
5498 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
5499 const IdentifierInfo *Name, QualType CanonType)
5500 : TypeWithKeyword(Keyword, DependentName, CanonType,
5501 TypeDependence::DependentInstantiation |
5502 toTypeDependence(NNS->getDependence())),
5503 NNS(NNS), Name(Name) {}
5504
5505public:
5506 /// Retrieve the qualification on this type.
5507 NestedNameSpecifier *getQualifier() const { return NNS; }
5508
5509 /// Retrieve the type named by the typename specifier as an identifier.
5510 ///
5511 /// This routine will return a non-NULL identifier pointer when the
5512 /// form of the original typename was terminated by an identifier,
5513 /// e.g., "typename T::type".
5514 const IdentifierInfo *getIdentifier() const {
5515 return Name;
5516 }
5517
5518 bool isSugared() const { return false; }
5519 QualType desugar() const { return QualType(this, 0); }
5520
5521 void Profile(llvm::FoldingSetNodeID &ID) {
5522 Profile(ID, getKeyword(), NNS, Name);
5523 }
5524
5525 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
5526 NestedNameSpecifier *NNS, const IdentifierInfo *Name) {
5527 ID.AddInteger(Keyword);
5528 ID.AddPointer(NNS);
5529 ID.AddPointer(Name);
5530 }
5531
5532 static bool classof(const Type *T) {
5533 return T->getTypeClass() == DependentName;
5534 }
5535};
5536
5537/// Represents a template specialization type whose template cannot be
5538/// resolved, e.g.
5539/// A<T>::template B<T>
5540class alignas(8) DependentTemplateSpecializationType
5541 : public TypeWithKeyword,
5542 public llvm::FoldingSetNode {
5543 friend class ASTContext; // ASTContext creates these
5544
5545 /// The nested name specifier containing the qualifier.
5546 NestedNameSpecifier *NNS;
5547
5548 /// The identifier of the template.
5549 const IdentifierInfo *Name;
5550
5551 DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
5552 NestedNameSpecifier *NNS,
5553 const IdentifierInfo *Name,
5554 ArrayRef<TemplateArgument> Args,
5555 QualType Canon);
5556
5557 const TemplateArgument *getArgBuffer() const {
5558 return reinterpret_cast<const TemplateArgument*>(this+1);
5559 }
5560
5561 TemplateArgument *getArgBuffer() {
5562 return reinterpret_cast<TemplateArgument*>(this+1);
5563 }
5564
5565public:
5566 NestedNameSpecifier *getQualifier() const { return NNS; }
5567 const IdentifierInfo *getIdentifier() const { return Name; }
5568
5569 /// Retrieve the template arguments.
5570 const TemplateArgument *getArgs() const {
5571 return getArgBuffer();
5572 }
5573
5574 /// Retrieve the number of template arguments.
5575 unsigned getNumArgs() const {
5576 return DependentTemplateSpecializationTypeBits.NumArgs;
5577 }
5578
5579 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5580
5581 ArrayRef<TemplateArgument> template_arguments() const {
5582 return {getArgs(), getNumArgs()};
5583 }
5584
5585 using iterator = const TemplateArgument *;
5586
5587 iterator begin() const { return getArgs(); }
5588 iterator end() const; // inline in TemplateBase.h
5589
5590 bool isSugared() const { return false; }
5591 QualType desugar() const { return QualType(this, 0); }
5592
5593 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
5594 Profile(ID, Context, getKeyword(), NNS, Name, {getArgs(), getNumArgs()});
5595 }
5596
5597 static void Profile(llvm::FoldingSetNodeID &ID,
5598 const ASTContext &Context,
5599 ElaboratedTypeKeyword Keyword,
5600 NestedNameSpecifier *Qualifier,
5601 const IdentifierInfo *Name,
5602 ArrayRef<TemplateArgument> Args);
5603
5604 static bool classof(const Type *T) {
5605 return T->getTypeClass() == DependentTemplateSpecialization;
5606 }
5607};
5608
5609/// Represents a pack expansion of types.
5610///
5611/// Pack expansions are part of C++11 variadic templates. A pack
5612/// expansion contains a pattern, which itself contains one or more
5613/// "unexpanded" parameter packs. When instantiated, a pack expansion
5614/// produces a series of types, each instantiated from the pattern of
5615/// the expansion, where the Ith instantiation of the pattern uses the
5616/// Ith arguments bound to each of the unexpanded parameter packs. The
5617/// pack expansion is considered to "expand" these unexpanded
5618/// parameter packs.
5619///
5620/// \code
5621/// template<typename ...Types> struct tuple;
5622///
5623/// template<typename ...Types>
5624/// struct tuple_of_references {
5625/// typedef tuple<Types&...> type;
5626/// };
5627/// \endcode
5628///
5629/// Here, the pack expansion \c Types&... is represented via a
5630/// PackExpansionType whose pattern is Types&.
5631class PackExpansionType : public Type, public llvm::FoldingSetNode {
5632 friend class ASTContext; // ASTContext creates these
5633
5634 /// The pattern of the pack expansion.
5635 QualType Pattern;
5636
5637 PackExpansionType(QualType Pattern, QualType Canon,
5638 Optional<unsigned> NumExpansions)
5639 : Type(PackExpansion, Canon,
5640 (Pattern->getDependence() | TypeDependence::Dependent |
5641 TypeDependence::Instantiation) &
5642 ~TypeDependence::UnexpandedPack),
5643 Pattern(Pattern) {
5644 PackExpansionTypeBits.NumExpansions =
5645 NumExpansions ? *NumExpansions + 1 : 0;
5646 }
5647
5648public:
5649 /// Retrieve the pattern of this pack expansion, which is the
5650 /// type that will be repeatedly instantiated when instantiating the
5651 /// pack expansion itself.
5652 QualType getPattern() const { return Pattern; }
5653
5654 /// Retrieve the number of expansions that this pack expansion will
5655 /// generate, if known.
5656 Optional<unsigned> getNumExpansions() const {
5657 if (PackExpansionTypeBits.NumExpansions)
5658 return PackExpansionTypeBits.NumExpansions - 1;
5659 return None;
5660 }
5661
5662 bool isSugared() const { return false; }
5663 QualType desugar() const { return QualType(this, 0); }
5664
5665 void Profile(llvm::FoldingSetNodeID &ID) {
5666 Profile(ID, getPattern(), getNumExpansions());
5667 }
5668
5669 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
5670 Optional<unsigned> NumExpansions) {
5671 ID.AddPointer(Pattern.getAsOpaquePtr());
5672 ID.AddBoolean(NumExpansions.hasValue());
5673 if (NumExpansions)
5674 ID.AddInteger(*NumExpansions);
5675 }
5676
5677 static bool classof(const Type *T) {
5678 return T->getTypeClass() == PackExpansion;
5679 }
5680};
5681
5682/// This class wraps the list of protocol qualifiers. For types that can
5683/// take ObjC protocol qualifers, they can subclass this class.
5684template <class T>
5685class ObjCProtocolQualifiers {
5686protected:
5687 ObjCProtocolQualifiers() = default;
5688
5689 ObjCProtocolDecl * const *getProtocolStorage() const {
5690 return const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage();
5691 }
5692
5693 ObjCProtocolDecl **getProtocolStorage() {
5694 return static_cast<T*>(this)->getProtocolStorageImpl();
5695 }
5696
5697 void setNumProtocols(unsigned N) {
5698 static_cast<T*>(this)->setNumProtocolsImpl(N);
5699 }
5700
5701 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
5702 setNumProtocols(protocols.size());
5703 assert(getNumProtocols() == protocols.size() &&(static_cast<void> (0))
5704 "bitfield overflow in protocol count")(static_cast<void> (0));
5705 if (!protocols.empty())
5706 memcpy(getProtocolStorage(), protocols.data(),
5707 protocols.size() * sizeof(ObjCProtocolDecl*));
5708 }
5709
5710public:
5711 using qual_iterator = ObjCProtocolDecl * const *;
5712 using qual_range = llvm::iterator_range<qual_iterator>;
5713
5714 qual_range quals() const { return qual_range(qual_begin(), qual_end()); }
5715 qual_iterator qual_begin() const { return getProtocolStorage(); }
5716 qual_iterator qual_end() const { return qual_begin() + getNumProtocols(); }
5717
5718 bool qual_empty() const { return getNumProtocols() == 0; }
5719
5720 /// Return the number of qualifying protocols in this type, or 0 if
5721 /// there are none.
5722 unsigned getNumProtocols() const {
5723 return static_cast<const T*>(this)->getNumProtocolsImpl();
5724 }
5725
5726 /// Fetch a protocol by index.
5727 ObjCProtocolDecl *getProtocol(unsigned I) const {
5728 assert(I < getNumProtocols() && "Out-of-range protocol access")(static_cast<void> (0));
5729 return qual_begin()[I];
5730 }
5731
5732 /// Retrieve all of the protocol qualifiers.
5733 ArrayRef<ObjCProtocolDecl *> getProtocols() const {
5734 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
5735 }
5736};
5737
5738/// Represents a type parameter type in Objective C. It can take
5739/// a list of protocols.
5740class ObjCTypeParamType : public Type,
5741 public ObjCProtocolQualifiers<ObjCTypeParamType>,
5742 public llvm::FoldingSetNode {
5743 friend class ASTContext;
5744 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
5745
5746 /// The number of protocols stored on this type.
5747 unsigned NumProtocols : 6;
5748
5749 ObjCTypeParamDecl *OTPDecl;
5750
5751 /// The protocols are stored after the ObjCTypeParamType node. In the
5752 /// canonical type, the list of protocols are sorted alphabetically
5753 /// and uniqued.
5754 ObjCProtocolDecl **getProtocolStorageImpl();
5755
5756 /// Return the number of qualifying protocols in this interface type,
5757 /// or 0 if there are none.
5758 unsigned getNumProtocolsImpl() const {
5759 return NumProtocols;
5760 }
5761
5762 void setNumProtocolsImpl(unsigned N) {
5763 NumProtocols = N;
5764 }
5765
5766 ObjCTypeParamType(const ObjCTypeParamDecl *D,
5767 QualType can,
5768 ArrayRef<ObjCProtocolDecl *> protocols);
5769
5770public:
5771 bool isSugared() const { return true; }
5772 QualType desugar() const { return getCanonicalTypeInternal(); }
5773
5774 static bool classof(const Type *T) {
5775 return T->getTypeClass() == ObjCTypeParam;
5776 }
5777
5778 void Profile(llvm::FoldingSetNodeID &ID);
5779 static void Profile(llvm::FoldingSetNodeID &ID,
5780 const ObjCTypeParamDecl *OTPDecl,
5781 QualType CanonicalType,
5782 ArrayRef<ObjCProtocolDecl *> protocols);
5783
5784 ObjCTypeParamDecl *getDecl() const { return OTPDecl; }
5785};
5786
5787/// Represents a class type in Objective C.
5788///
5789/// Every Objective C type is a combination of a base type, a set of
5790/// type arguments (optional, for parameterized classes) and a list of
5791/// protocols.
5792///
5793/// Given the following declarations:
5794/// \code
5795/// \@class C<T>;
5796/// \@protocol P;
5797/// \endcode
5798///
5799/// 'C' is an ObjCInterfaceType C. It is sugar for an ObjCObjectType
5800/// with base C and no protocols.
5801///
5802/// 'C<P>' is an unspecialized ObjCObjectType with base C and protocol list [P].
5803/// 'C<C*>' is a specialized ObjCObjectType with type arguments 'C*' and no
5804/// protocol list.
5805/// 'C<C*><P>' is a specialized ObjCObjectType with base C, type arguments 'C*',
5806/// and protocol list [P].
5807///
5808/// 'id' is a TypedefType which is sugar for an ObjCObjectPointerType whose
5809/// pointee is an ObjCObjectType with base BuiltinType::ObjCIdType
5810/// and no protocols.
5811///
5812/// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType
5813/// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually
5814/// this should get its own sugar class to better represent the source.
5815class ObjCObjectType : public Type,
5816 public ObjCProtocolQualifiers<ObjCObjectType> {
5817 friend class ObjCProtocolQualifiers<ObjCObjectType>;
5818
5819 // ObjCObjectType.NumTypeArgs - the number of type arguments stored
5820 // after the ObjCObjectPointerType node.
5821 // ObjCObjectType.NumProtocols - the number of protocols stored
5822 // after the type arguments of ObjCObjectPointerType node.
5823 //
5824 // These protocols are those written directly on the type. If
5825 // protocol qualifiers ever become additive, the iterators will need
5826 // to get kindof complicated.
5827 //
5828 // In the canonical object type, these are sorted alphabetically
5829 // and uniqued.
5830
5831 /// Either a BuiltinType or an InterfaceType or sugar for either.
5832 QualType BaseType;
5833
5834 /// Cached superclass type.
5835 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
5836 CachedSuperClassType;
5837
5838 QualType *getTypeArgStorage();
5839 const QualType *getTypeArgStorage() const {
5840 return const_cast<ObjCObjectType *>(this)->getTypeArgStorage();
5841 }
5842
5843 ObjCProtocolDecl **getProtocolStorageImpl();
5844 /// Return the number of qualifying protocols in this interface type,
5845 /// or 0 if there are none.
5846 unsigned getNumProtocolsImpl() const {
5847 return ObjCObjectTypeBits.NumProtocols;
5848 }
5849 void setNumProtocolsImpl(unsigned N) {
5850 ObjCObjectTypeBits.NumProtocols = N;
5851 }
5852
5853protected:
5854 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
5855
5856 ObjCObjectType(QualType Canonical, QualType Base,
5857 ArrayRef<QualType> typeArgs,
5858 ArrayRef<ObjCProtocolDecl *> protocols,
5859 bool isKindOf);
5860
5861 ObjCObjectType(enum Nonce_ObjCInterface)
5862 : Type(ObjCInterface, QualType(), TypeDependence::None),
5863 BaseType(QualType(this_(), 0)) {
5864 ObjCObjectTypeBits.NumProtocols = 0;
5865 ObjCObjectTypeBits.NumTypeArgs = 0;
5866 ObjCObjectTypeBits.IsKindOf = 0;
5867 }
5868
5869 void computeSuperClassTypeSlow() const;
5870
5871public:
5872 /// Gets the base type of this object type. This is always (possibly
5873 /// sugar for) one of:
5874 /// - the 'id' builtin type (as opposed to the 'id' type visible to the
5875 /// user, which is a typedef for an ObjCObjectPointerType)
5876 /// - the 'Class' builtin type (same caveat)
5877 /// - an ObjCObjectType (currently always an ObjCInterfaceType)
5878 QualType getBaseType() const { return BaseType; }
5879
5880 bool isObjCId() const {
5881 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
5882 }
5883
5884 bool isObjCClass() const {
5885 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
5886 }
5887
5888 bool isObjCUnqualifiedId() const { return qual_empty() && isObjCId(); }
5889 bool isObjCUnqualifiedClass() const { return qual_empty() && isObjCClass(); }
5890 bool isObjCUnqualifiedIdOrClass() const {
5891 if (!qual_empty()) return false;
5892 if (const BuiltinType *T = getBaseType()->getAs<BuiltinType>())
5893 return T->getKind() == BuiltinType::ObjCId ||
5894 T->getKind() == BuiltinType::ObjCClass;
5895 return false;
5896 }
5897 bool isObjCQualifiedId() const { return !qual_empty() && isObjCId(); }
5898 bool isObjCQualifiedClass() const { return !qual_empty() && isObjCClass(); }
5899
5900 /// Gets the interface declaration for this object type, if the base type
5901 /// really is an interface.
5902 ObjCInterfaceDecl *getInterface() const;
5903
5904 /// Determine whether this object type is "specialized", meaning
5905 /// that it has type arguments.
5906 bool isSpecialized() const;
5907
5908 /// Determine whether this object type was written with type arguments.
5909 bool isSpecializedAsWritten() const {
5910 return ObjCObjectTypeBits.NumTypeArgs > 0;
5911 }
5912
5913 /// Determine whether this object type is "unspecialized", meaning
5914 /// that it has no type arguments.
5915 bool isUnspecialized() const { return !isSpecialized(); }
5916
5917 /// Determine whether this object type is "unspecialized" as
5918 /// written, meaning that it has no type arguments.
5919 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); }
5920
5921 /// Retrieve the type arguments of this object type (semantically).
5922 ArrayRef<QualType> getTypeArgs() const;
5923
5924 /// Retrieve the type arguments of this object type as they were
5925 /// written.
5926 ArrayRef<QualType> getTypeArgsAsWritten() const {
5927 return llvm::makeArrayRef(getTypeArgStorage(),
5928 ObjCObjectTypeBits.NumTypeArgs);
5929 }
5930
5931 /// Whether this is a "__kindof" type as written.
5932 bool isKindOfTypeAsWritten() const { return ObjCObjectTypeBits.IsKindOf; }
5933
5934 /// Whether this ia a "__kindof" type (semantically).
5935 bool isKindOfType() const;
5936
5937 /// Retrieve the type of the superclass of this object type.
5938 ///
5939 /// This operation substitutes any type arguments into the
5940 /// superclass of the current class type, potentially producing a
5941 /// specialization of the superclass type. Produces a null type if
5942 /// there is no superclass.
5943 QualType getSuperClassType() const {
5944 if (!CachedSuperClassType.getInt())
5945 computeSuperClassTypeSlow();
5946
5947 assert(CachedSuperClassType.getInt() && "Superclass not set?")(static_cast<void> (0));
5948 return QualType(CachedSuperClassType.getPointer(), 0);
5949 }
5950
5951 /// Strip off the Objective-C "kindof" type and (with it) any
5952 /// protocol qualifiers.
5953 QualType stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const;
5954
5955 bool isSugared() const { return false; }
5956 QualType desugar() const { return QualType(this, 0); }
5957
5958 static bool classof(const Type *T) {
5959 return T->getTypeClass() == ObjCObject ||
5960 T->getTypeClass() == ObjCInterface;
5961 }
5962};
5963
5964/// A class providing a concrete implementation
5965/// of ObjCObjectType, so as to not increase the footprint of
5966/// ObjCInterfaceType. Code outside of ASTContext and the core type
5967/// system should not reference this type.
5968class ObjCObjectTypeImpl : public ObjCObjectType, public llvm::FoldingSetNode {
5969 friend class ASTContext;
5970
5971 // If anyone adds fields here, ObjCObjectType::getProtocolStorage()
5972 // will need to be modified.
5973
5974 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
5975 ArrayRef<QualType> typeArgs,
5976 ArrayRef<ObjCProtocolDecl *> protocols,
5977 bool isKindOf)
5978 : ObjCObjectType(Canonical, Base, typeArgs, protocols, isKindOf) {}
5979
5980public:
5981 void Profile(llvm::FoldingSetNodeID &ID);
5982 static void Profile(llvm::FoldingSetNodeID &ID,
5983 QualType Base,
5984 ArrayRef<QualType> typeArgs,
5985 ArrayRef<ObjCProtocolDecl *> protocols,
5986 bool isKindOf);
5987};
5988
5989inline QualType *ObjCObjectType::getTypeArgStorage() {
5990 return reinterpret_cast<QualType *>(static_cast<ObjCObjectTypeImpl*>(this)+1);
5991}
5992
5993inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
5994 return reinterpret_cast<ObjCProtocolDecl**>(
5995 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
5996}
5997
5998inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
5999 return reinterpret_cast<ObjCProtocolDecl**>(
6000 static_cast<ObjCTypeParamType*>(this)+1);
6001}
6002
6003/// Interfaces are the core concept in Objective-C for object oriented design.
6004/// They basically correspond to C++ classes. There are two kinds of interface
6005/// types: normal interfaces like `NSString`, and qualified interfaces, which
6006/// are qualified with a protocol list like `NSString<NSCopyable, NSAmazing>`.
6007///
6008/// ObjCInterfaceType guarantees the following properties when considered
6009/// as a subtype of its superclass, ObjCObjectType:
6010/// - There are no protocol qualifiers. To reinforce this, code which
6011/// tries to invoke the protocol methods via an ObjCInterfaceType will
6012/// fail to compile.
6013/// - It is its own base type. That is, if T is an ObjCInterfaceType*,
6014/// T->getBaseType() == QualType(T, 0).
6015class ObjCInterfaceType : public ObjCObjectType {
6016 friend class ASTContext; // ASTContext creates these.
6017 friend class ASTReader;
6018 friend class ObjCInterfaceDecl;
6019 template <class T> friend class serialization::AbstractTypeReader;
6020
6021 mutable ObjCInterfaceDecl *Decl;
6022
6023 ObjCInterfaceType(const ObjCInterfaceDecl *D)
6024 : ObjCObjectType(Nonce_ObjCInterface),
6025 Decl(const_cast<ObjCInterfaceDecl*>(D)) {}
6026
6027public:
6028 /// Get the declaration of this interface.
6029 ObjCInterfaceDecl *getDecl() const { return Decl; }
6030
6031 bool isSugared() const { return false; }
6032 QualType desugar() const { return QualType(this, 0); }
6033
6034 static bool classof(const Type *T) {
6035 return T->getTypeClass() == ObjCInterface;
6036 }
6037
6038 // Nonsense to "hide" certain members of ObjCObjectType within this
6039 // class. People asking for protocols on an ObjCInterfaceType are
6040 // not going to get what they want: ObjCInterfaceTypes are
6041 // guaranteed to have no protocols.
6042 enum {
6043 qual_iterator,
6044 qual_begin,
6045 qual_end,
6046 getNumProtocols,
6047 getProtocol
6048 };
6049};
6050
6051inline ObjCInterfaceDecl *ObjCObjectType::getInterface() const {
6052 QualType baseType = getBaseType();
6053 while (const auto *ObjT = baseType->getAs<ObjCObjectType>()) {
6054 if (const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
6055 return T->getDecl();
6056
6057 baseType = ObjT->getBaseType();
6058 }
6059
6060 return nullptr;
6061}
6062
6063/// Represents a pointer to an Objective C object.
6064///
6065/// These are constructed from pointer declarators when the pointee type is
6066/// an ObjCObjectType (or sugar for one). In addition, the 'id' and 'Class'
6067/// types are typedefs for these, and the protocol-qualified types 'id<P>'
6068/// and 'Class<P>' are translated into these.
6069///
6070/// Pointers to pointers to Objective C objects are still PointerTypes;
6071/// only the first level of pointer gets it own type implementation.
6072class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode {
6073 friend class ASTContext; // ASTContext creates these.
6074
6075 QualType PointeeType;
6076
6077 ObjCObjectPointerType(QualType Canonical, QualType Pointee)
6078 : Type(ObjCObjectPointer, Canonical, Pointee->getDependence()),
6079 PointeeType(Pointee) {}
6080
6081public:
6082 /// Gets the type pointed to by this ObjC pointer.
6083 /// The result will always be an ObjCObjectType or sugar thereof.
6084 QualType getPointeeType() const { return PointeeType; }
6085
6086 /// Gets the type pointed to by this ObjC pointer. Always returns non-null.
6087 ///
6088 /// This method is equivalent to getPointeeType() except that
6089 /// it discards any typedefs (or other sugar) between this
6090 /// type and the "outermost" object type. So for:
6091 /// \code
6092 /// \@class A; \@protocol P; \@protocol Q;
6093 /// typedef A<P> AP;
6094 /// typedef A A1;
6095 /// typedef A1<P> A1P;
6096 /// typedef A1P<Q> A1PQ;
6097 /// \endcode
6098 /// For 'A*', getObjectType() will return 'A'.
6099 /// For 'A<P>*', getObjectType() will return 'A<P>'.
6100 /// For 'AP*', getObjectType() will return 'A<P>'.
6101 /// For 'A1*', getObjectType() will return 'A'.
6102 /// For 'A1<P>*', getObjectType() will return 'A1<P>'.
6103 /// For 'A1P*', getObjectType() will return 'A1<P>'.
6104 /// For 'A1PQ*', getObjectType() will return 'A1<Q>', because
6105 /// adding protocols to a protocol-qualified base discards the
6106 /// old qualifiers (for now). But if it didn't, getObjectType()
6107 /// would return 'A1P<Q>' (and we'd have to make iterating over
6108 /// qualifiers more complicated).
6109 const ObjCObjectType *getObjectType() const {
6110 return PointeeType->castAs<ObjCObjectType>();
6111 }
6112
6113 /// If this pointer points to an Objective C
6114 /// \@interface type, gets the type for that interface. Any protocol
6115 /// qualifiers on the interface are ignored.
6116 ///
6117 /// \return null if the base type for this pointer is 'id' or 'Class'
6118 const ObjCInterfaceType *getInterfaceType() const;
6119
6120 /// If this pointer points to an Objective \@interface
6121 /// type, gets the declaration for that interface.
6122 ///
6123 /// \return null if the base type for this pointer is 'id' or 'Class'
6124 ObjCInterfaceDecl *getInterfaceDecl() const {
6125 return getObjectType()->getInterface();
6126 }
6127
6128 /// True if this is equivalent to the 'id' type, i.e. if
6129 /// its object type is the primitive 'id' type with no protocols.
6130 bool isObjCIdType() const {
6131 return getObjectType()->isObjCUnqualifiedId();
6132 }
6133
6134 /// True if this is equivalent to the 'Class' type,
6135 /// i.e. if its object tive is the primitive 'Class' type with no protocols.
6136 bool isObjCClassType() const {
6137 return getObjectType()->isObjCUnqualifiedClass();
6138 }
6139
6140 /// True if this is equivalent to the 'id' or 'Class' type,
6141 bool isObjCIdOrClassType() const {
6142 return getObjectType()->isObjCUnqualifiedIdOrClass();
6143 }
6144
6145 /// True if this is equivalent to 'id<P>' for some non-empty set of
6146 /// protocols.
6147 bool isObjCQualifiedIdType() const {
6148 return getObjectType()->isObjCQualifiedId();
6149 }
6150
6151 /// True if this is equivalent to 'Class<P>' for some non-empty set of
6152 /// protocols.
6153 bool isObjCQualifiedClassType() const {
6154 return getObjectType()->isObjCQualifiedClass();
6155 }
6156
6157 /// Whether this is a "__kindof" type.
6158 bool isKindOfType() const { return getObjectType()->isKindOfType(); }
6159
6160 /// Whether this type is specialized, meaning that it has type arguments.
6161 bool isSpecialized() const { return getObjectType()->isSpecialized(); }
6162
6163 /// Whether this type is specialized, meaning that it has type arguments.
6164 bool isSpecializedAsWritten() const {
6165 return getObjectType()->isSpecializedAsWritten();
6166 }
6167
6168 /// Whether this type is unspecialized, meaning that is has no type arguments.
6169 bool isUnspecialized() const { return getObjectType()->isUnspecialized(); }
6170
6171 /// Determine whether this object type is "unspecialized" as
6172 /// written, meaning that it has no type arguments.
6173 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); }
6174
6175 /// Retrieve the type arguments for this type.
6176 ArrayRef<QualType> getTypeArgs() const {
6177 return getObjectType()->getTypeArgs();
6178 }
6179
6180 /// Retrieve the type arguments for this type.
6181 ArrayRef<QualType> getTypeArgsAsWritten() const {
6182 return getObjectType()->getTypeArgsAsWritten();
6183 }
6184
6185 /// An iterator over the qualifiers on the object type. Provided
6186 /// for convenience. This will always iterate over the full set of
6187 /// protocols on a type, not just those provided directly.
6188 using qual_iterator = ObjCObjectType::qual_iterator;
6189 using qual_range = llvm::iterator_range<qual_iterator>;
6190
6191 qual_range quals() const { return qual_range(qual_begin(), qual_end()); }
6192
6193 qual_iterator qual_begin() const {
6194 return getObjectType()->qual_begin();
6195 }
6196
6197 qual_iterator qual_end() const {
6198 return getObjectType()->qual_end();
6199 }
6200
6201 bool qual_empty() const { return getObjectType()->qual_empty(); }
6202
6203 /// Return the number of qualifying protocols on the object type.
6204 unsigned getNumProtocols() const {
6205 return getObjectType()->getNumProtocols();
6206 }
6207
6208 /// Retrieve a qualifying protocol by index on the object type.
6209 ObjCProtocolDecl *getProtocol(unsigned I) const {
6210 return getObjectType()->getProtocol(I);
6211 }
6212
6213 bool isSugared() const { return false; }
6214 QualType desugar() const { return QualType(this, 0); }
6215
6216 /// Retrieve the type of the superclass of this object pointer type.
6217 ///
6218 /// This operation substitutes any type arguments into the
6219 /// superclass of the current class type, potentially producing a
6220 /// pointer to a specialization of the superclass type. Produces a
6221 /// null type if there is no superclass.
6222 QualType getSuperClassType() const;
6223
6224 /// Strip off the Objective-C "kindof" type and (with it) any
6225 /// protocol qualifiers.
6226 const ObjCObjectPointerType *stripObjCKindOfTypeAndQuals(
6227 const ASTContext &ctx) const;
6228
6229 void Profile(llvm::FoldingSetNodeID &ID) {
6230 Profile(ID, getPointeeType());
6231 }
6232
6233 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) {
6234 ID.AddPointer(T.getAsOpaquePtr());
6235 }
6236
6237 static bool classof(const Type *T) {
6238 return T->getTypeClass() == ObjCObjectPointer;
6239 }
6240};
6241
6242class AtomicType : public Type, public llvm::FoldingSetNode {
6243 friend class ASTContext; // ASTContext creates these.
6244
6245 QualType ValueType;
6246
6247 AtomicType(QualType ValTy, QualType Canonical)
6248 : Type(Atomic, Canonical, ValTy->getDependence()), ValueType(ValTy) {}
6249
6250public:
6251 /// Gets the type contained by this atomic type, i.e.
6252 /// the type returned by performing an atomic load of this atomic type.
6253 QualType getValueType() const { return ValueType; }
6254
6255 bool isSugared() const { return false; }
6256 QualType desugar() const { return QualType(this, 0); }
6257
6258 void Profile(llvm::FoldingSetNodeID &ID) {
6259 Profile(ID, getValueType());
6260 }
6261
6262 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) {
6263 ID.AddPointer(T.getAsOpaquePtr());
6264 }
6265
6266 static bool classof(const Type *T) {
6267 return T->getTypeClass() == Atomic;
6268 }
6269};
6270
6271/// PipeType - OpenCL20.
6272class PipeType : public Type, public llvm::FoldingSetNode {
6273 friend class ASTContext; // ASTContext creates these.
6274
6275 QualType ElementType;
6276 bool isRead;
6277
6278 PipeType(QualType elemType, QualType CanonicalPtr, bool isRead)
6279 : Type(Pipe, CanonicalPtr, elemType->getDependence()),
6280 ElementType(elemType), isRead(isRead) {}
6281
6282public:
6283 QualType getElementType() const { return ElementType; }
6284
6285 bool isSugared() const { return false; }
6286
6287 QualType desugar() const { return QualType(this, 0); }
6288
6289 void Profile(llvm::FoldingSetNodeID &ID) {
6290 Profile(ID, getElementType(), isReadOnly());
6291 }
6292
6293 static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead) {
6294 ID.AddPointer(T.getAsOpaquePtr());
6295 ID.AddBoolean(isRead);
6296 }
6297
6298 static bool classof(const Type *T) {
6299 return T->getTypeClass() == Pipe;
6300 }
6301
6302 bool isReadOnly() const { return isRead; }
6303};
6304
6305/// A fixed int type of a specified bitwidth.
6306class ExtIntType final : public Type, public llvm::FoldingSetNode {
6307 friend class ASTContext;
6308 unsigned IsUnsigned : 1;
6309 unsigned NumBits : 24;
6310
6311protected:
6312 ExtIntType(bool isUnsigned, unsigned NumBits);
6313
6314public:
6315 bool isUnsigned() const { return IsUnsigned; }
6316 bool isSigned() const { return !IsUnsigned; }
6317 unsigned getNumBits() const { return NumBits; }
6318
6319 bool isSugared() const { return false; }
6320 QualType desugar() const { return QualType(this, 0); }
6321
6322 void Profile(llvm::FoldingSetNodeID &ID) {
6323 Profile(ID, isUnsigned(), getNumBits());
6324 }
6325
6326 static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned,
6327 unsigned NumBits) {
6328 ID.AddBoolean(IsUnsigned);
6329 ID.AddInteger(NumBits);
6330 }
6331
6332 static bool classof(const Type *T) { return T->getTypeClass() == ExtInt; }
6333};
6334
6335class DependentExtIntType final : public Type, public llvm::FoldingSetNode {
6336 friend class ASTContext;
6337 const ASTContext &Context;
6338 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
6339
6340protected:
6341 DependentExtIntType(const ASTContext &Context, bool IsUnsigned,
6342 Expr *NumBits);
6343
6344public:
6345 bool isUnsigned() const;
6346 bool isSigned() const { return !isUnsigned(); }
6347 Expr *getNumBitsExpr() const;
6348
6349 bool isSugared() const { return false; }
6350 QualType desugar() const { return QualType(this, 0); }
6351
6352 void Profile(llvm::FoldingSetNodeID &ID) {
6353 Profile(ID, Context, isUnsigned(), getNumBitsExpr());
6354 }
6355 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
6356 bool IsUnsigned, Expr *NumBitsExpr);
6357
6358 static bool classof(const Type *T) {
6359 return T->getTypeClass() == DependentExtInt;
6360 }
6361};
6362
6363/// A qualifier set is used to build a set of qualifiers.
6364class QualifierCollector : public Qualifiers {
6365public:
6366 QualifierCollector(Qualifiers Qs = Qualifiers()) : Qualifiers(Qs) {}
6367
6368 /// Collect any qualifiers on the given type and return an
6369 /// unqualified type. The qualifiers are assumed to be consistent
6370 /// with those already in the type.
6371 const Type *strip(QualType type) {
6372 addFastQualifiers(type.getLocalFastQualifiers());
6373 if (!type.hasLocalNonFastQualifiers())
6374 return type.getTypePtrUnsafe();
6375
6376 const ExtQuals *extQuals = type.getExtQualsUnsafe();
6377 addConsistentQualifiers(extQuals->getQualifiers());
6378 return extQuals->getBaseType();
6379 }
6380
6381 /// Apply the collected qualifiers to the given type.
6382 QualType apply(const ASTContext &Context, QualType QT) const;
6383
6384 /// Apply the collected qualifiers to the given type.
6385 QualType apply(const ASTContext &Context, const Type* T) const;
6386};
6387
6388/// A container of type source information.
6389///
6390/// A client can read the relevant info using TypeLoc wrappers, e.g:
6391/// @code
6392/// TypeLoc TL = TypeSourceInfo->getTypeLoc();
6393/// TL.getBeginLoc().print(OS, SrcMgr);
6394/// @endcode
6395class alignas(8) TypeSourceInfo {
6396 // Contains a memory block after the class, used for type source information,
6397 // allocated by ASTContext.
6398 friend class ASTContext;
6399
6400 QualType Ty;
6401
6402 TypeSourceInfo(QualType ty) : Ty(ty) {}
6403
6404public:
6405 /// Return the type wrapped by this type source info.
6406 QualType getType() const { return Ty; }
6407
6408 /// Return the TypeLoc wrapper for the type source info.
6409 TypeLoc getTypeLoc() const; // implemented in TypeLoc.h
6410
6411 /// Override the type stored in this TypeSourceInfo. Use with caution!
6412 void overrideType(QualType T) { Ty = T; }
6413};
6414
6415// Inline function definitions.
6416
6417inline SplitQualType SplitQualType::getSingleStepDesugaredType() const {
6418 SplitQualType desugar =
6419 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
6420 desugar.Quals.addConsistentQualifiers(Quals);
6421 return desugar;
6422}
6423
6424inline const Type *QualType::getTypePtr() const {
6425 return getCommonPtr()->BaseType;
6426}
6427
6428inline const Type *QualType::getTypePtrOrNull() const {
6429 return (isNull() ? nullptr : getCommonPtr()->BaseType);
6430}
6431
6432inline SplitQualType QualType::split() const {
6433 if (!hasLocalNonFastQualifiers())
6434 return SplitQualType(getTypePtrUnsafe(),
6435 Qualifiers::fromFastMask(getLocalFastQualifiers()));
6436
6437 const ExtQuals *eq = getExtQualsUnsafe();
6438 Qualifiers qs = eq->getQualifiers();
6439 qs.addFastQualifiers(getLocalFastQualifiers());
6440 return SplitQualType(eq->getBaseType(), qs);
6441}
6442
6443inline Qualifiers QualType::getLocalQualifiers() const {
6444 Qualifiers Quals;
6445 if (hasLocalNonFastQualifiers())
6446 Quals = getExtQualsUnsafe()->getQualifiers();
6447 Quals.addFastQualifiers(getLocalFastQualifiers());
6448 return Quals;
6449}
6450
6451inline Qualifiers QualType::getQualifiers() const {
6452 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
6453 quals.addFastQualifiers(getLocalFastQualifiers());
6454 return quals;
6455}
6456
6457inline unsigned QualType::getCVRQualifiers() const {
6458 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
6459 cvr |= getLocalCVRQualifiers();
6460 return cvr;
6461}
6462
6463inline QualType QualType::getCanonicalType() const {
6464 QualType canon = getCommonPtr()->CanonicalType;
6465 return canon.withFastQualifiers(getLocalFastQualifiers());
6466}
6467
6468inline bool QualType::isCanonical() const {
6469 return getTypePtr()->isCanonicalUnqualified();
6470}
6471
6472inline bool QualType::isCanonicalAsParam() const {
6473 if (!isCanonical()) return false;
6474 if (hasLocalQualifiers()) return false;
6475
6476 const Type *T = getTypePtr();
6477 if (T->isVariablyModifiedType() && T->hasSizedVLAType())
6478 return false;
6479
6480 return !isa<FunctionType>(T) && !isa<ArrayType>(T);
6481}
6482
6483inline bool QualType::isConstQualified() const {
6484 return isLocalConstQualified() ||
6485 getCommonPtr()->CanonicalType.isLocalConstQualified();
6486}
6487
6488inline bool QualType::isRestrictQualified() const {
6489 return isLocalRestrictQualified() ||
6490 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
6491}
6492
6493
6494inline bool QualType::isVolatileQualified() const {
6495 return isLocalVolatileQualified() ||
6496 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
6497}
6498
6499inline bool QualType::hasQualifiers() const {
6500 return hasLocalQualifiers() ||
6501 getCommonPtr()->CanonicalType.hasLocalQualifiers();
6502}
6503
6504inline QualType QualType::getUnqualifiedType() const {
6505 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers())
6506 return QualType(getTypePtr(), 0);
6507
6508 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
6509}
6510
6511inline SplitQualType QualType::getSplitUnqualifiedType() const {
6512 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers())
6513 return split();
6514
6515 return getSplitUnqualifiedTypeImpl(*this);
6516}
6517
6518inline void QualType::removeLocalConst() {
6519 removeLocalFastQualifiers(Qualifiers::Const);
6520}
6521
6522inline void QualType::removeLocalRestrict() {
6523 removeLocalFastQualifiers(Qualifiers::Restrict);
6524}
6525
6526inline void QualType::removeLocalVolatile() {
6527 removeLocalFastQualifiers(Qualifiers::Volatile);
6528}
6529
6530inline void QualType::removeLocalCVRQualifiers(unsigned Mask) {
6531 assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits")(static_cast<void> (0));
6532 static_assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask,
6533 "Fast bits differ from CVR bits!");
6534
6535 // Fast path: we don't need to touch the slow qualifiers.
6536 removeLocalFastQualifiers(Mask);
6537}
6538
6539/// Check if this type has any address space qualifier.
6540inline bool QualType::hasAddressSpace() const {
6541 return getQualifiers().hasAddressSpace();
6542}
6543
6544/// Return the address space of this type.
6545inline LangAS QualType::getAddressSpace() const {
6546 return getQualifiers().getAddressSpace();
6547}
6548
6549/// Return the gc attribute of this type.
6550inline Qualifiers::GC QualType::getObjCGCAttr() const {
6551 return getQualifiers().getObjCGCAttr();
6552}
6553
6554inline bool QualType::hasNonTrivialToPrimitiveDefaultInitializeCUnion() const {
6555 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6556 return hasNonTrivialToPrimitiveDefaultInitializeCUnion(RD);
6557 return false;
6558}
6559
6560inline bool QualType::hasNonTrivialToPrimitiveDestructCUnion() const {
6561 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6562 return hasNonTrivialToPrimitiveDestructCUnion(RD);
6563 return false;
6564}
6565
6566inline bool QualType::hasNonTrivialToPrimitiveCopyCUnion() const {
6567 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6568 return hasNonTrivialToPrimitiveCopyCUnion(RD);
6569 return false;
6570}
6571
6572inline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) {
6573 if (const auto *PT = t.getAs<PointerType>()) {
6574 if (const auto *FT = PT->getPointeeType()->getAs<FunctionType>())
6575 return FT->getExtInfo();
6576 } else if (const auto *FT = t.getAs<FunctionType>())
6577 return FT->getExtInfo();
6578
6579 return FunctionType::ExtInfo();
6580}
6581
6582inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) {
6583 return getFunctionExtInfo(*t);
6584}
6585
6586/// Determine whether this type is more
6587/// qualified than the Other type. For example, "const volatile int"
6588/// is more qualified than "const int", "volatile int", and
6589/// "int". However, it is not more qualified than "const volatile
6590/// int".
6591inline bool QualType::isMoreQualifiedThan(QualType other) const {
6592 Qualifiers MyQuals = getQualifiers();
6593 Qualifiers OtherQuals = other.getQualifiers();
6594 return (MyQuals != OtherQuals && MyQuals.compatiblyIncludes(OtherQuals));
6595}
6596
6597/// Determine whether this type is at last
6598/// as qualified as the Other type. For example, "const volatile
6599/// int" is at least as qualified as "const int", "volatile int",
6600/// "int", and "const volatile int".
6601inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const {
6602 Qualifiers OtherQuals = other.getQualifiers();
6603
6604 // Ignore __unaligned qualifier if this type is a void.
6605 if (getUnqualifiedType()->isVoidType())
6606 OtherQuals.removeUnaligned();
6607
6608 return getQualifiers().compatiblyIncludes(OtherQuals);
6609}
6610
6611/// If Type is a reference type (e.g., const
6612/// int&), returns the type that the reference refers to ("const
6613/// int"). Otherwise, returns the type itself. This routine is used
6614/// throughout Sema to implement C++ 5p6:
6615///
6616/// If an expression initially has the type "reference to T" (8.3.2,
6617/// 8.5.3), the type is adjusted to "T" prior to any further
6618/// analysis, the expression designates the object or function
6619/// denoted by the reference, and the expression is an lvalue.
6620inline QualType QualType::getNonReferenceType() const {
6621 if (const auto *RefType = (*this)->getAs<ReferenceType>())
6622 return RefType->getPointeeType();
6623 else
6624 return *this;
6625}
6626
6627inline bool QualType::isCForbiddenLValueType() const {
6628 return ((getTypePtr()->isVoidType() && !hasQualifiers()) ||
6629 getTypePtr()->isFunctionType());
6630}
6631
6632/// Tests whether the type is categorized as a fundamental type.
6633///
6634/// \returns True for types specified in C++0x [basic.fundamental].
6635inline bool Type::isFundamentalType() const {
6636 return isVoidType() ||
6637 isNullPtrType() ||
6638 // FIXME: It's really annoying that we don't have an
6639 // 'isArithmeticType()' which agrees with the standard definition.
6640 (isArithmeticType() && !isEnumeralType());
6641}
6642
6643/// Tests whether the type is categorized as a compound type.
6644///
6645/// \returns True for types specified in C++0x [basic.compound].
6646inline bool Type::isCompoundType() const {
6647 // C++0x [basic.compound]p1:
6648 // Compound types can be constructed in the following ways:
6649 // -- arrays of objects of a given type [...];
6650 return isArrayType() ||
6651 // -- functions, which have parameters of given types [...];
6652 isFunctionType() ||
6653 // -- pointers to void or objects or functions [...];
6654 isPointerType() ||
6655 // -- references to objects or functions of a given type. [...]
6656 isReferenceType() ||
6657 // -- classes containing a sequence of objects of various types, [...];
6658 isRecordType() ||
6659 // -- unions, which are classes capable of containing objects of different
6660 // types at different times;
6661 isUnionType() ||
6662 // -- enumerations, which comprise a set of named constant values. [...];
6663 isEnumeralType() ||
6664 // -- pointers to non-static class members, [...].
6665 isMemberPointerType();
6666}
6667
6668inline bool Type::isFunctionType() const {
6669 return isa<FunctionType>(CanonicalType);
6670}
6671
6672inline bool Type::isPointerType() const {
6673 return isa<PointerType>(CanonicalType);
6674}
6675
6676inline bool Type::isAnyPointerType() const {
6677 return isPointerType() || isObjCObjectPointerType();
6678}
6679
6680inline bool Type::isBlockPointerType() const {
6681 return isa<BlockPointerType>(CanonicalType);
6682}
6683
6684inline bool Type::isReferenceType() const {
6685 return isa<ReferenceType>(CanonicalType);
6686}
6687
6688inline bool Type::isLValueReferenceType() const {
6689 return isa<LValueReferenceType>(CanonicalType);
6690}
6691
6692inline bool Type::isRValueReferenceType() const {
6693 return isa<RValueReferenceType>(CanonicalType);
6694}
6695
6696inline bool Type::isObjectPointerType() const {
6697 // Note: an "object pointer type" is not the same thing as a pointer to an
6698 // object type; rather, it is a pointer to an object type or a pointer to cv
6699 // void.
6700 if (const auto *T = getAs<PointerType>())
6701 return !T->getPointeeType()->isFunctionType();
6702 else
6703 return false;
6704}
6705
6706inline bool Type::isFunctionPointerType() const {
6707 if (const auto *T = getAs<PointerType>())
6708 return T->getPointeeType()->isFunctionType();
6709 else
6710 return false;
6711}
6712
6713inline bool Type::isFunctionReferenceType() const {
6714 if (const auto *T = getAs<ReferenceType>())
6715 return T->getPointeeType()->isFunctionType();
6716 else
6717 return false;
6718}
6719
6720inline bool Type::isMemberPointerType() const {
6721 return isa<MemberPointerType>(CanonicalType);
6722}
6723
6724inline bool Type::isMemberFunctionPointerType() const {
6725 if (const auto *T = getAs<MemberPointerType>())
6726 return T->isMemberFunctionPointer();
6727 else
6728 return false;
6729}
6730
6731inline bool Type::isMemberDataPointerType() const {
6732 if (const auto *T = getAs<MemberPointerType>())
6733 return T->isMemberDataPointer();
6734 else
6735 return false;
6736}
6737
6738inline bool Type::isArrayType() const {
6739 return isa<ArrayType>(CanonicalType);
6740}
6741
6742inline bool Type::isConstantArrayType() const {
6743 return isa<ConstantArrayType>(CanonicalType);
6744}
6745
6746inline bool Type::isIncompleteArrayType() const {
6747 return isa<IncompleteArrayType>(CanonicalType);
6748}
6749
6750inline bool Type::isVariableArrayType() const {
6751 return isa<VariableArrayType>(CanonicalType);
6752}
6753
6754inline bool Type::isDependentSizedArrayType() const {
6755 return isa<DependentSizedArrayType>(CanonicalType);
6756}
6757
6758inline bool Type::isBuiltinType() const {
6759 return isa<BuiltinType>(CanonicalType);
6760}
6761
6762inline bool Type::isRecordType() const {
6763 return isa<RecordType>(CanonicalType);
6764}
6765
6766inline bool Type::isEnumeralType() const {
6767 return isa<EnumType>(CanonicalType);
53
Assuming field 'CanonicalType' is a 'EnumType'
54
Returning the value 1, which participates in a condition later
76
Assuming field 'CanonicalType' is a 'EnumType'
77
Returning the value 1, which participates in a condition later
6768}
6769
6770inline bool Type::isAnyComplexType() const {
6771 return isa<ComplexType>(CanonicalType);
6772}
6773
6774inline bool Type::isVectorType() const {
6775 return isa<VectorType>(CanonicalType);
122
Assuming field 'CanonicalType' is not a 'VectorType'
123
Returning zero, which participates in a condition later
6776}
6777
6778inline bool Type::isExtVectorType() const {
6779 return isa<ExtVectorType>(CanonicalType);
118
Assuming field 'CanonicalType' is not a 'ExtVectorType'
119
Returning zero, which participates in a condition later
6780}
6781
6782inline bool Type::isMatrixType() const {
6783 return isa<MatrixType>(CanonicalType);
6784}
6785
6786inline bool Type::isConstantMatrixType() const {
6787 return isa<ConstantMatrixType>(CanonicalType);
6788}
6789
6790inline bool Type::isDependentAddressSpaceType() const {
6791 return isa<DependentAddressSpaceType>(CanonicalType);
6792}
6793
6794inline bool Type::isObjCObjectPointerType() const {
6795 return isa<ObjCObjectPointerType>(CanonicalType);
6796}
6797
6798inline bool Type::isObjCObjectType() const {
6799 return isa<ObjCObjectType>(CanonicalType);
6800}
6801
6802inline bool Type::isObjCObjectOrInterfaceType() const {
6803 return isa<ObjCInterfaceType>(CanonicalType) ||
6804 isa<ObjCObjectType>(CanonicalType);
6805}
6806
6807inline bool Type::isAtomicType() const {
6808 return isa<AtomicType>(CanonicalType);
6809}
6810
6811inline bool Type::isUndeducedAutoType() const {
6812 return isa<AutoType>(CanonicalType);
6813}
6814
6815inline bool Type::isObjCQualifiedIdType() const {
6816 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6817 return OPT->isObjCQualifiedIdType();
6818 return false;
6819}
6820
6821inline bool Type::isObjCQualifiedClassType() const {
6822 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6823 return OPT->isObjCQualifiedClassType();
6824 return false;
6825}
6826
6827inline bool Type::isObjCIdType() const {
6828 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6829 return OPT->isObjCIdType();
6830 return false;
6831}
6832
6833inline bool Type::isObjCClassType() const {
6834 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6835 return OPT->isObjCClassType();
6836 return false;
6837}
6838
6839inline bool Type::isObjCSelType() const {
6840 if (const auto *OPT = getAs<PointerType>())
6841 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
6842 return false;
6843}
6844
6845inline bool Type::isObjCBuiltinType() const {
6846 return isObjCIdType() || isObjCClassType() || isObjCSelType();
6847}
6848
6849inline bool Type::isDecltypeType() const {
6850 return isa<DecltypeType>(this);
6851}
6852
6853#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6854 inline bool Type::is##Id##Type() const { \
6855 return isSpecificBuiltinType(BuiltinType::Id); \
6856 }
6857#include "clang/Basic/OpenCLImageTypes.def"
6858
6859inline bool Type::isSamplerT() const {
6860 return isSpecificBuiltinType(BuiltinType::OCLSampler);
6861}
6862
6863inline bool Type::isEventT() const {
6864 return isSpecificBuiltinType(BuiltinType::OCLEvent);
6865}
6866
6867inline bool Type::isClkEventT() const {
6868 return isSpecificBuiltinType(BuiltinType::OCLClkEvent);
6869}
6870
6871inline bool Type::isQueueT() const {
6872 return isSpecificBuiltinType(BuiltinType::OCLQueue);
6873}
6874
6875inline bool Type::isReserveIDT() const {
6876 return isSpecificBuiltinType(BuiltinType::OCLReserveID);
6877}
6878
6879inline bool Type::isImageType() const {
6880#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
6881 return
6882#include "clang/Basic/OpenCLImageTypes.def"
6883 false; // end boolean or operation
6884}
6885
6886inline bool Type::isPipeType() const {
6887 return isa<PipeType>(CanonicalType);
6888}
6889
6890inline bool Type::isExtIntType() const {
6891 return isa<ExtIntType>(CanonicalType);
6892}
6893
6894#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6895 inline bool Type::is##Id##Type() const { \
6896 return isSpecificBuiltinType(BuiltinType::Id); \
6897 }
6898#include "clang/Basic/OpenCLExtensionTypes.def"
6899
6900inline bool Type::isOCLIntelSubgroupAVCType() const {
6901#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
6902 isOCLIntelSubgroupAVC##Id##Type() ||
6903 return
6904#include "clang/Basic/OpenCLExtensionTypes.def"
6905 false; // end of boolean or operation
6906}
6907
6908inline bool Type::isOCLExtOpaqueType() const {
6909#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
6910 return
6911#include "clang/Basic/OpenCLExtensionTypes.def"
6912 false; // end of boolean or operation
6913}
6914
6915inline bool Type::isOpenCLSpecificType() const {
6916 return isSamplerT() || isEventT() || isImageType() || isClkEventT() ||
6917 isQueueT() || isReserveIDT() || isPipeType() || isOCLExtOpaqueType();
6918}
6919
6920inline bool Type::isTemplateTypeParmType() const {
6921 return isa<TemplateTypeParmType>(CanonicalType);
6922}
6923
6924inline bool Type::isSpecificBuiltinType(unsigned K) const {
6925 if (const BuiltinType *BT = getAs<BuiltinType>()) {
6926 return BT->getKind() == static_cast<BuiltinType::Kind>(K);
6927 }
6928 return false;
6929}
6930
6931inline bool Type::isPlaceholderType() const {
6932 if (const auto *BT = dyn_cast<BuiltinType>(this))
6933 return BT->isPlaceholderType();
6934 return false;
6935}
6936
6937inline const BuiltinType *Type::getAsPlaceholderType() const {
6938 if (const auto *BT = dyn_cast<BuiltinType>(this))
6939 if (BT->isPlaceholderType())
6940 return BT;
6941 return nullptr;
6942}
6943
6944inline bool Type::isSpecificPlaceholderType(unsigned K) const {
6945 assert(BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K))(static_cast<void> (0));
6946 return isSpecificBuiltinType(K);
6947}
6948
6949inline bool Type::isNonOverloadPlaceholderType() const {
6950 if (const auto *BT = dyn_cast<BuiltinType>(this))
6951 return BT->isNonOverloadPlaceholderType();
6952 return false;
6953}
6954
6955inline bool Type::isVoidType() const {
6956 return isSpecificBuiltinType(BuiltinType::Void);
6957}
6958
6959inline bool Type::isHalfType() const {
6960 // FIXME: Should we allow complex __fp16? Probably not.
6961 return isSpecificBuiltinType(BuiltinType::Half);
6962}
6963
6964inline bool Type::isFloat16Type() const {
6965 return isSpecificBuiltinType(BuiltinType::Float16);
6966}
6967
6968inline bool Type::isBFloat16Type() const {
6969 return isSpecificBuiltinType(BuiltinType::BFloat16);
6970}
6971
6972inline bool Type::isFloat128Type() const {
6973 return isSpecificBuiltinType(BuiltinType::Float128);
6974}
6975
6976inline bool Type::isNullPtrType() const {
6977 return isSpecificBuiltinType(BuiltinType::NullPtr);
6978}
6979
6980bool IsEnumDeclComplete(EnumDecl *);
6981bool IsEnumDeclScoped(EnumDecl *);
6982
6983inline bool Type::isIntegerType() const {
6984 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
6985 return BT->getKind() >= BuiltinType::Bool &&
6986 BT->getKind() <= BuiltinType::Int128;
6987 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
6988 // Incomplete enum types are not treated as integer types.
6989 // FIXME: In C++, enum types are never integer types.
6990 return IsEnumDeclComplete(ET->getDecl()) &&
6991 !IsEnumDeclScoped(ET->getDecl());
6992 }
6993 return isExtIntType();
6994}
6995
6996inline bool Type::isFixedPointType() const {
6997 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
6998 return BT->getKind() >= BuiltinType::ShortAccum &&
6999 BT->getKind() <= BuiltinType::SatULongFract;
7000 }
7001 return false;
7002}
7003
7004inline bool Type::isFixedPointOrIntegerType() const {
7005 return isFixedPointType() || isIntegerType();
7006}
7007
7008inline bool Type::isSaturatedFixedPointType() const {
7009 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
7010 return BT->getKind() >= BuiltinType::SatShortAccum &&
7011 BT->getKind() <= BuiltinType::SatULongFract;
7012 }
7013 return false;
7014}
7015
7016inline bool Type::isUnsaturatedFixedPointType() const {
7017 return isFixedPointType() && !isSaturatedFixedPointType();
7018}
7019
7020inline bool Type::isSignedFixedPointType() const {
7021 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
7022 return ((BT->getKind() >= BuiltinType::ShortAccum &&
7023 BT->getKind() <= BuiltinType::LongAccum) ||
7024 (BT->getKind() >= BuiltinType::ShortFract &&
7025 BT->getKind() <= BuiltinType::LongFract) ||
7026 (BT->getKind() >= BuiltinType::SatShortAccum &&
7027 BT->getKind() <= BuiltinType::SatLongAccum) ||
7028 (BT->getKind() >= BuiltinType::SatShortFract &&
7029 BT->getKind() <= BuiltinType::SatLongFract));
7030 }
7031 return false;
7032}
7033
7034inline bool Type::isUnsignedFixedPointType() const {
7035 return isFixedPointType() && !isSignedFixedPointType();
7036}
7037
7038inline bool Type::isScalarType() const {
7039 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7040 return BT->getKind() > BuiltinType::Void &&
7041 BT->getKind() <= BuiltinType::NullPtr;
7042 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
7043 // Enums are scalar types, but only if they are defined. Incomplete enums
7044 // are not treated as scalar types.
7045 return IsEnumDeclComplete(ET->getDecl());
7046 return isa<PointerType>(CanonicalType) ||
7047 isa<BlockPointerType>(CanonicalType) ||
7048 isa<MemberPointerType>(CanonicalType) ||
7049 isa<ComplexType>(CanonicalType) ||
7050 isa<ObjCObjectPointerType>(CanonicalType) ||
7051 isExtIntType();
7052}
7053
7054inline bool Type::isIntegralOrEnumerationType() const {
7055 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7056 return BT->getKind() >= BuiltinType::Bool &&
7057 BT->getKind() <= BuiltinType::Int128;
7058
7059 // Check for a complete enum type; incomplete enum types are not properly an
7060 // enumeration type in the sense required here.
7061 if (const auto *ET = dyn_cast<EnumType>(CanonicalType))
7062 return IsEnumDeclComplete(ET->getDecl());
7063
7064 return isExtIntType();
7065}
7066
7067inline bool Type::isBooleanType() const {
7068 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7069 return BT->getKind() == BuiltinType::Bool;
7070 return false;
7071}
7072
7073inline bool Type::isUndeducedType() const {
7074 auto *DT = getContainedDeducedType();
7075 return DT && !DT->isDeduced();
7076}
7077
7078/// Determines whether this is a type for which one can define
7079/// an overloaded operator.
7080inline bool Type::isOverloadableType() const {
7081 return isDependentType() || isRecordType() || isEnumeralType();
7082}
7083
7084/// Determines whether this type is written as a typedef-name.
7085inline bool Type::isTypedefNameType() const {
7086 if (getAs<TypedefType>())
7087 return true;
7088 if (auto *TST = getAs<TemplateSpecializationType>())
7089 return TST->isTypeAlias();
7090 return false;
7091}
7092
7093/// Determines whether this type can decay to a pointer type.
7094inline bool Type::canDecayToPointerType() const {
7095 return isFunctionType() || isArrayType();
7096}
7097
7098inline bool Type::hasPointerRepresentation() const {
7099 return (isPointerType() || isReferenceType() || isBlockPointerType() ||
7100 isObjCObjectPointerType() || isNullPtrType());
7101}
7102
7103inline bool Type::hasObjCPointerRepresentation() const {
7104 return isObjCObjectPointerType();
7105}
7106
7107inline const Type *Type::getBaseElementTypeUnsafe() const {
7108 const Type *type = this;
7109 while (const ArrayType *arrayType = type->getAsArrayTypeUnsafe())
7110 type = arrayType->getElementType().getTypePtr();
7111 return type;
7112}
7113
7114inline const Type *Type::getPointeeOrArrayElementType() const {
7115 const Type *type = this;
7116 if (type->isAnyPointerType())
7117 return type->getPointeeType().getTypePtr();
7118 else if (type->isArrayType())
7119 return type->getBaseElementTypeUnsafe();
7120 return type;
7121}
7122/// Insertion operator for partial diagnostics. This allows sending adress
7123/// spaces into a diagnostic with <<.
7124inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7125 LangAS AS) {
7126 PD.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS),
7127 DiagnosticsEngine::ArgumentKind::ak_addrspace);
7128 return PD;
7129}
7130
7131/// Insertion operator for partial diagnostics. This allows sending Qualifiers
7132/// into a diagnostic with <<.
7133inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7134 Qualifiers Q) {
7135 PD.AddTaggedVal(Q.getAsOpaqueValue(),
7136 DiagnosticsEngine::ArgumentKind::ak_qual);
7137 return PD;
7138}
7139
7140/// Insertion operator for partial diagnostics. This allows sending QualType's
7141/// into a diagnostic with <<.
7142inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7143 QualType T) {
7144 PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()),
7145 DiagnosticsEngine::ak_qualtype);
7146 return PD;
7147}
7148
7149// Helper class template that is used by Type::getAs to ensure that one does
7150// not try to look through a qualified type to get to an array type.
7151template <typename T>
7152using TypeIsArrayType =
7153 std::integral_constant<bool, std::is_same<T, ArrayType>::value ||
7154 std::is_base_of<ArrayType, T>::value>;
7155
7156// Member-template getAs<specific type>'.
7157template <typename T> const T *Type::getAs() const {
7158 static_assert(!TypeIsArrayType<T>::value,
7159 "ArrayType cannot be used with getAs!");
7160
7161 // If this is directly a T type, return it.
7162 if (const auto *Ty = dyn_cast<T>(this))
7163 return Ty;
7164
7165 // If the canonical form of this type isn't the right kind, reject it.
7166 if (!isa<T>(CanonicalType))
7167 return nullptr;
7168
7169 // If this is a typedef for the type, strip the typedef off without
7170 // losing all typedef information.
7171 return cast<T>(getUnqualifiedDesugaredType());
7172}
7173
7174template <typename T> const T *Type::getAsAdjusted() const {
7175 static_assert(!TypeIsArrayType<T>::value, "ArrayType cannot be used with getAsAdjusted!");
7176
7177 // If this is directly a T type, return it.
7178 if (const auto *Ty = dyn_cast<T>(this))
7179 return Ty;
7180
7181 // If the canonical form of this type isn't the right kind, reject it.
7182 if (!isa<T>(CanonicalType))
7183 return nullptr;
7184
7185 // Strip off type adjustments that do not modify the underlying nature of the
7186 // type.
7187 const Type *Ty = this;
7188 while (Ty) {
7189 if (const auto *A = dyn_cast<AttributedType>(Ty))
7190 Ty = A->getModifiedType().getTypePtr();
7191 else if (const auto *E = dyn_cast<ElaboratedType>(Ty))
7192 Ty = E->desugar().getTypePtr();
7193 else if (const auto *P = dyn_cast<ParenType>(Ty))
7194 Ty = P->desugar().getTypePtr();
7195 else if (const auto *A = dyn_cast<AdjustedType>(Ty))
7196 Ty = A->desugar().getTypePtr();
7197 else if (const auto *M = dyn_cast<MacroQualifiedType>(Ty))
7198 Ty = M->desugar().getTypePtr();
7199 else
7200 break;
7201 }
7202
7203 // Just because the canonical type is correct does not mean we can use cast<>,
7204 // since we may not have stripped off all the sugar down to the base type.
7205 return dyn_cast<T>(Ty);
7206}
7207
7208inline const ArrayType *Type::getAsArrayTypeUnsafe() const {
7209 // If this is directly an array type, return it.
7210 if (const auto *arr = dyn_cast<ArrayType>(this))
7211 return arr;
7212
7213 // If the canonical form of this type isn't the right kind, reject it.
7214 if (!isa<ArrayType>(CanonicalType))
7215 return nullptr;
7216
7217 // If this is a typedef for the type, strip the typedef off without
7218 // losing all typedef information.
7219 return cast<ArrayType>(getUnqualifiedDesugaredType());
7220}
7221
7222template <typename T> const T *Type::castAs() const {
7223 static_assert(!TypeIsArrayType<T>::value,
7224 "ArrayType cannot be used with castAs!");
7225
7226 if (const auto *ty = dyn_cast<T>(this)) return ty;
7227 assert(isa<T>(CanonicalType))(static_cast<void> (0));
7228 return cast<T>(getUnqualifiedDesugaredType());
7229}
7230
7231inline const ArrayType *Type::castAsArrayTypeUnsafe() const {
7232 assert(isa<ArrayType>(CanonicalType))(static_cast<void> (0));
7233 if (const auto *arr = dyn_cast<ArrayType>(this)) return arr;
7234 return cast<ArrayType>(getUnqualifiedDesugaredType());
7235}
7236
7237DecayedType::DecayedType(QualType OriginalType, QualType DecayedPtr,
7238 QualType CanonicalPtr)
7239 : AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
7240#ifndef NDEBUG1
7241 QualType Adjusted = getAdjustedType();
7242 (void)AttributedType::stripOuterNullability(Adjusted);
7243 assert(isa<PointerType>(Adjusted))(static_cast<void> (0));
7244#endif
7245}
7246
7247QualType DecayedType::getPointeeType() const {
7248 QualType Decayed = getDecayedType();
7249 (void)AttributedType::stripOuterNullability(Decayed);
7250 return cast<PointerType>(Decayed)->getPointeeType();
7251}
7252
7253// Get the decimal string representation of a fixed point type, represented
7254// as a scaled integer.
7255// TODO: At some point, we should change the arguments to instead just accept an
7256// APFixedPoint instead of APSInt and scale.
7257void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val,
7258 unsigned Scale);
7259
7260} // namespace clang
7261
7262#endif // LLVM_CLANG_AST_TYPE_H

/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/clang/include/clang/AST/Expr.h

1//===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Expr interface and subclasses.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_EXPR_H
14#define LLVM_CLANG_AST_EXPR_H
15
16#include "clang/AST/APValue.h"
17#include "clang/AST/ASTVector.h"
18#include "clang/AST/ComputeDependence.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/DeclAccessPair.h"
21#include "clang/AST/DependenceFlags.h"
22#include "clang/AST/OperationKinds.h"
23#include "clang/AST/Stmt.h"
24#include "clang/AST/TemplateBase.h"
25#include "clang/AST/Type.h"
26#include "clang/Basic/CharInfo.h"
27#include "clang/Basic/LangOptions.h"
28#include "clang/Basic/SyncScope.h"
29#include "clang/Basic/TypeTraits.h"
30#include "llvm/ADT/APFloat.h"
31#include "llvm/ADT/APSInt.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/StringRef.h"
34#include "llvm/ADT/iterator.h"
35#include "llvm/ADT/iterator_range.h"
36#include "llvm/Support/AtomicOrdering.h"
37#include "llvm/Support/Compiler.h"
38#include "llvm/Support/TrailingObjects.h"
39
40namespace clang {
41 class APValue;
42 class ASTContext;
43 class BlockDecl;
44 class CXXBaseSpecifier;
45 class CXXMemberCallExpr;
46 class CXXOperatorCallExpr;
47 class CastExpr;
48 class Decl;
49 class IdentifierInfo;
50 class MaterializeTemporaryExpr;
51 class NamedDecl;
52 class ObjCPropertyRefExpr;
53 class OpaqueValueExpr;
54 class ParmVarDecl;
55 class StringLiteral;
56 class TargetInfo;
57 class ValueDecl;
58
59/// A simple array of base specifiers.
60typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath;
61
62/// An adjustment to be made to the temporary created when emitting a
63/// reference binding, which accesses a particular subobject of that temporary.
64struct SubobjectAdjustment {
65 enum {
66 DerivedToBaseAdjustment,
67 FieldAdjustment,
68 MemberPointerAdjustment
69 } Kind;
70
71 struct DTB {
72 const CastExpr *BasePath;
73 const CXXRecordDecl *DerivedClass;
74 };
75
76 struct P {
77 const MemberPointerType *MPT;
78 Expr *RHS;
79 };
80
81 union {
82 struct DTB DerivedToBase;
83 FieldDecl *Field;
84 struct P Ptr;
85 };
86
87 SubobjectAdjustment(const CastExpr *BasePath,
88 const CXXRecordDecl *DerivedClass)
89 : Kind(DerivedToBaseAdjustment) {
90 DerivedToBase.BasePath = BasePath;
91 DerivedToBase.DerivedClass = DerivedClass;
92 }
93
94 SubobjectAdjustment(FieldDecl *Field)
95 : Kind(FieldAdjustment) {
96 this->Field = Field;
97 }
98
99 SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS)
100 : Kind(MemberPointerAdjustment) {
101 this->Ptr.MPT = MPT;
102 this->Ptr.RHS = RHS;
103 }
104};
105
106/// This represents one expression. Note that Expr's are subclasses of Stmt.
107/// This allows an expression to be transparently used any place a Stmt is
108/// required.
109class Expr : public ValueStmt {
110 QualType TR;
111
112public:
113 Expr() = delete;
114 Expr(const Expr&) = delete;
115 Expr(Expr &&) = delete;
116 Expr &operator=(const Expr&) = delete;
117 Expr &operator=(Expr&&) = delete;
118
119protected:
120 Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK)
121 : ValueStmt(SC) {
122 ExprBits.Dependent = 0;
123 ExprBits.ValueKind = VK;
124 ExprBits.ObjectKind = OK;
125 assert(ExprBits.ObjectKind == OK && "truncated kind")(static_cast<void> (0));
126 setType(T);
127 }
128
129 /// Construct an empty expression.
130 explicit Expr(StmtClass SC, EmptyShell) : ValueStmt(SC) { }
131
132 /// Each concrete expr subclass is expected to compute its dependence and call
133 /// this in the constructor.
134 void setDependence(ExprDependence Deps) {
135 ExprBits.Dependent = static_cast<unsigned>(Deps);
136 }
137 friend class ASTImporter; // Sets dependence dircetly.
138 friend class ASTStmtReader; // Sets dependence dircetly.
139
140public:
141 QualType getType() const { return TR; }
142 void setType(QualType t) {
143 // In C++, the type of an expression is always adjusted so that it
144 // will not have reference type (C++ [expr]p6). Use
145 // QualType::getNonReferenceType() to retrieve the non-reference
146 // type. Additionally, inspect Expr::isLvalue to determine whether
147 // an expression that is adjusted in this manner should be
148 // considered an lvalue.
149 assert((t.isNull() || !t->isReferenceType()) &&(static_cast<void> (0))
150 "Expressions can't have reference type")(static_cast<void> (0));
151
152 TR = t;
153 }
154
155 ExprDependence getDependence() const {
156 return static_cast<ExprDependence>(ExprBits.Dependent);
157 }
158
159 /// Determines whether the value of this expression depends on
160 /// - a template parameter (C++ [temp.dep.constexpr])
161 /// - or an error, whose resolution is unknown
162 ///
163 /// For example, the array bound of "Chars" in the following example is
164 /// value-dependent.
165 /// @code
166 /// template<int Size, char (&Chars)[Size]> struct meta_string;
167 /// @endcode
168 bool isValueDependent() const {
169 return static_cast<bool>(getDependence() & ExprDependence::Value);
170 }
171
172 /// Determines whether the type of this expression depends on
173 /// - a template paramter (C++ [temp.dep.expr], which means that its type
174 /// could change from one template instantiation to the next)
175 /// - or an error
176 ///
177 /// For example, the expressions "x" and "x + y" are type-dependent in
178 /// the following code, but "y" is not type-dependent:
179 /// @code
180 /// template<typename T>
181 /// void add(T x, int y) {
182 /// x + y;
183 /// }
184 /// @endcode
185 bool isTypeDependent() const {
186 return static_cast<bool>(getDependence() & ExprDependence::Type);
187 }
188
189 /// Whether this expression is instantiation-dependent, meaning that
190 /// it depends in some way on
191 /// - a template parameter (even if neither its type nor (constant) value
192 /// can change due to the template instantiation)
193 /// - or an error
194 ///
195 /// In the following example, the expression \c sizeof(sizeof(T() + T())) is
196 /// instantiation-dependent (since it involves a template parameter \c T), but
197 /// is neither type- nor value-dependent, since the type of the inner
198 /// \c sizeof is known (\c std::size_t) and therefore the size of the outer
199 /// \c sizeof is known.
200 ///
201 /// \code
202 /// template<typename T>
203 /// void f(T x, T y) {
204 /// sizeof(sizeof(T() + T());
205 /// }
206 /// \endcode
207 ///
208 /// \code
209 /// void func(int) {
210 /// func(); // the expression is instantiation-dependent, because it depends
211 /// // on an error.
212 /// }
213 /// \endcode
214 bool isInstantiationDependent() const {
215 return static_cast<bool>(getDependence() & ExprDependence::Instantiation);
216 }
217
218 /// Whether this expression contains an unexpanded parameter
219 /// pack (for C++11 variadic templates).
220 ///
221 /// Given the following function template:
222 ///
223 /// \code
224 /// template<typename F, typename ...Types>
225 /// void forward(const F &f, Types &&...args) {
226 /// f(static_cast<Types&&>(args)...);
227 /// }
228 /// \endcode
229 ///
230 /// The expressions \c args and \c static_cast<Types&&>(args) both
231 /// contain parameter packs.
232 bool containsUnexpandedParameterPack() const {
233 return static_cast<bool>(getDependence() & ExprDependence::UnexpandedPack);
234 }
235
236 /// Whether this expression contains subexpressions which had errors, e.g. a
237 /// TypoExpr.
238 bool containsErrors() const {
239 return static_cast<bool>(getDependence() & ExprDependence::Error);
240 }
241
242 /// getExprLoc - Return the preferred location for the arrow when diagnosing
243 /// a problem with a generic expression.
244 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__));
245
246 /// Determine whether an lvalue-to-rvalue conversion should implicitly be
247 /// applied to this expression if it appears as a discarded-value expression
248 /// in C++11 onwards. This applies to certain forms of volatile glvalues.
249 bool isReadIfDiscardedInCPlusPlus11() const;
250
251 /// isUnusedResultAWarning - Return true if this immediate expression should
252 /// be warned about if the result is unused. If so, fill in expr, location,
253 /// and ranges with expr to warn on and source locations/ranges appropriate
254 /// for a warning.
255 bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc,
256 SourceRange &R1, SourceRange &R2,
257 ASTContext &Ctx) const;
258
259 /// isLValue - True if this expression is an "l-value" according to
260 /// the rules of the current language. C and C++ give somewhat
261 /// different rules for this concept, but in general, the result of
262 /// an l-value expression identifies a specific object whereas the
263 /// result of an r-value expression is a value detached from any
264 /// specific storage.
265 ///
266 /// C++11 divides the concept of "r-value" into pure r-values
267 /// ("pr-values") and so-called expiring values ("x-values"), which
268 /// identify specific objects that can be safely cannibalized for
269 /// their resources.
270 bool isLValue() const { return getValueKind() == VK_LValue; }
63
Assuming the condition is false
64
Returning zero, which participates in a condition later
271 bool isPRValue() const { return getValueKind() == VK_PRValue; }
272 bool isXValue() const { return getValueKind() == VK_XValue; }
273 bool isGLValue() const { return getValueKind() != VK_PRValue; }
274
275 enum LValueClassification {
276 LV_Valid,
277 LV_NotObjectType,
278 LV_IncompleteVoidType,
279 LV_DuplicateVectorComponents,
280 LV_InvalidExpression,
281 LV_InvalidMessageExpression,
282 LV_MemberFunction,
283 LV_SubObjCPropertySetting,
284 LV_ClassTemporary,
285 LV_ArrayTemporary
286 };
287 /// Reasons why an expression might not be an l-value.
288 LValueClassification ClassifyLValue(ASTContext &Ctx) const;
289
290 enum isModifiableLvalueResult {
291 MLV_Valid,
292 MLV_NotObjectType,
293 MLV_IncompleteVoidType,
294 MLV_DuplicateVectorComponents,
295 MLV_InvalidExpression,
296 MLV_LValueCast, // Specialized form of MLV_InvalidExpression.
297 MLV_IncompleteType,
298 MLV_ConstQualified,
299 MLV_ConstQualifiedField,
300 MLV_ConstAddrSpace,
301 MLV_ArrayType,
302 MLV_NoSetterProperty,
303 MLV_MemberFunction,
304 MLV_SubObjCPropertySetting,
305 MLV_InvalidMessageExpression,
306 MLV_ClassTemporary,
307 MLV_ArrayTemporary
308 };
309 /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
310 /// does not have an incomplete type, does not have a const-qualified type,
311 /// and if it is a structure or union, does not have any member (including,
312 /// recursively, any member or element of all contained aggregates or unions)
313 /// with a const-qualified type.
314 ///
315 /// \param Loc [in,out] - A source location which *may* be filled
316 /// in with the location of the expression making this a
317 /// non-modifiable lvalue, if specified.
318 isModifiableLvalueResult
319 isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const;
320
321 /// The return type of classify(). Represents the C++11 expression
322 /// taxonomy.
323 class Classification {
324 public:
325 /// The various classification results. Most of these mean prvalue.
326 enum Kinds {
327 CL_LValue,
328 CL_XValue,
329 CL_Function, // Functions cannot be lvalues in C.
330 CL_Void, // Void cannot be an lvalue in C.
331 CL_AddressableVoid, // Void expression whose address can be taken in C.
332 CL_DuplicateVectorComponents, // A vector shuffle with dupes.
333 CL_MemberFunction, // An expression referring to a member function
334 CL_SubObjCPropertySetting,
335 CL_ClassTemporary, // A temporary of class type, or subobject thereof.
336 CL_ArrayTemporary, // A temporary of array type.
337 CL_ObjCMessageRValue, // ObjC message is an rvalue
338 CL_PRValue // A prvalue for any other reason, of any other type
339 };
340 /// The results of modification testing.
341 enum ModifiableType {
342 CM_Untested, // testModifiable was false.
343 CM_Modifiable,
344 CM_RValue, // Not modifiable because it's an rvalue
345 CM_Function, // Not modifiable because it's a function; C++ only
346 CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext
347 CM_NoSetterProperty,// Implicit assignment to ObjC property without setter
348 CM_ConstQualified,
349 CM_ConstQualifiedField,
350 CM_ConstAddrSpace,
351 CM_ArrayType,
352 CM_IncompleteType
353 };
354
355 private:
356 friend class Expr;
357
358 unsigned short Kind;
359 unsigned short Modifiable;
360
361 explicit Classification(Kinds k, ModifiableType m)
362 : Kind(k), Modifiable(m)
363 {}
364
365 public:
366 Classification() {}
367
368 Kinds getKind() const { return static_cast<Kinds>(Kind); }
369 ModifiableType getModifiable() const {
370 assert(Modifiable != CM_Untested && "Did not test for modifiability.")(static_cast<void> (0));
371 return static_cast<ModifiableType>(Modifiable);
372 }
373 bool isLValue() const { return Kind == CL_LValue; }
374 bool isXValue() const { return Kind == CL_XValue; }
375 bool isGLValue() const { return Kind <= CL_XValue; }
376 bool isPRValue() const { return Kind >= CL_Function; }
377 bool isRValue() const { return Kind >= CL_XValue; }
378 bool isModifiable() const { return getModifiable() == CM_Modifiable; }
379
380 /// Create a simple, modifiably lvalue
381 static Classification makeSimpleLValue() {
382 return Classification(CL_LValue, CM_Modifiable);
383 }
384
385 };
386 /// Classify - Classify this expression according to the C++11
387 /// expression taxonomy.
388 ///
389 /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the
390 /// old lvalue vs rvalue. This function determines the type of expression this
391 /// is. There are three expression types:
392 /// - lvalues are classical lvalues as in C++03.
393 /// - prvalues are equivalent to rvalues in C++03.
394 /// - xvalues are expressions yielding unnamed rvalue references, e.g. a
395 /// function returning an rvalue reference.
396 /// lvalues and xvalues are collectively referred to as glvalues, while
397 /// prvalues and xvalues together form rvalues.
398 Classification Classify(ASTContext &Ctx) const {
399 return ClassifyImpl(Ctx, nullptr);
400 }
401
402 /// ClassifyModifiable - Classify this expression according to the
403 /// C++11 expression taxonomy, and see if it is valid on the left side
404 /// of an assignment.
405 ///
406 /// This function extends classify in that it also tests whether the
407 /// expression is modifiable (C99 6.3.2.1p1).
408 /// \param Loc A source location that might be filled with a relevant location
409 /// if the expression is not modifiable.
410 Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{
411 return ClassifyImpl(Ctx, &Loc);
412 }
413
414 /// Returns the set of floating point options that apply to this expression.
415 /// Only meaningful for operations on floating point values.
416 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const;
417
418 /// getValueKindForType - Given a formal return or parameter type,
419 /// give its value kind.
420 static ExprValueKind getValueKindForType(QualType T) {
421 if (const ReferenceType *RT = T->getAs<ReferenceType>())
422 return (isa<LValueReferenceType>(RT)
423 ? VK_LValue
424 : (RT->getPointeeType()->isFunctionType()
425 ? VK_LValue : VK_XValue));
426 return VK_PRValue;
427 }
428
429 /// getValueKind - The value kind that this expression produces.
430 ExprValueKind getValueKind() const {
431 return static_cast<ExprValueKind>(ExprBits.ValueKind);
432 }
433
434 /// getObjectKind - The object kind that this expression produces.
435 /// Object kinds are meaningful only for expressions that yield an
436 /// l-value or x-value.
437 ExprObjectKind getObjectKind() const {
438 return static_cast<ExprObjectKind>(ExprBits.ObjectKind);
439 }
440
441 bool isOrdinaryOrBitFieldObject() const {
442 ExprObjectKind OK = getObjectKind();
443 return (OK == OK_Ordinary || OK == OK_BitField);
444 }
445
446 /// setValueKind - Set the value kind produced by this expression.
447 void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; }
448
449 /// setObjectKind - Set the object kind produced by this expression.
450 void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; }
451
452private:
453 Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const;
454
455public:
456
457 /// Returns true if this expression is a gl-value that
458 /// potentially refers to a bit-field.
459 ///
460 /// In C++, whether a gl-value refers to a bitfield is essentially
461 /// an aspect of the value-kind type system.
462 bool refersToBitField() const { return getObjectKind() == OK_BitField; }
463
464 /// If this expression refers to a bit-field, retrieve the
465 /// declaration of that bit-field.
466 ///
467 /// Note that this returns a non-null pointer in subtly different
468 /// places than refersToBitField returns true. In particular, this can
469 /// return a non-null pointer even for r-values loaded from
470 /// bit-fields, but it will return null for a conditional bit-field.
471 FieldDecl *getSourceBitField();
472
473 const FieldDecl *getSourceBitField() const {
474 return const_cast<Expr*>(this)->getSourceBitField();
475 }
476
477 Decl *getReferencedDeclOfCallee();
478 const Decl *getReferencedDeclOfCallee() const {
479 return const_cast<Expr*>(this)->getReferencedDeclOfCallee();
480 }
481
482 /// If this expression is an l-value for an Objective C
483 /// property, find the underlying property reference expression.
484 const ObjCPropertyRefExpr *getObjCProperty() const;
485
486 /// Check if this expression is the ObjC 'self' implicit parameter.
487 bool isObjCSelfExpr() const;
488
489 /// Returns whether this expression refers to a vector element.
490 bool refersToVectorElement() const;
491
492 /// Returns whether this expression refers to a matrix element.
493 bool refersToMatrixElement() const {
494 return getObjectKind() == OK_MatrixComponent;
495 }
496
497 /// Returns whether this expression refers to a global register
498 /// variable.
499 bool refersToGlobalRegisterVar() const;
500
501 /// Returns whether this expression has a placeholder type.
502 bool hasPlaceholderType() const {
503 return getType()->isPlaceholderType();
504 }
505
506 /// Returns whether this expression has a specific placeholder type.
507 bool hasPlaceholderType(BuiltinType::Kind K) const {
508 assert(BuiltinType::isPlaceholderTypeKind(K))(static_cast<void> (0));
509 if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType()))
510 return BT->getKind() == K;
511 return false;
512 }
513
514 /// isKnownToHaveBooleanValue - Return true if this is an integer expression
515 /// that is known to return 0 or 1. This happens for _Bool/bool expressions
516 /// but also int expressions which are produced by things like comparisons in
517 /// C.
518 ///
519 /// \param Semantic If true, only return true for expressions that are known
520 /// to be semantically boolean, which might not be true even for expressions
521 /// that are known to evaluate to 0/1. For instance, reading an unsigned
522 /// bit-field with width '1' will evaluate to 0/1, but doesn't necessarily
523 /// semantically correspond to a bool.
524 bool isKnownToHaveBooleanValue(bool Semantic = true) const;
525
526 /// isIntegerConstantExpr - Return the value if this expression is a valid
527 /// integer constant expression. If not a valid i-c-e, return None and fill
528 /// in Loc (if specified) with the location of the invalid expression.
529 ///
530 /// Note: This does not perform the implicit conversions required by C++11
531 /// [expr.const]p5.
532 Optional<llvm::APSInt> getIntegerConstantExpr(const ASTContext &Ctx,
533 SourceLocation *Loc = nullptr,
534 bool isEvaluated = true) const;
535 bool isIntegerConstantExpr(const ASTContext &Ctx,
536 SourceLocation *Loc = nullptr) const;
537
538 /// isCXX98IntegralConstantExpr - Return true if this expression is an
539 /// integral constant expression in C++98. Can only be used in C++.
540 bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const;
541
542 /// isCXX11ConstantExpr - Return true if this expression is a constant
543 /// expression in C++11. Can only be used in C++.
544 ///
545 /// Note: This does not perform the implicit conversions required by C++11
546 /// [expr.const]p5.
547 bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr,
548 SourceLocation *Loc = nullptr) const;
549
550 /// isPotentialConstantExpr - Return true if this function's definition
551 /// might be usable in a constant expression in C++11, if it were marked
552 /// constexpr. Return false if the function can never produce a constant
553 /// expression, along with diagnostics describing why not.
554 static bool isPotentialConstantExpr(const FunctionDecl *FD,
555 SmallVectorImpl<
556 PartialDiagnosticAt> &Diags);
557
558 /// isPotentialConstantExprUnevaluted - Return true if this expression might
559 /// be usable in a constant expression in C++11 in an unevaluated context, if
560 /// it were in function FD marked constexpr. Return false if the function can
561 /// never produce a constant expression, along with diagnostics describing
562 /// why not.
563 static bool isPotentialConstantExprUnevaluated(Expr *E,
564 const FunctionDecl *FD,
565 SmallVectorImpl<
566 PartialDiagnosticAt> &Diags);
567
568 /// isConstantInitializer - Returns true if this expression can be emitted to
569 /// IR as a constant, and thus can be used as a constant initializer in C.
570 /// If this expression is not constant and Culprit is non-null,
571 /// it is used to store the address of first non constant expr.
572 bool isConstantInitializer(ASTContext &Ctx, bool ForRef,
573 const Expr **Culprit = nullptr) const;
574
575 /// EvalStatus is a struct with detailed info about an evaluation in progress.
576 struct EvalStatus {
577 /// Whether the evaluated expression has side effects.
578 /// For example, (f() && 0) can be folded, but it still has side effects.
579 bool HasSideEffects;
580
581 /// Whether the evaluation hit undefined behavior.
582 /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior.
583 /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB.
584 bool HasUndefinedBehavior;
585
586 /// Diag - If this is non-null, it will be filled in with a stack of notes
587 /// indicating why evaluation failed (or why it failed to produce a constant
588 /// expression).
589 /// If the expression is unfoldable, the notes will indicate why it's not
590 /// foldable. If the expression is foldable, but not a constant expression,
591 /// the notes will describes why it isn't a constant expression. If the
592 /// expression *is* a constant expression, no notes will be produced.
593 SmallVectorImpl<PartialDiagnosticAt> *Diag;
594
595 EvalStatus()
596 : HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {}
597
598 // hasSideEffects - Return true if the evaluated expression has
599 // side effects.
600 bool hasSideEffects() const {
601 return HasSideEffects;
602 }
603 };
604
605 /// EvalResult is a struct with detailed info about an evaluated expression.
606 struct EvalResult : EvalStatus {
607 /// Val - This is the value the expression can be folded to.
608 APValue Val;
609
610 // isGlobalLValue - Return true if the evaluated lvalue expression
611 // is global.
612 bool isGlobalLValue() const;
613 };
614
615 /// EvaluateAsRValue - Return true if this is a constant which we can fold to
616 /// an rvalue using any crazy technique (that has nothing to do with language
617 /// standards) that we want to, even if the expression has side-effects. If
618 /// this function returns true, it returns the folded constant in Result. If
619 /// the expression is a glvalue, an lvalue-to-rvalue conversion will be
620 /// applied.
621 bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx,
622 bool InConstantContext = false) const;
623
624 /// EvaluateAsBooleanCondition - Return true if this is a constant
625 /// which we can fold and convert to a boolean condition using
626 /// any crazy technique that we want to, even if the expression has
627 /// side-effects.
628 bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx,
629 bool InConstantContext = false) const;
630
631 enum SideEffectsKind {
632 SE_NoSideEffects, ///< Strictly evaluate the expression.
633 SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not
634 ///< arbitrary unmodeled side effects.
635 SE_AllowSideEffects ///< Allow any unmodeled side effect.
636 };
637
638 /// EvaluateAsInt - Return true if this is a constant which we can fold and
639 /// convert to an integer, using any crazy technique that we want to.
640 bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx,
641 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
642 bool InConstantContext = false) const;
643
644 /// EvaluateAsFloat - Return true if this is a constant which we can fold and
645 /// convert to a floating point value, using any crazy technique that we
646 /// want to.
647 bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx,
648 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
649 bool InConstantContext = false) const;
650
651 /// EvaluateAsFloat - Return true if this is a constant which we can fold and
652 /// convert to a fixed point value.
653 bool EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx,
654 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
655 bool InConstantContext = false) const;
656
657 /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
658 /// constant folded without side-effects, but discard the result.
659 bool isEvaluatable(const ASTContext &Ctx,
660 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
661
662 /// HasSideEffects - This routine returns true for all those expressions
663 /// which have any effect other than producing a value. Example is a function
664 /// call, volatile variable read, or throwing an exception. If
665 /// IncludePossibleEffects is false, this call treats certain expressions with
666 /// potential side effects (such as function call-like expressions,
667 /// instantiation-dependent expressions, or invocations from a macro) as not
668 /// having side effects.
669 bool HasSideEffects(const ASTContext &Ctx,
670 bool IncludePossibleEffects = true) const;
671
672 /// Determine whether this expression involves a call to any function
673 /// that is not trivial.
674 bool hasNonTrivialCall(const ASTContext &Ctx) const;
675
676 /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded
677 /// integer. This must be called on an expression that constant folds to an
678 /// integer.
679 llvm::APSInt EvaluateKnownConstInt(
680 const ASTContext &Ctx,
681 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
682
683 llvm::APSInt EvaluateKnownConstIntCheckOverflow(
684 const ASTContext &Ctx,
685 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
686
687 void EvaluateForOverflow(const ASTContext &Ctx) const;
688
689 /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an
690 /// lvalue with link time known address, with no side-effects.
691 bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
692 bool InConstantContext = false) const;
693
694 /// EvaluateAsInitializer - Evaluate an expression as if it were the
695 /// initializer of the given declaration. Returns true if the initializer
696 /// can be folded to a constant, and produces any relevant notes. In C++11,
697 /// notes will be produced if the expression is not a constant expression.
698 bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx,
699 const VarDecl *VD,
700 SmallVectorImpl<PartialDiagnosticAt> &Notes,
701 bool IsConstantInitializer) const;
702
703 /// EvaluateWithSubstitution - Evaluate an expression as if from the context
704 /// of a call to the given function with the given arguments, inside an
705 /// unevaluated context. Returns true if the expression could be folded to a
706 /// constant.
707 bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx,
708 const FunctionDecl *Callee,
709 ArrayRef<const Expr*> Args,
710 const Expr *This = nullptr) const;
711
712 enum class ConstantExprKind {
713 /// An integer constant expression (an array bound, enumerator, case value,
714 /// bit-field width, or similar) or similar.
715 Normal,
716 /// A non-class template argument. Such a value is only used for mangling,
717 /// not for code generation, so can refer to dllimported functions.
718 NonClassTemplateArgument,
719 /// A class template argument. Such a value is used for code generation.
720 ClassTemplateArgument,
721 /// An immediate invocation. The destruction of the end result of this
722 /// evaluation is not part of the evaluation, but all other temporaries
723 /// are destroyed.
724 ImmediateInvocation,
725 };
726
727 /// Evaluate an expression that is required to be a constant expression. Does
728 /// not check the syntactic constraints for C and C++98 constant expressions.
729 bool EvaluateAsConstantExpr(
730 EvalResult &Result, const ASTContext &Ctx,
731 ConstantExprKind Kind = ConstantExprKind::Normal) const;
732
733 /// If the current Expr is a pointer, this will try to statically
734 /// determine the number of bytes available where the pointer is pointing.
735 /// Returns true if all of the above holds and we were able to figure out the
736 /// size, false otherwise.
737 ///
738 /// \param Type - How to evaluate the size of the Expr, as defined by the
739 /// "type" parameter of __builtin_object_size
740 bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx,
741 unsigned Type) const;
742
743 /// If the current Expr is a pointer, this will try to statically
744 /// determine the strlen of the string pointed to.
745 /// Returns true if all of the above holds and we were able to figure out the
746 /// strlen, false otherwise.
747 bool tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const;
748
749 /// Enumeration used to describe the kind of Null pointer constant
750 /// returned from \c isNullPointerConstant().
751 enum NullPointerConstantKind {
752 /// Expression is not a Null pointer constant.
753 NPCK_NotNull = 0,
754
755 /// Expression is a Null pointer constant built from a zero integer
756 /// expression that is not a simple, possibly parenthesized, zero literal.
757 /// C++ Core Issue 903 will classify these expressions as "not pointers"
758 /// once it is adopted.
759 /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
760 NPCK_ZeroExpression,
761
762 /// Expression is a Null pointer constant built from a literal zero.
763 NPCK_ZeroLiteral,
764
765 /// Expression is a C++11 nullptr.
766 NPCK_CXX11_nullptr,
767
768 /// Expression is a GNU-style __null constant.
769 NPCK_GNUNull
770 };
771
772 /// Enumeration used to describe how \c isNullPointerConstant()
773 /// should cope with value-dependent expressions.
774 enum NullPointerConstantValueDependence {
775 /// Specifies that the expression should never be value-dependent.
776 NPC_NeverValueDependent = 0,
777
778 /// Specifies that a value-dependent expression of integral or
779 /// dependent type should be considered a null pointer constant.
780 NPC_ValueDependentIsNull,
781
782 /// Specifies that a value-dependent expression should be considered
783 /// to never be a null pointer constant.
784 NPC_ValueDependentIsNotNull
785 };
786
787 /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to
788 /// a Null pointer constant. The return value can further distinguish the
789 /// kind of NULL pointer constant that was detected.
790 NullPointerConstantKind isNullPointerConstant(
791 ASTContext &Ctx,
792 NullPointerConstantValueDependence NPC) const;
793
794 /// isOBJCGCCandidate - Return true if this expression may be used in a read/
795 /// write barrier.
796 bool isOBJCGCCandidate(ASTContext &Ctx) const;
797
798 /// Returns true if this expression is a bound member function.
799 bool isBoundMemberFunction(ASTContext &Ctx) const;
800
801 /// Given an expression of bound-member type, find the type
802 /// of the member. Returns null if this is an *overloaded* bound
803 /// member expression.
804 static QualType findBoundMemberType(const Expr *expr);
805
806 /// Skip past any invisble AST nodes which might surround this
807 /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes,
808 /// but also injected CXXMemberExpr and CXXConstructExpr which represent
809 /// implicit conversions.
810 Expr *IgnoreUnlessSpelledInSource();
811 const Expr *IgnoreUnlessSpelledInSource() const {
812 return const_cast<Expr *>(this)->IgnoreUnlessSpelledInSource();
813 }
814
815 /// Skip past any implicit casts which might surround this expression until
816 /// reaching a fixed point. Skips:
817 /// * ImplicitCastExpr
818 /// * FullExpr
819 Expr *IgnoreImpCasts() LLVM_READONLY__attribute__((__pure__));
820 const Expr *IgnoreImpCasts() const {
821 return const_cast<Expr *>(this)->IgnoreImpCasts();
822 }
823
824 /// Skip past any casts which might surround this expression until reaching
825 /// a fixed point. Skips:
826 /// * CastExpr
827 /// * FullExpr
828 /// * MaterializeTemporaryExpr
829 /// * SubstNonTypeTemplateParmExpr
830 Expr *IgnoreCasts() LLVM_READONLY__attribute__((__pure__));
831 const Expr *IgnoreCasts() const {
832 return const_cast<Expr *>(this)->IgnoreCasts();
833 }
834
835 /// Skip past any implicit AST nodes which might surround this expression
836 /// until reaching a fixed point. Skips:
837 /// * What IgnoreImpCasts() skips
838 /// * MaterializeTemporaryExpr
839 /// * CXXBindTemporaryExpr
840 Expr *IgnoreImplicit() LLVM_READONLY__attribute__((__pure__));
841 const Expr *IgnoreImplicit() const {
842 return const_cast<Expr *>(this)->IgnoreImplicit();
843 }
844
845 /// Skip past any implicit AST nodes which might surround this expression
846 /// until reaching a fixed point. Same as IgnoreImplicit, except that it
847 /// also skips over implicit calls to constructors and conversion functions.
848 ///
849 /// FIXME: Should IgnoreImplicit do this?
850 Expr *IgnoreImplicitAsWritten() LLVM_READONLY__attribute__((__pure__));
851 const Expr *IgnoreImplicitAsWritten() const {
852 return const_cast<Expr *>(this)->IgnoreImplicitAsWritten();
853 }
854
855 /// Skip past any parentheses which might surround this expression until
856 /// reaching a fixed point. Skips:
857 /// * ParenExpr
858 /// * UnaryOperator if `UO_Extension`
859 /// * GenericSelectionExpr if `!isResultDependent()`
860 /// * ChooseExpr if `!isConditionDependent()`
861 /// * ConstantExpr
862 Expr *IgnoreParens() LLVM_READONLY__attribute__((__pure__));
863 const Expr *IgnoreParens() const {
864 return const_cast<Expr *>(this)->IgnoreParens();
865 }
866
867 /// Skip past any parentheses and implicit casts which might surround this
868 /// expression until reaching a fixed point.
869 /// FIXME: IgnoreParenImpCasts really ought to be equivalent to
870 /// IgnoreParens() + IgnoreImpCasts() until reaching a fixed point. However
871 /// this is currently not the case. Instead IgnoreParenImpCasts() skips:
872 /// * What IgnoreParens() skips
873 /// * What IgnoreImpCasts() skips
874 /// * MaterializeTemporaryExpr
875 /// * SubstNonTypeTemplateParmExpr
876 Expr *IgnoreParenImpCasts() LLVM_READONLY__attribute__((__pure__));
877 const Expr *IgnoreParenImpCasts() const {
878 return const_cast<Expr *>(this)->IgnoreParenImpCasts();
879 }
880
881 /// Skip past any parentheses and casts which might surround this expression
882 /// until reaching a fixed point. Skips:
883 /// * What IgnoreParens() skips
884 /// * What IgnoreCasts() skips
885 Expr *IgnoreParenCasts() LLVM_READONLY__attribute__((__pure__));
886 const Expr *IgnoreParenCasts() const {
887 return const_cast<Expr *>(this)->IgnoreParenCasts();
888 }
889
890 /// Skip conversion operators. If this Expr is a call to a conversion
891 /// operator, return the argument.
892 Expr *IgnoreConversionOperatorSingleStep() LLVM_READONLY__attribute__((__pure__));
893 const Expr *IgnoreConversionOperatorSingleStep() const {
894 return const_cast<Expr *>(this)->IgnoreConversionOperatorSingleStep();
895 }
896
897 /// Skip past any parentheses and lvalue casts which might surround this
898 /// expression until reaching a fixed point. Skips:
899 /// * What IgnoreParens() skips
900 /// * What IgnoreCasts() skips, except that only lvalue-to-rvalue
901 /// casts are skipped
902 /// FIXME: This is intended purely as a temporary workaround for code
903 /// that hasn't yet been rewritten to do the right thing about those
904 /// casts, and may disappear along with the last internal use.
905 Expr *IgnoreParenLValueCasts() LLVM_READONLY__attribute__((__pure__));
906 const Expr *IgnoreParenLValueCasts() const {
907 return const_cast<Expr *>(this)->IgnoreParenLValueCasts();
908 }
909
910 /// Skip past any parenthese and casts which do not change the value
911 /// (including ptr->int casts of the same size) until reaching a fixed point.
912 /// Skips:
913 /// * What IgnoreParens() skips
914 /// * CastExpr which do not change the value
915 /// * SubstNonTypeTemplateParmExpr
916 Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY__attribute__((__pure__));
917 const Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) const {
918 return const_cast<Expr *>(this)->IgnoreParenNoopCasts(Ctx);
919 }
920
921 /// Skip past any parentheses and derived-to-base casts until reaching a
922 /// fixed point. Skips:
923 /// * What IgnoreParens() skips
924 /// * CastExpr which represent a derived-to-base cast (CK_DerivedToBase,
925 /// CK_UncheckedDerivedToBase and CK_NoOp)
926 Expr *IgnoreParenBaseCasts() LLVM_READONLY__attribute__((__pure__));
927 const Expr *IgnoreParenBaseCasts() const {
928 return const_cast<Expr *>(this)->IgnoreParenBaseCasts();
929 }
930
931 /// Determine whether this expression is a default function argument.
932 ///
933 /// Default arguments are implicitly generated in the abstract syntax tree
934 /// by semantic analysis for function calls, object constructions, etc. in
935 /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes;
936 /// this routine also looks through any implicit casts to determine whether
937 /// the expression is a default argument.
938 bool isDefaultArgument() const;
939
940 /// Determine whether the result of this expression is a
941 /// temporary object of the given class type.
942 bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const;
943
944 /// Whether this expression is an implicit reference to 'this' in C++.
945 bool isImplicitCXXThis() const;
946
947 static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs);
948
949 /// For an expression of class type or pointer to class type,
950 /// return the most derived class decl the expression is known to refer to.
951 ///
952 /// If this expression is a cast, this method looks through it to find the
953 /// most derived decl that can be inferred from the expression.
954 /// This is valid because derived-to-base conversions have undefined
955 /// behavior if the object isn't dynamically of the derived type.
956 const CXXRecordDecl *getBestDynamicClassType() const;
957
958 /// Get the inner expression that determines the best dynamic class.
959 /// If this is a prvalue, we guarantee that it is of the most-derived type
960 /// for the object itself.
961 const Expr *getBestDynamicClassTypeExpr() const;
962
963 /// Walk outwards from an expression we want to bind a reference to and
964 /// find the expression whose lifetime needs to be extended. Record
965 /// the LHSs of comma expressions and adjustments needed along the path.
966 const Expr *skipRValueSubobjectAdjustments(
967 SmallVectorImpl<const Expr *> &CommaLHS,
968 SmallVectorImpl<SubobjectAdjustment> &Adjustments) const;
969 const Expr *skipRValueSubobjectAdjustments() const {
970 SmallVector<const Expr *, 8> CommaLHSs;
971 SmallVector<SubobjectAdjustment, 8> Adjustments;
972 return skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
973 }
974
975 /// Checks that the two Expr's will refer to the same value as a comparison
976 /// operand. The caller must ensure that the values referenced by the Expr's
977 /// are not modified between E1 and E2 or the result my be invalid.
978 static bool isSameComparisonOperand(const Expr* E1, const Expr* E2);
979
980 static bool classof(const Stmt *T) {
981 return T->getStmtClass() >= firstExprConstant &&
982 T->getStmtClass() <= lastExprConstant;
983 }
984};
985// PointerLikeTypeTraits is specialized so it can be used with a forward-decl of
986// Expr. Verify that we got it right.
987static_assert(llvm::PointerLikeTypeTraits<Expr *>::NumLowBitsAvailable <=
988 llvm::detail::ConstantLog2<alignof(Expr)>::value,
989 "PointerLikeTypeTraits<Expr*> assumes too much alignment.");
990
991using ConstantExprKind = Expr::ConstantExprKind;
992
993//===----------------------------------------------------------------------===//
994// Wrapper Expressions.
995//===----------------------------------------------------------------------===//
996
997/// FullExpr - Represents a "full-expression" node.
998class FullExpr : public Expr {
999protected:
1000 Stmt *SubExpr;
1001
1002 FullExpr(StmtClass SC, Expr *subexpr)
1003 : Expr(SC, subexpr->getType(), subexpr->getValueKind(),
1004 subexpr->getObjectKind()),
1005 SubExpr(subexpr) {
1006 setDependence(computeDependence(this));
1007 }
1008 FullExpr(StmtClass SC, EmptyShell Empty)
1009 : Expr(SC, Empty) {}
1010public:
1011 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
1012 Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1013
1014 /// As with any mutator of the AST, be very careful when modifying an
1015 /// existing AST to preserve its invariants.
1016 void setSubExpr(Expr *E) { SubExpr = E; }
1017
1018 static bool classof(const Stmt *T) {
1019 return T->getStmtClass() >= firstFullExprConstant &&
1020 T->getStmtClass() <= lastFullExprConstant;
1021 }
1022};
1023
1024/// ConstantExpr - An expression that occurs in a constant context and
1025/// optionally the result of evaluating the expression.
1026class ConstantExpr final
1027 : public FullExpr,
1028 private llvm::TrailingObjects<ConstantExpr, APValue, uint64_t> {
1029 static_assert(std::is_same<uint64_t, llvm::APInt::WordType>::value,
1030 "ConstantExpr assumes that llvm::APInt::WordType is uint64_t "
1031 "for tail-allocated storage");
1032 friend TrailingObjects;
1033 friend class ASTStmtReader;
1034 friend class ASTStmtWriter;
1035
1036public:
1037 /// Describes the kind of result that can be tail-allocated.
1038 enum ResultStorageKind { RSK_None, RSK_Int64, RSK_APValue };
1039
1040private:
1041 size_t numTrailingObjects(OverloadToken<APValue>) const {
1042 return ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue;
1043 }
1044 size_t numTrailingObjects(OverloadToken<uint64_t>) const {
1045 return ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64;
1046 }
1047
1048 uint64_t &Int64Result() {
1049 assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64 &&(static_cast<void> (0))
1050 "invalid accessor")(static_cast<void> (0));
1051 return *getTrailingObjects<uint64_t>();
1052 }
1053 const uint64_t &Int64Result() const {
1054 return const_cast<ConstantExpr *>(this)->Int64Result();
1055 }
1056 APValue &APValueResult() {
1057 assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue &&(static_cast<void> (0))
1058 "invalid accessor")(static_cast<void> (0));
1059 return *getTrailingObjects<APValue>();
1060 }
1061 APValue &APValueResult() const {
1062 return const_cast<ConstantExpr *>(this)->APValueResult();
1063 }
1064
1065 ConstantExpr(Expr *SubExpr, ResultStorageKind StorageKind,
1066 bool IsImmediateInvocation);
1067 ConstantExpr(EmptyShell Empty, ResultStorageKind StorageKind);
1068
1069public:
1070 static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1071 const APValue &Result);
1072 static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1073 ResultStorageKind Storage = RSK_None,
1074 bool IsImmediateInvocation = false);
1075 static ConstantExpr *CreateEmpty(const ASTContext &Context,
1076 ResultStorageKind StorageKind);
1077
1078 static ResultStorageKind getStorageKind(const APValue &Value);
1079 static ResultStorageKind getStorageKind(const Type *T,
1080 const ASTContext &Context);
1081
1082 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
1083 return SubExpr->getBeginLoc();
1084 }
1085 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
1086 return SubExpr->getEndLoc();
1087 }
1088
1089 static bool classof(const Stmt *T) {
1090 return T->getStmtClass() == ConstantExprClass;
1091 }
1092
1093 void SetResult(APValue Value, const ASTContext &Context) {
1094 MoveIntoResult(Value, Context);
1095 }
1096 void MoveIntoResult(APValue &Value, const ASTContext &Context);
1097
1098 APValue::ValueKind getResultAPValueKind() const {
1099 return static_cast<APValue::ValueKind>(ConstantExprBits.APValueKind);
1100 }
1101 ResultStorageKind getResultStorageKind() const {
1102 return static_cast<ResultStorageKind>(ConstantExprBits.ResultKind);
1103 }
1104 bool isImmediateInvocation() const {
1105 return ConstantExprBits.IsImmediateInvocation;
1106 }
1107 bool hasAPValueResult() const {
1108 return ConstantExprBits.APValueKind != APValue::None;
1109 }
1110 APValue getAPValueResult() const;
1111 APValue &getResultAsAPValue() const { return APValueResult(); }
1112 llvm::APSInt getResultAsAPSInt() const;
1113 // Iterators
1114 child_range children() { return child_range(&SubExpr, &SubExpr+1); }
1115 const_child_range children() const {
1116 return const_child_range(&SubExpr, &SubExpr + 1);
1117 }
1118};
1119
1120//===----------------------------------------------------------------------===//
1121// Primary Expressions.
1122//===----------------------------------------------------------------------===//
1123
1124/// OpaqueValueExpr - An expression referring to an opaque object of a
1125/// fixed type and value class. These don't correspond to concrete
1126/// syntax; instead they're used to express operations (usually copy
1127/// operations) on values whose source is generally obvious from
1128/// context.
1129class OpaqueValueExpr : public Expr {
1130 friend class ASTStmtReader;
1131 Expr *SourceExpr;
1132
1133public:
1134 OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK,
1135 ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr)
1136 : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) {
1137 setIsUnique(false);
1138 OpaqueValueExprBits.Loc = Loc;
1139 setDependence(computeDependence(this));
1140 }
1141
1142 /// Given an expression which invokes a copy constructor --- i.e. a
1143 /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups ---
1144 /// find the OpaqueValueExpr that's the source of the construction.
1145 static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr);
1146
1147 explicit OpaqueValueExpr(EmptyShell Empty)
1148 : Expr(OpaqueValueExprClass, Empty) {}
1149
1150 /// Retrieve the location of this expression.
1151 SourceLocation getLocation() const { return OpaqueValueExprBits.Loc; }
1152
1153 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
1154 return SourceExpr ? SourceExpr->getBeginLoc() : getLocation();
1155 }
1156 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
1157 return SourceExpr ? SourceExpr->getEndLoc() : getLocation();
1158 }
1159 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__)) {
1160 return SourceExpr ? SourceExpr->getExprLoc() : getLocation();
1161 }
1162
1163 child_range children() {
1164 return child_range(child_iterator(), child_iterator());
1165 }
1166
1167 const_child_range children() const {
1168 return const_child_range(const_child_iterator(), const_child_iterator());
1169 }
1170
1171 /// The source expression of an opaque value expression is the
1172 /// expression which originally generated the value. This is
1173 /// provided as a convenience for analyses that don't wish to
1174 /// precisely model the execution behavior of the program.
1175 ///
1176 /// The source expression is typically set when building the
1177 /// expression which binds the opaque value expression in the first
1178 /// place.
1179 Expr *getSourceExpr() const { return SourceExpr; }
1180
1181 void setIsUnique(bool V) {
1182 assert((!V || SourceExpr) &&(static_cast<void> (0))
1183 "unique OVEs are expected to have source expressions")(static_cast<void> (0));
1184 OpaqueValueExprBits.IsUnique = V;
1185 }
1186
1187 bool isUnique() const { return OpaqueValueExprBits.IsUnique; }
1188
1189 static bool classof(const Stmt *T) {
1190 return T->getStmtClass() == OpaqueValueExprClass;
1191 }
1192};
1193
1194/// A reference to a declared variable, function, enum, etc.
1195/// [C99 6.5.1p2]
1196///
1197/// This encodes all the information about how a declaration is referenced
1198/// within an expression.
1199///
1200/// There are several optional constructs attached to DeclRefExprs only when
1201/// they apply in order to conserve memory. These are laid out past the end of
1202/// the object, and flags in the DeclRefExprBitfield track whether they exist:
1203///
1204/// DeclRefExprBits.HasQualifier:
1205/// Specifies when this declaration reference expression has a C++
1206/// nested-name-specifier.
1207/// DeclRefExprBits.HasFoundDecl:
1208/// Specifies when this declaration reference expression has a record of
1209/// a NamedDecl (different from the referenced ValueDecl) which was found
1210/// during name lookup and/or overload resolution.
1211/// DeclRefExprBits.HasTemplateKWAndArgsInfo:
1212/// Specifies when this declaration reference expression has an explicit
1213/// C++ template keyword and/or template argument list.
1214/// DeclRefExprBits.RefersToEnclosingVariableOrCapture
1215/// Specifies when this declaration reference expression (validly)
1216/// refers to an enclosed local or a captured variable.
1217class DeclRefExpr final
1218 : public Expr,
1219 private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc,
1220 NamedDecl *, ASTTemplateKWAndArgsInfo,
1221 TemplateArgumentLoc> {
1222 friend class ASTStmtReader;
1223 friend class ASTStmtWriter;
1224 friend TrailingObjects;
1225
1226 /// The declaration that we are referencing.
1227 ValueDecl *D;
1228
1229 /// Provides source/type location info for the declaration name
1230 /// embedded in D.
1231 DeclarationNameLoc DNLoc;
1232
1233 size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const {
1234 return hasQualifier();
1235 }
1236
1237 size_t numTrailingObjects(OverloadToken<NamedDecl *>) const {
1238 return hasFoundDecl();
1239 }
1240
1241 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
1242 return hasTemplateKWAndArgsInfo();
1243 }
1244
1245 /// Test whether there is a distinct FoundDecl attached to the end of
1246 /// this DRE.
1247 bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; }
1248
1249 DeclRefExpr(const ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc,
1250 SourceLocation TemplateKWLoc, ValueDecl *D,
1251 bool RefersToEnlosingVariableOrCapture,
1252 const DeclarationNameInfo &NameInfo, NamedDecl *FoundD,
1253 const TemplateArgumentListInfo *TemplateArgs, QualType T,
1254 ExprValueKind VK, NonOdrUseReason NOUR);
1255
1256 /// Construct an empty declaration reference expression.
1257 explicit DeclRefExpr(EmptyShell Empty) : Expr(DeclRefExprClass, Empty) {}
1258
1259public:
1260 DeclRefExpr(const ASTContext &Ctx, ValueDecl *D,
1261 bool RefersToEnclosingVariableOrCapture, QualType T,
1262 ExprValueKind VK, SourceLocation L,
1263 const DeclarationNameLoc &LocInfo = DeclarationNameLoc(),
1264 NonOdrUseReason NOUR = NOUR_None);
1265
1266 static DeclRefExpr *
1267 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1268 SourceLocation TemplateKWLoc, ValueDecl *D,
1269 bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc,
1270 QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr,
1271 const TemplateArgumentListInfo *TemplateArgs = nullptr,
1272 NonOdrUseReason NOUR = NOUR_None);
1273
1274 static DeclRefExpr *
1275 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1276 SourceLocation TemplateKWLoc, ValueDecl *D,
1277 bool RefersToEnclosingVariableOrCapture,
1278 const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK,
1279 NamedDecl *FoundD = nullptr,
1280 const TemplateArgumentListInfo *TemplateArgs = nullptr,
1281 NonOdrUseReason NOUR = NOUR_None);
1282
1283 /// Construct an empty declaration reference expression.
1284 static DeclRefExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
1285 bool HasFoundDecl,
1286 bool HasTemplateKWAndArgsInfo,
1287 unsigned NumTemplateArgs);
1288
1289 ValueDecl *getDecl() { return D; }
1290 const ValueDecl *getDecl() const { return D; }
1291 void setDecl(ValueDecl *NewD);
1292
1293 DeclarationNameInfo getNameInfo() const {
1294 return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc);
1295 }
1296
1297 SourceLocation getLocation() const { return DeclRefExprBits.Loc; }
1298 void setLocation(SourceLocation L) { DeclRefExprBits.Loc = L; }
1299 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
1300 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
1301
1302 /// Determine whether this declaration reference was preceded by a
1303 /// C++ nested-name-specifier, e.g., \c N::foo.
1304 bool hasQualifier() const { return DeclRefExprBits.HasQualifier; }
1305
1306 /// If the name was qualified, retrieves the nested-name-specifier
1307 /// that precedes the name, with source-location information.
1308 NestedNameSpecifierLoc getQualifierLoc() const {
1309 if (!hasQualifier())
1310 return NestedNameSpecifierLoc();
1311 return *getTrailingObjects<NestedNameSpecifierLoc>();
1312 }
1313
1314 /// If the name was qualified, retrieves the nested-name-specifier
1315 /// that precedes the name. Otherwise, returns NULL.
1316 NestedNameSpecifier *getQualifier() const {
1317 return getQualifierLoc().getNestedNameSpecifier();
1318 }
1319
1320 /// Get the NamedDecl through which this reference occurred.
1321 ///
1322 /// This Decl may be different from the ValueDecl actually referred to in the
1323 /// presence of using declarations, etc. It always returns non-NULL, and may
1324 /// simple return the ValueDecl when appropriate.
1325
1326 NamedDecl *getFoundDecl() {
1327 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1328 }
1329
1330 /// Get the NamedDecl through which this reference occurred.
1331 /// See non-const variant.
1332 const NamedDecl *getFoundDecl() const {
1333 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1334 }
1335
1336 bool hasTemplateKWAndArgsInfo() const {
1337 return DeclRefExprBits.HasTemplateKWAndArgsInfo;
1338 }
1339
1340 /// Retrieve the location of the template keyword preceding
1341 /// this name, if any.
1342 SourceLocation getTemplateKeywordLoc() const {
1343 if (!hasTemplateKWAndArgsInfo())
1344 return SourceLocation();
1345 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
1346 }
1347
1348 /// Retrieve the location of the left angle bracket starting the
1349 /// explicit template argument list following the name, if any.
1350 SourceLocation getLAngleLoc() const {
1351 if (!hasTemplateKWAndArgsInfo())
1352 return SourceLocation();
1353 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
1354 }
1355
1356 /// Retrieve the location of the right angle bracket ending the
1357 /// explicit template argument list following the name, if any.
1358 SourceLocation getRAngleLoc() const {
1359 if (!hasTemplateKWAndArgsInfo())
1360 return SourceLocation();
1361 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
1362 }
1363
1364 /// Determines whether the name in this declaration reference
1365 /// was preceded by the template keyword.
1366 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
1367
1368 /// Determines whether this declaration reference was followed by an
1369 /// explicit template argument list.
1370 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
1371
1372 /// Copies the template arguments (if present) into the given
1373 /// structure.
1374 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
1375 if (hasExplicitTemplateArgs())
1376 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
1377 getTrailingObjects<TemplateArgumentLoc>(), List);
1378 }
1379
1380 /// Retrieve the template arguments provided as part of this
1381 /// template-id.
1382 const TemplateArgumentLoc *getTemplateArgs() const {
1383 if (!hasExplicitTemplateArgs())
1384 return nullptr;
1385 return getTrailingObjects<TemplateArgumentLoc>();
1386 }
1387
1388 /// Retrieve the number of template arguments provided as part of this
1389 /// template-id.
1390 unsigned getNumTemplateArgs() const {
1391 if (!hasExplicitTemplateArgs())
1392 return 0;
1393 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
1394 }
1395
1396 ArrayRef<TemplateArgumentLoc> template_arguments() const {
1397 return {getTemplateArgs(), getNumTemplateArgs()};
1398 }
1399
1400 /// Returns true if this expression refers to a function that
1401 /// was resolved from an overloaded set having size greater than 1.
1402 bool hadMultipleCandidates() const {
1403 return DeclRefExprBits.HadMultipleCandidates;
1404 }
1405 /// Sets the flag telling whether this expression refers to
1406 /// a function that was resolved from an overloaded set having size
1407 /// greater than 1.
1408 void setHadMultipleCandidates(bool V = true) {
1409 DeclRefExprBits.HadMultipleCandidates = V;
1410 }
1411
1412 /// Is this expression a non-odr-use reference, and if so, why?
1413 NonOdrUseReason isNonOdrUse() const {
1414 return static_cast<NonOdrUseReason>(DeclRefExprBits.NonOdrUseReason);
1415 }
1416
1417 /// Does this DeclRefExpr refer to an enclosing local or a captured
1418 /// variable?
1419 bool refersToEnclosingVariableOrCapture() const {
1420 return DeclRefExprBits.RefersToEnclosingVariableOrCapture;
1421 }
1422
1423 static bool classof(const Stmt *T) {
1424 return T->getStmtClass() == DeclRefExprClass;
1425 }
1426
1427 // Iterators
1428 child_range children() {
1429 return child_range(child_iterator(), child_iterator());
1430 }
1431
1432 const_child_range children() const {
1433 return const_child_range(const_child_iterator(), const_child_iterator());
1434 }
1435};
1436
1437/// Used by IntegerLiteral/FloatingLiteral to store the numeric without
1438/// leaking memory.
1439///
1440/// For large floats/integers, APFloat/APInt will allocate memory from the heap
1441/// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator
1442/// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
1443/// the APFloat/APInt values will never get freed. APNumericStorage uses
1444/// ASTContext's allocator for memory allocation.
1445class APNumericStorage {
1446 union {
1447 uint64_t VAL; ///< Used to store the <= 64 bits integer value.
1448 uint64_t *pVal; ///< Used to store the >64 bits integer value.
1449 };
1450 unsigned BitWidth;
1451
1452 bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; }
1453
1454 APNumericStorage(const APNumericStorage &) = delete;
1455 void operator=(const APNumericStorage &) = delete;
1456
1457protected:
1458 APNumericStorage() : VAL(0), BitWidth(0) { }
1459
1460 llvm::APInt getIntValue() const {
1461 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
1462 if (NumWords > 1)
1463 return llvm::APInt(BitWidth, NumWords, pVal);
1464 else
1465 return llvm::APInt(BitWidth, VAL);
1466 }
1467 void setIntValue(const ASTContext &C, const llvm::APInt &Val);
1468};
1469
1470class APIntStorage : private APNumericStorage {
1471public:
1472 llvm::APInt getValue() const { return getIntValue(); }
1473 void setValue(const ASTContext &C, const llvm::APInt &Val) {
1474 setIntValue(C, Val);
1475 }
1476};
1477
1478class APFloatStorage : private APNumericStorage {
1479public:
1480 llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const {
1481 return llvm::APFloat(Semantics, getIntValue());
1482 }
1483 void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1484 setIntValue(C, Val.bitcastToAPInt());
1485 }
1486};
1487
1488class IntegerLiteral : public Expr, public APIntStorage {
1489 SourceLocation Loc;
1490
1491 /// Construct an empty integer literal.
1492 explicit IntegerLiteral(EmptyShell Empty)
1493 : Expr(IntegerLiteralClass, Empty) { }
1494
1495public:
1496 // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
1497 // or UnsignedLongLongTy
1498 IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
1499 SourceLocation l);
1500
1501 /// Returns a new integer literal with value 'V' and type 'type'.
1502 /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy,
1503 /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V
1504 /// \param V - the value that the returned integer literal contains.
1505 static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V,
1506 QualType type, SourceLocation l);
1507 /// Returns a new empty integer literal.
1508 static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty);
1509
1510 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1511 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1512
1513 /// Retrieve the location of the literal.
1514 SourceLocation getLocation() const { return Loc; }
1515
1516 void setLocation(SourceLocation Location) { Loc = Location; }
1517
1518 static bool classof(const Stmt *T) {
1519 return T->getStmtClass() == IntegerLiteralClass;
1520 }
1521
1522 // Iterators
1523 child_range children() {
1524 return child_range(child_iterator(), child_iterator());
1525 }
1526 const_child_range children() const {
1527 return const_child_range(const_child_iterator(), const_child_iterator());
1528 }
1529};
1530
1531class FixedPointLiteral : public Expr, public APIntStorage {
1532 SourceLocation Loc;
1533 unsigned Scale;
1534
1535 /// \brief Construct an empty fixed-point literal.
1536 explicit FixedPointLiteral(EmptyShell Empty)
1537 : Expr(FixedPointLiteralClass, Empty) {}
1538
1539 public:
1540 FixedPointLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
1541 SourceLocation l, unsigned Scale);
1542
1543 // Store the int as is without any bit shifting.
1544 static FixedPointLiteral *CreateFromRawInt(const ASTContext &C,
1545 const llvm::APInt &V,
1546 QualType type, SourceLocation l,
1547 unsigned Scale);
1548
1549 /// Returns an empty fixed-point literal.
1550 static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty);
1551
1552 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1553 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1554
1555 /// \brief Retrieve the location of the literal.
1556 SourceLocation getLocation() const { return Loc; }
1557
1558 void setLocation(SourceLocation Location) { Loc = Location; }
1559
1560 unsigned getScale() const { return Scale; }
1561 void setScale(unsigned S) { Scale = S; }
1562
1563 static bool classof(const Stmt *T) {
1564 return T->getStmtClass() == FixedPointLiteralClass;
1565 }
1566
1567 std::string getValueAsString(unsigned Radix) const;
1568
1569 // Iterators
1570 child_range children() {
1571 return child_range(child_iterator(), child_iterator());
1572 }
1573 const_child_range children() const {
1574 return const_child_range(const_child_iterator(), const_child_iterator());
1575 }
1576};
1577
1578class CharacterLiteral : public Expr {
1579public:
1580 enum CharacterKind {
1581 Ascii,
1582 Wide,
1583 UTF8,
1584 UTF16,
1585 UTF32
1586 };
1587
1588private:
1589 unsigned Value;
1590 SourceLocation Loc;
1591public:
1592 // type should be IntTy
1593 CharacterLiteral(unsigned value, CharacterKind kind, QualType type,
1594 SourceLocation l)
1595 : Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary),
1596 Value(value), Loc(l) {
1597 CharacterLiteralBits.Kind = kind;
1598 setDependence(ExprDependence::None);
1599 }
1600
1601 /// Construct an empty character literal.
1602 CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
1603
1604 SourceLocation getLocation() const { return Loc; }
1605 CharacterKind getKind() const {
1606 return static_cast<CharacterKind>(CharacterLiteralBits.Kind);
1607 }
1608
1609 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1610 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1611
1612 unsigned getValue() const { return Value; }
1613
1614 void setLocation(SourceLocation Location) { Loc = Location; }
1615 void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; }
1616 void setValue(unsigned Val) { Value = Val; }
1617
1618 static bool classof(const Stmt *T) {
1619 return T->getStmtClass() == CharacterLiteralClass;
1620 }
1621
1622 static void print(unsigned val, CharacterKind Kind, raw_ostream &OS);
1623
1624 // Iterators
1625 child_range children() {
1626 return child_range(child_iterator(), child_iterator());
1627 }
1628 const_child_range children() const {
1629 return const_child_range(const_child_iterator(), const_child_iterator());
1630 }
1631};
1632
1633class FloatingLiteral : public Expr, private APFloatStorage {
1634 SourceLocation Loc;
1635
1636 FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact,
1637 QualType Type, SourceLocation L);
1638
1639 /// Construct an empty floating-point literal.
1640 explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty);
1641
1642public:
1643 static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V,
1644 bool isexact, QualType Type, SourceLocation L);
1645 static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty);
1646
1647 llvm::APFloat getValue() const {
1648 return APFloatStorage::getValue(getSemantics());
1649 }
1650 void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1651 assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics")(static_cast<void> (0));
1652 APFloatStorage::setValue(C, Val);
1653 }
1654
1655 /// Get a raw enumeration value representing the floating-point semantics of
1656 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
1657 llvm::APFloatBase::Semantics getRawSemantics() const {
1658 return static_cast<llvm::APFloatBase::Semantics>(
1659 FloatingLiteralBits.Semantics);
1660 }
1661
1662 /// Set the raw enumeration value representing the floating-point semantics of
1663 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
1664 void setRawSemantics(llvm::APFloatBase::Semantics Sem) {
1665 FloatingLiteralBits.Semantics = Sem;
1666 }
1667
1668 /// Return the APFloat semantics this literal uses.
1669 const llvm::fltSemantics &getSemantics() const {
1670 return llvm::APFloatBase::EnumToSemantics(
1671 static_cast<llvm::APFloatBase::Semantics>(
1672 FloatingLiteralBits.Semantics));
1673 }
1674
1675 /// Set the APFloat semantics this literal uses.
1676 void setSemantics(const llvm::fltSemantics &Sem) {
1677 FloatingLiteralBits.Semantics = llvm::APFloatBase::SemanticsToEnum(Sem);
1678 }
1679
1680 bool isExact() const { return FloatingLiteralBits.IsExact; }
1681 void setExact(bool E) { FloatingLiteralBits.IsExact = E; }
1682
1683 /// getValueAsApproximateDouble - This returns the value as an inaccurate
1684 /// double. Note that this may cause loss of precision, but is useful for
1685 /// debugging dumps, etc.
1686 double getValueAsApproximateDouble() const;
1687
1688 SourceLocation getLocation() const { return Loc; }
1689 void setLocation(SourceLocation L) { Loc = L; }
1690
1691 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1692 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Loc; }
1693
1694 static bool classof(const Stmt *T) {
1695 return T->getStmtClass() == FloatingLiteralClass;
1696 }
1697
1698 // Iterators
1699 child_range children() {
1700 return child_range(child_iterator(), child_iterator());
1701 }
1702 const_child_range children() const {
1703 return const_child_range(const_child_iterator(), const_child_iterator());
1704 }
1705};
1706
1707/// ImaginaryLiteral - We support imaginary integer and floating point literals,
1708/// like "1.0i". We represent these as a wrapper around FloatingLiteral and
1709/// IntegerLiteral classes. Instances of this class always have a Complex type
1710/// whose element type matches the subexpression.
1711///
1712class ImaginaryLiteral : public Expr {
1713 Stmt *Val;
1714public:
1715 ImaginaryLiteral(Expr *val, QualType Ty)
1716 : Expr(ImaginaryLiteralClass, Ty, VK_PRValue, OK_Ordinary), Val(val) {
1717 setDependence(ExprDependence::None);
1718 }
1719
1720 /// Build an empty imaginary literal.
1721 explicit ImaginaryLiteral(EmptyShell Empty)
1722 : Expr(ImaginaryLiteralClass, Empty) { }
1723
1724 const Expr *getSubExpr() const { return cast<Expr>(Val); }
1725 Expr *getSubExpr() { return cast<Expr>(Val); }
1726 void setSubExpr(Expr *E) { Val = E; }
1727
1728 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
1729 return Val->getBeginLoc();
1730 }
1731 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Val->getEndLoc(); }
1732
1733 static bool classof(const Stmt *T) {
1734 return T->getStmtClass() == ImaginaryLiteralClass;
1735 }
1736
1737 // Iterators
1738 child_range children() { return child_range(&Val, &Val+1); }
1739 const_child_range children() const {
1740 return const_child_range(&Val, &Val + 1);
1741 }
1742};
1743
1744/// StringLiteral - This represents a string literal expression, e.g. "foo"
1745/// or L"bar" (wide strings). The actual string data can be obtained with
1746/// getBytes() and is NOT null-terminated. The length of the string data is
1747/// determined by calling getByteLength().
1748///
1749/// The C type for a string is always a ConstantArrayType. In C++, the char
1750/// type is const qualified, in C it is not.
1751///
1752/// Note that strings in C can be formed by concatenation of multiple string
1753/// literal pptokens in translation phase #6. This keeps track of the locations
1754/// of each of these pieces.
1755///
1756/// Strings in C can also be truncated and extended by assigning into arrays,
1757/// e.g. with constructs like:
1758/// char X[2] = "foobar";
1759/// In this case, getByteLength() will return 6, but the string literal will
1760/// have type "char[2]".
1761class StringLiteral final
1762 : public Expr,
1763 private llvm::TrailingObjects<StringLiteral, unsigned, SourceLocation,
1764 char> {
1765 friend class ASTStmtReader;
1766 friend TrailingObjects;
1767
1768 /// StringLiteral is followed by several trailing objects. They are in order:
1769 ///
1770 /// * A single unsigned storing the length in characters of this string. The
1771 /// length in bytes is this length times the width of a single character.
1772 /// Always present and stored as a trailing objects because storing it in
1773 /// StringLiteral would increase the size of StringLiteral by sizeof(void *)
1774 /// due to alignment requirements. If you add some data to StringLiteral,
1775 /// consider moving it inside StringLiteral.
1776 ///
1777 /// * An array of getNumConcatenated() SourceLocation, one for each of the
1778 /// token this string is made of.
1779 ///
1780 /// * An array of getByteLength() char used to store the string data.
1781
1782public:
1783 enum StringKind { Ascii, Wide, UTF8, UTF16, UTF32 };
1784
1785private:
1786 unsigned numTrailingObjects(OverloadToken<unsigned>) const { return 1; }
1787 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1788 return getNumConcatenated();
1789 }
1790
1791 unsigned numTrailingObjects(OverloadToken<char>) const {
1792 return getByteLength();
1793 }
1794
1795 char *getStrDataAsChar() { return getTrailingObjects<char>(); }
1796 const char *getStrDataAsChar() const { return getTrailingObjects<char>(); }
1797
1798 const uint16_t *getStrDataAsUInt16() const {
1799 return reinterpret_cast<const uint16_t *>(getTrailingObjects<char>());
1800 }
1801
1802 const uint32_t *getStrDataAsUInt32() const {
1803 return reinterpret_cast<const uint32_t *>(getTrailingObjects<char>());
1804 }
1805
1806 /// Build a string literal.
1807 StringLiteral(const ASTContext &Ctx, StringRef Str, StringKind Kind,
1808 bool Pascal, QualType Ty, const SourceLocation *Loc,
1809 unsigned NumConcatenated);
1810
1811 /// Build an empty string literal.
1812 StringLiteral(EmptyShell Empty, unsigned NumConcatenated, unsigned Length,
1813 unsigned CharByteWidth);
1814
1815 /// Map a target and string kind to the appropriate character width.
1816 static unsigned mapCharByteWidth(TargetInfo const &Target, StringKind SK);
1817
1818 /// Set one of the string literal token.
1819 void setStrTokenLoc(unsigned TokNum, SourceLocation L) {
1820 assert(TokNum < getNumConcatenated() && "Invalid tok number")(static_cast<void> (0));
1821 getTrailingObjects<SourceLocation>()[TokNum] = L;
1822 }
1823
1824public:
1825 /// This is the "fully general" constructor that allows representation of
1826 /// strings formed from multiple concatenated tokens.
1827 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1828 StringKind Kind, bool Pascal, QualType Ty,
1829 const SourceLocation *Loc,
1830 unsigned NumConcatenated);
1831
1832 /// Simple constructor for string literals made from one token.
1833 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1834 StringKind Kind, bool Pascal, QualType Ty,
1835 SourceLocation Loc) {
1836 return Create(Ctx, Str, Kind, Pascal, Ty, &Loc, 1);
1837 }
1838
1839 /// Construct an empty string literal.
1840 static StringLiteral *CreateEmpty(const ASTContext &Ctx,
1841 unsigned NumConcatenated, unsigned Length,
1842 unsigned CharByteWidth);
1843
1844 StringRef getString() const {
1845 assert(getCharByteWidth() == 1 &&(static_cast<void> (0))
1846 "This function is used in places that assume strings use char")(static_cast<void> (0));
1847 return StringRef(getStrDataAsChar(), getByteLength());
1848 }
1849
1850 /// Allow access to clients that need the byte representation, such as
1851 /// ASTWriterStmt::VisitStringLiteral().
1852 StringRef getBytes() const {
1853 // FIXME: StringRef may not be the right type to use as a result for this.
1854 return StringRef(getStrDataAsChar(), getByteLength());
1855 }
1856
1857 void outputString(raw_ostream &OS) const;
1858
1859 uint32_t getCodeUnit(size_t i) const {
1860 assert(i < getLength() && "out of bounds access")(static_cast<void> (0));
1861 switch (getCharByteWidth()) {
1862 case 1:
1863 return static_cast<unsigned char>(getStrDataAsChar()[i]);
1864 case 2:
1865 return getStrDataAsUInt16()[i];
1866 case 4:
1867 return getStrDataAsUInt32()[i];
1868 }
1869 llvm_unreachable("Unsupported character width!")__builtin_unreachable();
1870 }
1871
1872 unsigned getByteLength() const { return getCharByteWidth() * getLength(); }
1873 unsigned getLength() const { return *getTrailingObjects<unsigned>(); }
1874 unsigned getCharByteWidth() const { return StringLiteralBits.CharByteWidth; }
1875
1876 StringKind getKind() const {
1877 return static_cast<StringKind>(StringLiteralBits.Kind);
1878 }
1879
1880 bool isAscii() const { return getKind() == Ascii; }
1881 bool isWide() const { return getKind() == Wide; }
1882 bool isUTF8() const { return getKind() == UTF8; }
1883 bool isUTF16() const { return getKind() == UTF16; }
1884 bool isUTF32() const { return getKind() == UTF32; }
1885 bool isPascal() const { return StringLiteralBits.IsPascal; }
1886
1887 bool containsNonAscii() const {
1888 for (auto c : getString())
1889 if (!isASCII(c))
1890 return true;
1891 return false;
1892 }
1893
1894 bool containsNonAsciiOrNull() const {
1895 for (auto c : getString())
1896 if (!isASCII(c) || !c)
1897 return true;
1898 return false;
1899 }
1900
1901 /// getNumConcatenated - Get the number of string literal tokens that were
1902 /// concatenated in translation phase #6 to form this string literal.
1903 unsigned getNumConcatenated() const {
1904 return StringLiteralBits.NumConcatenated;
1905 }
1906
1907 /// Get one of the string literal token.
1908 SourceLocation getStrTokenLoc(unsigned TokNum) const {
1909 assert(TokNum < getNumConcatenated() && "Invalid tok number")(static_cast<void> (0));
1910 return getTrailingObjects<SourceLocation>()[TokNum];
1911 }
1912
1913 /// getLocationOfByte - Return a source location that points to the specified
1914 /// byte of this string literal.
1915 ///
1916 /// Strings are amazingly complex. They can be formed from multiple tokens
1917 /// and can have escape sequences in them in addition to the usual trigraph
1918 /// and escaped newline business. This routine handles this complexity.
1919 ///
1920 SourceLocation
1921 getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
1922 const LangOptions &Features, const TargetInfo &Target,
1923 unsigned *StartToken = nullptr,
1924 unsigned *StartTokenByteOffset = nullptr) const;
1925
1926 typedef const SourceLocation *tokloc_iterator;
1927
1928 tokloc_iterator tokloc_begin() const {
1929 return getTrailingObjects<SourceLocation>();
1930 }
1931
1932 tokloc_iterator tokloc_end() const {
1933 return getTrailingObjects<SourceLocation>() + getNumConcatenated();
1934 }
1935
1936 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return *tokloc_begin(); }
1937 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return *(tokloc_end() - 1); }
1938
1939 static bool classof(const Stmt *T) {
1940 return T->getStmtClass() == StringLiteralClass;
1941 }
1942
1943 // Iterators
1944 child_range children() {
1945 return child_range(child_iterator(), child_iterator());
1946 }
1947 const_child_range children() const {
1948 return const_child_range(const_child_iterator(), const_child_iterator());
1949 }
1950};
1951
1952/// [C99 6.4.2.2] - A predefined identifier such as __func__.
1953class PredefinedExpr final
1954 : public Expr,
1955 private llvm::TrailingObjects<PredefinedExpr, Stmt *> {
1956 friend class ASTStmtReader;
1957 friend TrailingObjects;
1958
1959 // PredefinedExpr is optionally followed by a single trailing
1960 // "Stmt *" for the predefined identifier. It is present if and only if
1961 // hasFunctionName() is true and is always a "StringLiteral *".
1962
1963public:
1964 enum IdentKind {
1965 Func,
1966 Function,
1967 LFunction, // Same as Function, but as wide string.
1968 FuncDName,
1969 FuncSig,
1970 LFuncSig, // Same as FuncSig, but as as wide string
1971 PrettyFunction,
1972 /// The same as PrettyFunction, except that the
1973 /// 'virtual' keyword is omitted for virtual member functions.
1974 PrettyFunctionNoVirtual
1975 };
1976
1977private:
1978 PredefinedExpr(SourceLocation L, QualType FNTy, IdentKind IK,
1979 StringLiteral *SL);
1980
1981 explicit PredefinedExpr(EmptyShell Empty, bool HasFunctionName);
1982
1983 /// True if this PredefinedExpr has storage for a function name.
1984 bool hasFunctionName() const { return PredefinedExprBits.HasFunctionName; }
1985
1986 void setFunctionName(StringLiteral *SL) {
1987 assert(hasFunctionName() &&(static_cast<void> (0))
1988 "This PredefinedExpr has no storage for a function name!")(static_cast<void> (0));
1989 *getTrailingObjects<Stmt *>() = SL;
1990 }
1991
1992public:
1993 /// Create a PredefinedExpr.
1994 static PredefinedExpr *Create(const ASTContext &Ctx, SourceLocation L,
1995 QualType FNTy, IdentKind IK, StringLiteral *SL);
1996
1997 /// Create an empty PredefinedExpr.
1998 static PredefinedExpr *CreateEmpty(const ASTContext &Ctx,
1999 bool HasFunctionName);
2000
2001 IdentKind getIdentKind() const {
2002 return static_cast<IdentKind>(PredefinedExprBits.Kind);
2003 }
2004
2005 SourceLocation getLocation() const { return PredefinedExprBits.Loc; }
2006 void setLocation(SourceLocation L) { PredefinedExprBits.Loc = L; }
2007
2008 StringLiteral *getFunctionName() {
2009 return hasFunctionName()
2010 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2011 : nullptr;
2012 }
2013
2014 const StringLiteral *getFunctionName() const {
2015 return hasFunctionName()
2016 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2017 : nullptr;
2018 }
2019
2020 static StringRef getIdentKindName(IdentKind IK);
2021 StringRef getIdentKindName() const {
2022 return getIdentKindName(getIdentKind());
2023 }
2024
2025 static std::string ComputeName(IdentKind IK, const Decl *CurrentDecl);
2026
2027 SourceLocation getBeginLoc() const { return getLocation(); }
2028 SourceLocation getEndLoc() const { return getLocation(); }
2029
2030 static bool classof(const Stmt *T) {
2031 return T->getStmtClass() == PredefinedExprClass;
2032 }
2033
2034 // Iterators
2035 child_range children() {
2036 return child_range(getTrailingObjects<Stmt *>(),
2037 getTrailingObjects<Stmt *>() + hasFunctionName());
2038 }
2039
2040 const_child_range children() const {
2041 return const_child_range(getTrailingObjects<Stmt *>(),
2042 getTrailingObjects<Stmt *>() + hasFunctionName());
2043 }
2044};
2045
2046// This represents a use of the __builtin_sycl_unique_stable_name, which takes a
2047// type-id, and at CodeGen time emits a unique string representation of the
2048// type in a way that permits us to properly encode information about the SYCL
2049// kernels.
2050class SYCLUniqueStableNameExpr final : public Expr {
2051 friend class ASTStmtReader;
2052 SourceLocation OpLoc, LParen, RParen;
2053 TypeSourceInfo *TypeInfo;
2054
2055 SYCLUniqueStableNameExpr(EmptyShell Empty, QualType ResultTy);
2056 SYCLUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen,
2057 SourceLocation RParen, QualType ResultTy,
2058 TypeSourceInfo *TSI);
2059
2060 void setTypeSourceInfo(TypeSourceInfo *Ty) { TypeInfo = Ty; }
2061
2062 void setLocation(SourceLocation L) { OpLoc = L; }
2063 void setLParenLocation(SourceLocation L) { LParen = L; }
2064 void setRParenLocation(SourceLocation L) { RParen = L; }
2065
2066public:
2067 TypeSourceInfo *getTypeSourceInfo() { return TypeInfo; }
2068
2069 const TypeSourceInfo *getTypeSourceInfo() const { return TypeInfo; }
2070
2071 static SYCLUniqueStableNameExpr *
2072 Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen,
2073 SourceLocation RParen, TypeSourceInfo *TSI);
2074
2075 static SYCLUniqueStableNameExpr *CreateEmpty(const ASTContext &Ctx);
2076
2077 SourceLocation getBeginLoc() const { return getLocation(); }
2078 SourceLocation getEndLoc() const { return RParen; }
2079 SourceLocation getLocation() const { return OpLoc; }
2080 SourceLocation getLParenLocation() const { return LParen; }
2081 SourceLocation getRParenLocation() const { return RParen; }
2082
2083 static bool classof(const Stmt *T) {
2084 return T->getStmtClass() == SYCLUniqueStableNameExprClass;
2085 }
2086
2087 // Iterators
2088 child_range children() {
2089 return child_range(child_iterator(), child_iterator());
2090 }
2091
2092 const_child_range children() const {
2093 return const_child_range(const_child_iterator(), const_child_iterator());
2094 }
2095
2096 // Convenience function to generate the name of the currently stored type.
2097 std::string ComputeName(ASTContext &Context) const;
2098
2099 // Get the generated name of the type. Note that this only works after all
2100 // kernels have been instantiated.
2101 static std::string ComputeName(ASTContext &Context, QualType Ty);
2102};
2103
2104/// ParenExpr - This represents a parethesized expression, e.g. "(1)". This
2105/// AST node is only formed if full location information is requested.
2106class ParenExpr : public Expr {
2107 SourceLocation L, R;
2108 Stmt *Val;
2109public:
2110 ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
2111 : Expr(ParenExprClass, val->getType(), val->getValueKind(),
2112 val->getObjectKind()),
2113 L(l), R(r), Val(val) {
2114 setDependence(computeDependence(this));
2115 }
2116
2117 /// Construct an empty parenthesized expression.
2118 explicit ParenExpr(EmptyShell Empty)
2119 : Expr(ParenExprClass, Empty) { }
2120
2121 const Expr *getSubExpr() const { return cast<Expr>(Val); }
2122 Expr *getSubExpr() { return cast<Expr>(Val); }
2123 void setSubExpr(Expr *E) { Val = E; }
2124
2125 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return L; }
2126 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return R; }
2127
2128 /// Get the location of the left parentheses '('.
2129 SourceLocation getLParen() const { return L; }
2130 void setLParen(SourceLocation Loc) { L = Loc; }
2131
2132 /// Get the location of the right parentheses ')'.
2133 SourceLocation getRParen() const { return R; }
2134 void setRParen(SourceLocation Loc) { R = Loc; }
2135
2136 static bool classof(const Stmt *T) {
2137 return T->getStmtClass() == ParenExprClass;
2138 }
2139
2140 // Iterators
2141 child_range children() { return child_range(&Val, &Val+1); }
2142 const_child_range children() const {
2143 return const_child_range(&Val, &Val + 1);
2144 }
2145};
2146
2147/// UnaryOperator - This represents the unary-expression's (except sizeof and
2148/// alignof), the postinc/postdec operators from postfix-expression, and various
2149/// extensions.
2150///
2151/// Notes on various nodes:
2152///
2153/// Real/Imag - These return the real/imag part of a complex operand. If
2154/// applied to a non-complex value, the former returns its operand and the
2155/// later returns zero in the type of the operand.
2156///
2157class UnaryOperator final
2158 : public Expr,
2159 private llvm::TrailingObjects<UnaryOperator, FPOptionsOverride> {
2160 Stmt *Val;
2161
2162 size_t numTrailingObjects(OverloadToken<FPOptionsOverride>) const {
2163 return UnaryOperatorBits.HasFPFeatures ? 1 : 0;
2164 }
2165
2166 FPOptionsOverride &getTrailingFPFeatures() {
2167 assert(UnaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
2168 return *getTrailingObjects<FPOptionsOverride>();
2169 }
2170
2171 const FPOptionsOverride &getTrailingFPFeatures() const {
2172 assert(UnaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
2173 return *getTrailingObjects<FPOptionsOverride>();
2174 }
2175
2176public:
2177 typedef UnaryOperatorKind Opcode;
2178
2179protected:
2180 UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type,
2181 ExprValueKind VK, ExprObjectKind OK, SourceLocation l,
2182 bool CanOverflow, FPOptionsOverride FPFeatures);
2183
2184 /// Build an empty unary operator.
2185 explicit UnaryOperator(bool HasFPFeatures, EmptyShell Empty)
2186 : Expr(UnaryOperatorClass, Empty) {
2187 UnaryOperatorBits.Opc = UO_AddrOf;
2188 UnaryOperatorBits.HasFPFeatures = HasFPFeatures;
2189 }
2190
2191public:
2192 static UnaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
2193
2194 static UnaryOperator *Create(const ASTContext &C, Expr *input, Opcode opc,
2195 QualType type, ExprValueKind VK,
2196 ExprObjectKind OK, SourceLocation l,
2197 bool CanOverflow, FPOptionsOverride FPFeatures);
2198
2199 Opcode getOpcode() const {
2200 return static_cast<Opcode>(UnaryOperatorBits.Opc);
2201 }
2202 void setOpcode(Opcode Opc) { UnaryOperatorBits.Opc = Opc; }
2203
2204 Expr *getSubExpr() const { return cast<Expr>(Val); }
2205 void setSubExpr(Expr *E) { Val = E; }
2206
2207 /// getOperatorLoc - Return the location of the operator.
2208 SourceLocation getOperatorLoc() const { return UnaryOperatorBits.Loc; }
2209 void setOperatorLoc(SourceLocation L) { UnaryOperatorBits.Loc = L; }
2210
2211 /// Returns true if the unary operator can cause an overflow. For instance,
2212 /// signed int i = INT_MAX; i++;
2213 /// signed char c = CHAR_MAX; c++;
2214 /// Due to integer promotions, c++ is promoted to an int before the postfix
2215 /// increment, and the result is an int that cannot overflow. However, i++
2216 /// can overflow.
2217 bool canOverflow() const { return UnaryOperatorBits.CanOverflow; }
2218 void setCanOverflow(bool C) { UnaryOperatorBits.CanOverflow = C; }
2219
2220 // Get the FP contractability status of this operator. Only meaningful for
2221 // operations on floating point types.
2222 bool isFPContractableWithinStatement(const LangOptions &LO) const {
2223 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement();
2224 }
2225
2226 // Get the FENV_ACCESS status of this operator. Only meaningful for
2227 // operations on floating point types.
2228 bool isFEnvAccessOn(const LangOptions &LO) const {
2229 return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
2230 }
2231
2232 /// isPostfix - Return true if this is a postfix operation, like x++.
2233 static bool isPostfix(Opcode Op) {
2234 return Op == UO_PostInc || Op == UO_PostDec;
2235 }
2236
2237 /// isPrefix - Return true if this is a prefix operation, like --x.
2238 static bool isPrefix(Opcode Op) {
2239 return Op == UO_PreInc || Op == UO_PreDec;
2240 }
2241
2242 bool isPrefix() const { return isPrefix(getOpcode()); }
2243 bool isPostfix() const { return isPostfix(getOpcode()); }
2244
2245 static bool isIncrementOp(Opcode Op) {
2246 return Op == UO_PreInc || Op == UO_PostInc;
2247 }
2248 bool isIncrementOp() const {
2249 return isIncrementOp(getOpcode());
2250 }
2251
2252 static bool isDecrementOp(Opcode Op) {
2253 return Op == UO_PreDec || Op == UO_PostDec;
2254 }
2255 bool isDecrementOp() const {
2256 return isDecrementOp(getOpcode());
2257 }
2258
2259 static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; }
2260 bool isIncrementDecrementOp() const {
2261 return isIncrementDecrementOp(getOpcode());
2262 }
2263
2264 static bool isArithmeticOp(Opcode Op) {
2265 return Op >= UO_Plus && Op <= UO_LNot;
2266 }
2267 bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); }
2268
2269 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
2270 /// corresponds to, e.g. "sizeof" or "[pre]++"
2271 static StringRef getOpcodeStr(Opcode Op);
2272
2273 /// Retrieve the unary opcode that corresponds to the given
2274 /// overloaded operator.
2275 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix);
2276
2277 /// Retrieve the overloaded operator kind that corresponds to
2278 /// the given unary opcode.
2279 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
2280
2281 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
2282 return isPostfix() ? Val->getBeginLoc() : getOperatorLoc();
2283 }
2284 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
2285 return isPostfix() ? getOperatorLoc() : Val->getEndLoc();
2286 }
2287 SourceLocation getExprLoc() const { return getOperatorLoc(); }
2288
2289 static bool classof(const Stmt *T) {
2290 return T->getStmtClass() == UnaryOperatorClass;
2291 }
2292
2293 // Iterators
2294 child_range children() { return child_range(&Val, &Val+1); }
2295 const_child_range children() const {
2296 return const_child_range(&Val, &Val + 1);
2297 }
2298
2299 /// Is FPFeatures in Trailing Storage?
2300 bool hasStoredFPFeatures() const { return UnaryOperatorBits.HasFPFeatures; }
2301
2302 /// Get FPFeatures from trailing storage.
2303 FPOptionsOverride getStoredFPFeatures() const {
2304 return getTrailingFPFeatures();
2305 }
2306
2307protected:
2308 /// Set FPFeatures in trailing storage, used only by Serialization
2309 void setStoredFPFeatures(FPOptionsOverride F) { getTrailingFPFeatures() = F; }
2310
2311public:
2312 // Get the FP features status of this operator. Only meaningful for
2313 // operations on floating point types.
2314 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
2315 if (UnaryOperatorBits.HasFPFeatures)
2316 return getStoredFPFeatures().applyOverrides(LO);
2317 return FPOptions::defaultWithoutTrailingStorage(LO);
2318 }
2319 FPOptionsOverride getFPOptionsOverride() const {
2320 if (UnaryOperatorBits.HasFPFeatures)
2321 return getStoredFPFeatures();
2322 return FPOptionsOverride();
2323 }
2324
2325 friend TrailingObjects;
2326 friend class ASTReader;
2327 friend class ASTStmtReader;
2328 friend class ASTStmtWriter;
2329};
2330
2331/// Helper class for OffsetOfExpr.
2332
2333// __builtin_offsetof(type, identifier(.identifier|[expr])*)
2334class OffsetOfNode {
2335public:
2336 /// The kind of offsetof node we have.
2337 enum Kind {
2338 /// An index into an array.
2339 Array = 0x00,
2340 /// A field.
2341 Field = 0x01,
2342 /// A field in a dependent type, known only by its name.
2343 Identifier = 0x02,
2344 /// An implicit indirection through a C++ base class, when the
2345 /// field found is in a base class.
2346 Base = 0x03
2347 };
2348
2349private:
2350 enum { MaskBits = 2, Mask = 0x03 };
2351
2352 /// The source range that covers this part of the designator.
2353 SourceRange Range;
2354
2355 /// The data describing the designator, which comes in three
2356 /// different forms, depending on the lower two bits.
2357 /// - An unsigned index into the array of Expr*'s stored after this node
2358 /// in memory, for [constant-expression] designators.
2359 /// - A FieldDecl*, for references to a known field.
2360 /// - An IdentifierInfo*, for references to a field with a given name
2361 /// when the class type is dependent.
2362 /// - A CXXBaseSpecifier*, for references that look at a field in a
2363 /// base class.
2364 uintptr_t Data;
2365
2366public:
2367 /// Create an offsetof node that refers to an array element.
2368 OffsetOfNode(SourceLocation LBracketLoc, unsigned Index,
2369 SourceLocation RBracketLoc)
2370 : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {}
2371
2372 /// Create an offsetof node that refers to a field.
2373 OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc)
2374 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2375 Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {}
2376
2377 /// Create an offsetof node that refers to an identifier.
2378 OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name,
2379 SourceLocation NameLoc)
2380 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2381 Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {}
2382
2383 /// Create an offsetof node that refers into a C++ base class.
2384 explicit OffsetOfNode(const CXXBaseSpecifier *Base)
2385 : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {}
2386
2387 /// Determine what kind of offsetof node this is.
2388 Kind getKind() const { return static_cast<Kind>(Data & Mask); }
2389
2390 /// For an array element node, returns the index into the array
2391 /// of expressions.
2392 unsigned getArrayExprIndex() const {
2393 assert(getKind() == Array)(static_cast<void> (0));
2394 return Data >> 2;
2395 }
2396
2397 /// For a field offsetof node, returns the field.
2398 FieldDecl *getField() const {
2399 assert(getKind() == Field)(static_cast<void> (0));
2400 return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask);
2401 }
2402
2403 /// For a field or identifier offsetof node, returns the name of
2404 /// the field.
2405 IdentifierInfo *getFieldName() const;
2406
2407 /// For a base class node, returns the base specifier.
2408 CXXBaseSpecifier *getBase() const {
2409 assert(getKind() == Base)(static_cast<void> (0));
2410 return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask);
2411 }
2412
2413 /// Retrieve the source range that covers this offsetof node.
2414 ///
2415 /// For an array element node, the source range contains the locations of
2416 /// the square brackets. For a field or identifier node, the source range
2417 /// contains the location of the period (if there is one) and the
2418 /// identifier.
2419 SourceRange getSourceRange() const LLVM_READONLY__attribute__((__pure__)) { return Range; }
2420 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return Range.getBegin(); }
2421 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return Range.getEnd(); }
2422};
2423
2424/// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
2425/// offsetof(record-type, member-designator). For example, given:
2426/// @code
2427/// struct S {
2428/// float f;
2429/// double d;
2430/// };
2431/// struct T {
2432/// int i;
2433/// struct S s[10];
2434/// };
2435/// @endcode
2436/// we can represent and evaluate the expression @c offsetof(struct T, s[2].d).
2437
2438class OffsetOfExpr final
2439 : public Expr,
2440 private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> {
2441 SourceLocation OperatorLoc, RParenLoc;
2442 // Base type;
2443 TypeSourceInfo *TSInfo;
2444 // Number of sub-components (i.e. instances of OffsetOfNode).
2445 unsigned NumComps;
2446 // Number of sub-expressions (i.e. array subscript expressions).
2447 unsigned NumExprs;
2448
2449 size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const {
2450 return NumComps;
2451 }
2452
2453 OffsetOfExpr(const ASTContext &C, QualType type,
2454 SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2455 ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs,
2456 SourceLocation RParenLoc);
2457
2458 explicit OffsetOfExpr(unsigned numComps, unsigned numExprs)
2459 : Expr(OffsetOfExprClass, EmptyShell()),
2460 TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {}
2461
2462public:
2463
2464 static OffsetOfExpr *Create(const ASTContext &C, QualType type,
2465 SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2466 ArrayRef<OffsetOfNode> comps,
2467 ArrayRef<Expr*> exprs, SourceLocation RParenLoc);
2468
2469 static OffsetOfExpr *CreateEmpty(const ASTContext &C,
2470 unsigned NumComps, unsigned NumExprs);
2471
2472 /// getOperatorLoc - Return the location of the operator.
2473 SourceLocation getOperatorLoc() const { return OperatorLoc; }
2474 void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
2475
2476 /// Return the location of the right parentheses.
2477 SourceLocation getRParenLoc() const { return RParenLoc; }
2478 void setRParenLoc(SourceLocation R) { RParenLoc = R; }
2479
2480 TypeSourceInfo *getTypeSourceInfo() const {
2481 return TSInfo;
2482 }
2483 void setTypeSourceInfo(TypeSourceInfo *tsi) {
2484 TSInfo = tsi;
2485 }
2486
2487 const OffsetOfNode &getComponent(unsigned Idx) const {
2488 assert(Idx < NumComps && "Subscript out of range")(static_cast<void> (0));
2489 return getTrailingObjects<OffsetOfNode>()[Idx];
2490 }
2491
2492 void setComponent(unsigned Idx, OffsetOfNode ON) {
2493 assert(Idx < NumComps && "Subscript out of range")(static_cast<void> (0));
2494 getTrailingObjects<OffsetOfNode>()[Idx] = ON;
2495 }
2496
2497 unsigned getNumComponents() const {
2498 return NumComps;
2499 }
2500
2501 Expr* getIndexExpr(unsigned Idx) {
2502 assert(Idx < NumExprs && "Subscript out of range")(static_cast<void> (0));
2503 return getTrailingObjects<Expr *>()[Idx];
2504 }
2505
2506 const Expr *getIndexExpr(unsigned Idx) const {
2507 assert(Idx < NumExprs && "Subscript out of range")(static_cast<void> (0));
2508 return getTrailingObjects<Expr *>()[Idx];
2509 }
2510
2511 void setIndexExpr(unsigned Idx, Expr* E) {
2512 assert(Idx < NumComps && "Subscript out of range")(static_cast<void> (0));
2513 getTrailingObjects<Expr *>()[Idx] = E;
2514 }
2515
2516 unsigned getNumExpressions() const {
2517 return NumExprs;
2518 }
2519
2520 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return OperatorLoc; }
2521 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
2522
2523 static bool classof(const Stmt *T) {
2524 return T->getStmtClass() == OffsetOfExprClass;
2525 }
2526
2527 // Iterators
2528 child_range children() {
2529 Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
2530 return child_range(begin, begin + NumExprs);
2531 }
2532 const_child_range children() const {
2533 Stmt *const *begin =
2534 reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
2535 return const_child_range(begin, begin + NumExprs);
2536 }
2537 friend TrailingObjects;
2538};
2539
2540/// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated)
2541/// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and
2542/// vec_step (OpenCL 1.1 6.11.12).
2543class UnaryExprOrTypeTraitExpr : public Expr {
2544 union {
2545 TypeSourceInfo *Ty;
2546 Stmt *Ex;
2547 } Argument;
2548 SourceLocation OpLoc, RParenLoc;
2549
2550public:
2551 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo,
2552 QualType resultType, SourceLocation op,
2553 SourceLocation rp)
2554 : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue,
2555 OK_Ordinary),
2556 OpLoc(op), RParenLoc(rp) {
2557 assert(ExprKind <= UETT_Last && "invalid enum value!")(static_cast<void> (0));
2558 UnaryExprOrTypeTraitExprBits.Kind = ExprKind;
2559 assert(static_cast<unsigned>(ExprKind) ==(static_cast<void> (0))
2560 UnaryExprOrTypeTraitExprBits.Kind &&(static_cast<void> (0))
2561 "UnaryExprOrTypeTraitExprBits.Kind overflow!")(static_cast<void> (0));
2562 UnaryExprOrTypeTraitExprBits.IsType = true;
2563 Argument.Ty = TInfo;
2564 setDependence(computeDependence(this));
2565 }
2566
2567 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E,
2568 QualType resultType, SourceLocation op,
2569 SourceLocation rp);
2570
2571 /// Construct an empty sizeof/alignof expression.
2572 explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty)
2573 : Expr(UnaryExprOrTypeTraitExprClass, Empty) { }
2574
2575 UnaryExprOrTypeTrait getKind() const {
2576 return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind);
2577 }
2578 void setKind(UnaryExprOrTypeTrait K) {
2579 assert(K <= UETT_Last && "invalid enum value!")(static_cast<void> (0));
2580 UnaryExprOrTypeTraitExprBits.Kind = K;
2581 assert(static_cast<unsigned>(K) == UnaryExprOrTypeTraitExprBits.Kind &&(static_cast<void> (0))
2582 "UnaryExprOrTypeTraitExprBits.Kind overflow!")(static_cast<void> (0));
2583 }
2584
2585 bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; }
2586 QualType getArgumentType() const {
2587 return getArgumentTypeInfo()->getType();
2588 }
2589 TypeSourceInfo *getArgumentTypeInfo() const {
2590 assert(isArgumentType() && "calling getArgumentType() when arg is expr")(static_cast<void> (0));
2591 return Argument.Ty;
2592 }
2593 Expr *getArgumentExpr() {
2594 assert(!isArgumentType() && "calling getArgumentExpr() when arg is type")(static_cast<void> (0));
2595 return static_cast<Expr*>(Argument.Ex);
2596 }
2597 const Expr *getArgumentExpr() const {
2598 return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr();
2599 }
2600
2601 void setArgument(Expr *E) {
2602 Argument.Ex = E;
2603 UnaryExprOrTypeTraitExprBits.IsType = false;
2604 }
2605 void setArgument(TypeSourceInfo *TInfo) {
2606 Argument.Ty = TInfo;
2607 UnaryExprOrTypeTraitExprBits.IsType = true;
2608 }
2609
2610 /// Gets the argument type, or the type of the argument expression, whichever
2611 /// is appropriate.
2612 QualType getTypeOfArgument() const {
2613 return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType();
2614 }
2615
2616 SourceLocation getOperatorLoc() const { return OpLoc; }
2617 void setOperatorLoc(SourceLocation L) { OpLoc = L; }
2618
2619 SourceLocation getRParenLoc() const { return RParenLoc; }
2620 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2621
2622 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return OpLoc; }
2623 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
2624
2625 static bool classof(const Stmt *T) {
2626 return T->getStmtClass() == UnaryExprOrTypeTraitExprClass;
2627 }
2628
2629 // Iterators
2630 child_range children();
2631 const_child_range children() const;
2632};
2633
2634//===----------------------------------------------------------------------===//
2635// Postfix Operators.
2636//===----------------------------------------------------------------------===//
2637
2638/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
2639class ArraySubscriptExpr : public Expr {
2640 enum { LHS, RHS, END_EXPR };
2641 Stmt *SubExprs[END_EXPR];
2642
2643 bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); }
2644
2645public:
2646 ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, ExprValueKind VK,
2647 ExprObjectKind OK, SourceLocation rbracketloc)
2648 : Expr(ArraySubscriptExprClass, t, VK, OK) {
2649 SubExprs[LHS] = lhs;
2650 SubExprs[RHS] = rhs;
2651 ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc;
2652 setDependence(computeDependence(this));
2653 }
2654
2655 /// Create an empty array subscript expression.
2656 explicit ArraySubscriptExpr(EmptyShell Shell)
2657 : Expr(ArraySubscriptExprClass, Shell) { }
2658
2659 /// An array access can be written A[4] or 4[A] (both are equivalent).
2660 /// - getBase() and getIdx() always present the normalized view: A[4].
2661 /// In this case getBase() returns "A" and getIdx() returns "4".
2662 /// - getLHS() and getRHS() present the syntactic view. e.g. for
2663 /// 4[A] getLHS() returns "4".
2664 /// Note: Because vector element access is also written A[4] we must
2665 /// predicate the format conversion in getBase and getIdx only on the
2666 /// the type of the RHS, as it is possible for the LHS to be a vector of
2667 /// integer type
2668 Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
2669 const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
2670 void setLHS(Expr *E) { SubExprs[LHS] = E; }
2671
2672 Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
2673 const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
2674 void setRHS(Expr *E) { SubExprs[RHS] = E; }
2675
2676 Expr *getBase() { return lhsIsBase() ? getLHS() : getRHS(); }
2677 const Expr *getBase() const { return lhsIsBase() ? getLHS() : getRHS(); }
2678
2679 Expr *getIdx() { return lhsIsBase() ? getRHS() : getLHS(); }
2680 const Expr *getIdx() const { return lhsIsBase() ? getRHS() : getLHS(); }
2681
2682 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
2683 return getLHS()->getBeginLoc();
2684 }
2685 SourceLocation getEndLoc() const { return getRBracketLoc(); }
2686
2687 SourceLocation getRBracketLoc() const {
2688 return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2689 }
2690 void setRBracketLoc(SourceLocation L) {
2691 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2692 }
2693
2694 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__)) {
2695 return getBase()->getExprLoc();
2696 }
2697
2698 static bool classof(const Stmt *T) {
2699 return T->getStmtClass() == ArraySubscriptExprClass;
2700 }
2701
2702 // Iterators
2703 child_range children() {
2704 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2705 }
2706 const_child_range children() const {
2707 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2708 }
2709};
2710
2711/// MatrixSubscriptExpr - Matrix subscript expression for the MatrixType
2712/// extension.
2713/// MatrixSubscriptExpr can be either incomplete (only Base and RowIdx are set
2714/// so far, the type is IncompleteMatrixIdx) or complete (Base, RowIdx and
2715/// ColumnIdx refer to valid expressions). Incomplete matrix expressions only
2716/// exist during the initial construction of the AST.
2717class MatrixSubscriptExpr : public Expr {
2718 enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR };
2719 Stmt *SubExprs[END_EXPR];
2720
2721public:
2722 MatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, QualType T,
2723 SourceLocation RBracketLoc)
2724 : Expr(MatrixSubscriptExprClass, T, Base->getValueKind(),
2725 OK_MatrixComponent) {
2726 SubExprs[BASE] = Base;
2727 SubExprs[ROW_IDX] = RowIdx;
2728 SubExprs[COLUMN_IDX] = ColumnIdx;
2729 ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc;
2730 setDependence(computeDependence(this));
2731 }
2732
2733 /// Create an empty matrix subscript expression.
2734 explicit MatrixSubscriptExpr(EmptyShell Shell)
2735 : Expr(MatrixSubscriptExprClass, Shell) {}
2736
2737 bool isIncomplete() const {
2738 bool IsIncomplete = hasPlaceholderType(BuiltinType::IncompleteMatrixIdx);
2739 assert((SubExprs[COLUMN_IDX] || IsIncomplete) &&(static_cast<void> (0))
2740 "expressions without column index must be marked as incomplete")(static_cast<void> (0));
2741 return IsIncomplete;
2742 }
2743 Expr *getBase() { return cast<Expr>(SubExprs[BASE]); }
2744 const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); }
2745 void setBase(Expr *E) { SubExprs[BASE] = E; }
2746
2747 Expr *getRowIdx() { return cast<Expr>(SubExprs[ROW_IDX]); }
2748 const Expr *getRowIdx() const { return cast<Expr>(SubExprs[ROW_IDX]); }
2749 void setRowIdx(Expr *E) { SubExprs[ROW_IDX] = E; }
2750
2751 Expr *getColumnIdx() { return cast_or_null<Expr>(SubExprs[COLUMN_IDX]); }
2752 const Expr *getColumnIdx() const {
2753 assert(!isIncomplete() &&(static_cast<void> (0))
2754 "cannot get the column index of an incomplete expression")(static_cast<void> (0));
2755 return cast<Expr>(SubExprs[COLUMN_IDX]);
2756 }
2757 void setColumnIdx(Expr *E) { SubExprs[COLUMN_IDX] = E; }
2758
2759 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
2760 return getBase()->getBeginLoc();
2761 }
2762
2763 SourceLocation getEndLoc() const { return getRBracketLoc(); }
2764
2765 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__)) {
2766 return getBase()->getExprLoc();
2767 }
2768
2769 SourceLocation getRBracketLoc() const {
2770 return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2771 }
2772 void setRBracketLoc(SourceLocation L) {
2773 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2774 }
2775
2776 static bool classof(const Stmt *T) {
2777 return T->getStmtClass() == MatrixSubscriptExprClass;
2778 }
2779
2780 // Iterators
2781 child_range children() {
2782 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2783 }
2784 const_child_range children() const {
2785 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2786 }
2787};
2788
2789/// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
2790/// CallExpr itself represents a normal function call, e.g., "f(x, 2)",
2791/// while its subclasses may represent alternative syntax that (semantically)
2792/// results in a function call. For example, CXXOperatorCallExpr is
2793/// a subclass for overloaded operator calls that use operator syntax, e.g.,
2794/// "str1 + str2" to resolve to a function call.
2795class CallExpr : public Expr {
2796 enum { FN = 0, PREARGS_START = 1 };
2797
2798 /// The number of arguments in the call expression.
2799 unsigned NumArgs;
2800
2801 /// The location of the right parenthese. This has a different meaning for
2802 /// the derived classes of CallExpr.
2803 SourceLocation RParenLoc;
2804
2805 // CallExpr store some data in trailing objects. However since CallExpr
2806 // is used a base of other expression classes we cannot use
2807 // llvm::TrailingObjects. Instead we manually perform the pointer arithmetic
2808 // and casts.
2809 //
2810 // The trailing objects are in order:
2811 //
2812 // * A single "Stmt *" for the callee expression.
2813 //
2814 // * An array of getNumPreArgs() "Stmt *" for the pre-argument expressions.
2815 //
2816 // * An array of getNumArgs() "Stmt *" for the argument expressions.
2817 //
2818 // * An optional of type FPOptionsOverride.
2819 //
2820 // Note that we store the offset in bytes from the this pointer to the start
2821 // of the trailing objects. It would be perfectly possible to compute it
2822 // based on the dynamic kind of the CallExpr. However 1.) we have plenty of
2823 // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to
2824 // compute this once and then load the offset from the bit-fields of Stmt,
2825 // instead of re-computing the offset each time the trailing objects are
2826 // accessed.
2827
2828 /// Return a pointer to the start of the trailing array of "Stmt *".
2829 Stmt **getTrailingStmts() {
2830 return reinterpret_cast<Stmt **>(reinterpret_cast<char *>(this) +
2831 CallExprBits.OffsetToTrailingObjects);
2832 }
2833 Stmt *const *getTrailingStmts() const {
2834 return const_cast<CallExpr *>(this)->getTrailingStmts();
2835 }
2836
2837 /// Map a statement class to the appropriate offset in bytes from the
2838 /// this pointer to the trailing objects.
2839 static unsigned offsetToTrailingObjects(StmtClass SC);
2840
2841 unsigned getSizeOfTrailingStmts() const {
2842 return (1 + getNumPreArgs() + getNumArgs()) * sizeof(Stmt *);
2843 }
2844
2845 size_t getOffsetOfTrailingFPFeatures() const {
2846 assert(hasStoredFPFeatures())(static_cast<void> (0));
2847 return CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts();
2848 }
2849
2850public:
2851 enum class ADLCallKind : bool { NotADL, UsesADL };
2852 static constexpr ADLCallKind NotADL = ADLCallKind::NotADL;
2853 static constexpr ADLCallKind UsesADL = ADLCallKind::UsesADL;
2854
2855protected:
2856 /// Build a call expression, assuming that appropriate storage has been
2857 /// allocated for the trailing objects.
2858 CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs,
2859 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
2860 SourceLocation RParenLoc, FPOptionsOverride FPFeatures,
2861 unsigned MinNumArgs, ADLCallKind UsesADL);
2862
2863 /// Build an empty call expression, for deserialization.
2864 CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs,
2865 bool hasFPFeatures, EmptyShell Empty);
2866
2867 /// Return the size in bytes needed for the trailing objects.
2868 /// Used by the derived classes to allocate the right amount of storage.
2869 static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs,
2870 bool HasFPFeatures) {
2871 return (1 + NumPreArgs + NumArgs) * sizeof(Stmt *) +
2872 HasFPFeatures * sizeof(FPOptionsOverride);
2873 }
2874
2875 Stmt *getPreArg(unsigned I) {
2876 assert(I < getNumPreArgs() && "Prearg access out of range!")(static_cast<void> (0));
2877 return getTrailingStmts()[PREARGS_START + I];
2878 }
2879 const Stmt *getPreArg(unsigned I) const {
2880 assert(I < getNumPreArgs() && "Prearg access out of range!")(static_cast<void> (0));
2881 return getTrailingStmts()[PREARGS_START + I];
2882 }
2883 void setPreArg(unsigned I, Stmt *PreArg) {
2884 assert(I < getNumPreArgs() && "Prearg access out of range!")(static_cast<void> (0));
2885 getTrailingStmts()[PREARGS_START + I] = PreArg;
2886 }
2887
2888 unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; }
2889
2890 /// Return a pointer to the trailing FPOptions
2891 FPOptionsOverride *getTrailingFPFeatures() {
2892 assert(hasStoredFPFeatures())(static_cast<void> (0));
2893 return reinterpret_cast<FPOptionsOverride *>(
2894 reinterpret_cast<char *>(this) + CallExprBits.OffsetToTrailingObjects +
2895 getSizeOfTrailingStmts());
2896 }
2897 const FPOptionsOverride *getTrailingFPFeatures() const {
2898 assert(hasStoredFPFeatures())(static_cast<void> (0));
2899 return reinterpret_cast<const FPOptionsOverride *>(
2900 reinterpret_cast<const char *>(this) +
2901 CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts());
2902 }
2903
2904public:
2905 /// Create a call expression.
2906 /// \param Fn The callee expression,
2907 /// \param Args The argument array,
2908 /// \param Ty The type of the call expression (which is *not* the return
2909 /// type in general),
2910 /// \param VK The value kind of the call expression (lvalue, rvalue, ...),
2911 /// \param RParenLoc The location of the right parenthesis in the call
2912 /// expression.
2913 /// \param FPFeatures Floating-point features associated with the call,
2914 /// \param MinNumArgs Specifies the minimum number of arguments. The actual
2915 /// number of arguments will be the greater of Args.size()
2916 /// and MinNumArgs. This is used in a few places to allocate
2917 /// enough storage for the default arguments.
2918 /// \param UsesADL Specifies whether the callee was found through
2919 /// argument-dependent lookup.
2920 ///
2921 /// Note that you can use CreateTemporary if you need a temporary call
2922 /// expression on the stack.
2923 static CallExpr *Create(const ASTContext &Ctx, Expr *Fn,
2924 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
2925 SourceLocation RParenLoc,
2926 FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0,
2927 ADLCallKind UsesADL = NotADL);
2928
2929 /// Create a temporary call expression with no arguments in the memory
2930 /// pointed to by Mem. Mem must points to at least sizeof(CallExpr)
2931 /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr):
2932 ///
2933 /// \code{.cpp}
2934 /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)];
2935 /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc);
2936 /// \endcode
2937 static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty,
2938 ExprValueKind VK, SourceLocation RParenLoc,
2939 ADLCallKind UsesADL = NotADL);
2940
2941 /// Create an empty call expression, for deserialization.
2942 static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs,
2943 bool HasFPFeatures, EmptyShell Empty);
2944
2945 Expr *getCallee() { return cast<Expr>(getTrailingStmts()[FN]); }
2946 const Expr *getCallee() const { return cast<Expr>(getTrailingStmts()[FN]); }
2947 void setCallee(Expr *F) { getTrailingStmts()[FN] = F; }
2948
2949 ADLCallKind getADLCallKind() const {
2950 return static_cast<ADLCallKind>(CallExprBits.UsesADL);
2951 }
2952 void setADLCallKind(ADLCallKind V = UsesADL) {
2953 CallExprBits.UsesADL = static_cast<bool>(V);
2954 }
2955 bool usesADL() const { return getADLCallKind() == UsesADL; }
2956
2957 bool hasStoredFPFeatures() const { return CallExprBits.HasFPFeatures; }
2958
2959 Decl *getCalleeDecl() { return getCallee()->getReferencedDeclOfCallee(); }
2960 const Decl *getCalleeDecl() const {
2961 return getCallee()->getReferencedDeclOfCallee();
2962 }
2963
2964 /// If the callee is a FunctionDecl, return it. Otherwise return null.
2965 FunctionDecl *getDirectCallee() {
2966 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2967 }
2968 const FunctionDecl *getDirectCallee() const {
2969 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2970 }
2971
2972 /// getNumArgs - Return the number of actual arguments to this call.
2973 unsigned getNumArgs() const { return NumArgs; }
2974
2975 /// Retrieve the call arguments.
2976 Expr **getArgs() {
2977 return reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START +
2978 getNumPreArgs());
2979 }
2980 const Expr *const *getArgs() const {
2981 return reinterpret_cast<const Expr *const *>(
2982 getTrailingStmts() + PREARGS_START + getNumPreArgs());
2983 }
2984
2985 /// getArg - Return the specified argument.
2986 Expr *getArg(unsigned Arg) {
2987 assert(Arg < getNumArgs() && "Arg access out of range!")(static_cast<void> (0));
2988 return getArgs()[Arg];
2989 }
2990 const Expr *getArg(unsigned Arg) const {
2991 assert(Arg < getNumArgs() && "Arg access out of range!")(static_cast<void> (0));
2992 return getArgs()[Arg];
2993 }
2994
2995 /// setArg - Set the specified argument.
2996 /// ! the dependence bits might be stale after calling this setter, it is
2997 /// *caller*'s responsibility to recompute them by calling
2998 /// computeDependence().
2999 void setArg(unsigned Arg, Expr *ArgExpr) {
3000 assert(Arg < getNumArgs() && "Arg access out of range!")(static_cast<void> (0));
3001 getArgs()[Arg] = ArgExpr;
3002 }
3003
3004 /// Compute and set dependence bits.
3005 void computeDependence() {
3006 setDependence(clang::computeDependence(
3007 this, llvm::makeArrayRef(
3008 reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START),
3009 getNumPreArgs())));
3010 }
3011
3012 /// Reduce the number of arguments in this call expression. This is used for
3013 /// example during error recovery to drop extra arguments. There is no way
3014 /// to perform the opposite because: 1.) We don't track how much storage
3015 /// we have for the argument array 2.) This would potentially require growing
3016 /// the argument array, something we cannot support since the arguments are
3017 /// stored in a trailing array.
3018 void shrinkNumArgs(unsigned NewNumArgs) {
3019 assert((NewNumArgs <= getNumArgs()) &&(static_cast<void> (0))
3020 "shrinkNumArgs cannot increase the number of arguments!")(static_cast<void> (0));
3021 NumArgs = NewNumArgs;
3022 }
3023
3024 /// Bluntly set a new number of arguments without doing any checks whatsoever.
3025 /// Only used during construction of a CallExpr in a few places in Sema.
3026 /// FIXME: Find a way to remove it.
3027 void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; }
3028
3029 typedef ExprIterator arg_iterator;
3030 typedef ConstExprIterator const_arg_iterator;
3031 typedef llvm::iterator_range<arg_iterator> arg_range;
3032 typedef llvm::iterator_range<const_arg_iterator> const_arg_range;
3033
3034 arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
3035 const_arg_range arguments() const {
3036 return const_arg_range(arg_begin(), arg_end());
3037 }
3038
3039 arg_iterator arg_begin() {
3040 return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3041 }
3042 arg_iterator arg_end() { return arg_begin() + getNumArgs(); }
3043
3044 const_arg_iterator arg_begin() const {
3045 return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3046 }
3047 const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); }
3048
3049 /// This method provides fast access to all the subexpressions of
3050 /// a CallExpr without going through the slower virtual child_iterator
3051 /// interface. This provides efficient reverse iteration of the
3052 /// subexpressions. This is currently used for CFG construction.
3053 ArrayRef<Stmt *> getRawSubExprs() {
3054 return llvm::makeArrayRef(getTrailingStmts(),
3055 PREARGS_START + getNumPreArgs() + getNumArgs());
3056 }
3057
3058 /// getNumCommas - Return the number of commas that must have been present in
3059 /// this function call.
3060 unsigned getNumCommas() const { return getNumArgs() ? getNumArgs() - 1 : 0; }
3061
3062 /// Get FPOptionsOverride from trailing storage.
3063 FPOptionsOverride getStoredFPFeatures() const {
3064 assert(hasStoredFPFeatures())(static_cast<void> (0));
3065 return *getTrailingFPFeatures();
3066 }
3067 /// Set FPOptionsOverride in trailing storage. Used only by Serialization.
3068 void setStoredFPFeatures(FPOptionsOverride F) {
3069 assert(hasStoredFPFeatures())(static_cast<void> (0));
3070 *getTrailingFPFeatures() = F;
3071 }
3072
3073 // Get the FP features status of this operator. Only meaningful for
3074 // operations on floating point types.
3075 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
3076 if (hasStoredFPFeatures())
3077 return getStoredFPFeatures().applyOverrides(LO);
3078 return FPOptions::defaultWithoutTrailingStorage(LO);
3079 }
3080
3081 FPOptionsOverride getFPFeatures() const {
3082 if (hasStoredFPFeatures())
3083 return getStoredFPFeatures();
3084 return FPOptionsOverride();
3085 }
3086
3087 /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID
3088 /// of the callee. If not, return 0.
3089 unsigned getBuiltinCallee() const;
3090
3091 /// Returns \c true if this is a call to a builtin which does not
3092 /// evaluate side-effects within its arguments.
3093 bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const;
3094
3095 /// getCallReturnType - Get the return type of the call expr. This is not
3096 /// always the type of the expr itself, if the return type is a reference
3097 /// type.
3098 QualType getCallReturnType(const ASTContext &Ctx) const;
3099
3100 /// Returns the WarnUnusedResultAttr that is either declared on the called
3101 /// function, or its return type declaration.
3102 const Attr *getUnusedResultAttr(const ASTContext &Ctx) const;
3103
3104 /// Returns true if this call expression should warn on unused results.
3105 bool hasUnusedResultAttr(const ASTContext &Ctx) const {
3106 return getUnusedResultAttr(Ctx) != nullptr;
3107 }
3108
3109 SourceLocation getRParenLoc() const { return RParenLoc; }
3110 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3111
3112 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
3113 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
3114
3115 /// Return true if this is a call to __assume() or __builtin_assume() with
3116 /// a non-value-dependent constant parameter evaluating as false.
3117 bool isBuiltinAssumeFalse(const ASTContext &Ctx) const;
3118
3119 /// Used by Sema to implement MSVC-compatible delayed name lookup.
3120 /// (Usually Exprs themselves should set dependence).
3121 void markDependentForPostponedNameLookup() {
3122 setDependence(getDependence() | ExprDependence::TypeValueInstantiation);
3123 }
3124
3125 bool isCallToStdMove() const {
3126 const FunctionDecl *FD = getDirectCallee();
3127 return getNumArgs() == 1 && FD && FD->isInStdNamespace() &&
3128 FD->getIdentifier() && FD->getIdentifier()->isStr("move");
3129 }
3130
3131 static bool classof(const Stmt *T) {
3132 return T->getStmtClass() >= firstCallExprConstant &&
3133 T->getStmtClass() <= lastCallExprConstant;
3134 }
3135
3136 // Iterators
3137 child_range children() {
3138 return child_range(getTrailingStmts(), getTrailingStmts() + PREARGS_START +
3139 getNumPreArgs() + getNumArgs());
3140 }
3141
3142 const_child_range children() const {
3143 return const_child_range(getTrailingStmts(),
3144 getTrailingStmts() + PREARGS_START +
3145 getNumPreArgs() + getNumArgs());
3146 }
3147};
3148
3149/// Extra data stored in some MemberExpr objects.
3150struct MemberExprNameQualifier {
3151 /// The nested-name-specifier that qualifies the name, including
3152 /// source-location information.
3153 NestedNameSpecifierLoc QualifierLoc;
3154
3155 /// The DeclAccessPair through which the MemberDecl was found due to
3156 /// name qualifiers.
3157 DeclAccessPair FoundDecl;
3158};
3159
3160/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F.
3161///
3162class MemberExpr final
3163 : public Expr,
3164 private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier,
3165 ASTTemplateKWAndArgsInfo,
3166 TemplateArgumentLoc> {
3167 friend class ASTReader;
3168 friend class ASTStmtReader;
3169 friend class ASTStmtWriter;
3170 friend TrailingObjects;
3171
3172 /// Base - the expression for the base pointer or structure references. In
3173 /// X.F, this is "X".
3174 Stmt *Base;
3175
3176 /// MemberDecl - This is the decl being referenced by the field/member name.
3177 /// In X.F, this is the decl referenced by F.
3178 ValueDecl *MemberDecl;
3179
3180 /// MemberDNLoc - Provides source/type location info for the
3181 /// declaration name embedded in MemberDecl.
3182 DeclarationNameLoc MemberDNLoc;
3183
3184 /// MemberLoc - This is the location of the member name.
3185 SourceLocation MemberLoc;
3186
3187 size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const {
3188 return hasQualifierOrFoundDecl();
3189 }
3190
3191 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3192 return hasTemplateKWAndArgsInfo();
3193 }
3194
3195 bool hasQualifierOrFoundDecl() const {
3196 return MemberExprBits.HasQualifierOrFoundDecl;
3197 }
3198
3199 bool hasTemplateKWAndArgsInfo() const {
3200 return MemberExprBits.HasTemplateKWAndArgsInfo;
3201 }
3202
3203 MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
3204 ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo,
3205 QualType T, ExprValueKind VK, ExprObjectKind OK,
3206 NonOdrUseReason NOUR);
3207 MemberExpr(EmptyShell Empty)
3208 : Expr(MemberExprClass, Empty), Base(), MemberDecl() {}
3209
3210public:
3211 static MemberExpr *Create(const ASTContext &C, Expr *Base, bool IsArrow,
3212 SourceLocation OperatorLoc,
3213 NestedNameSpecifierLoc QualifierLoc,
3214 SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
3215 DeclAccessPair FoundDecl,
3216 DeclarationNameInfo MemberNameInfo,
3217 const TemplateArgumentListInfo *TemplateArgs,
3218 QualType T, ExprValueKind VK, ExprObjectKind OK,
3219 NonOdrUseReason NOUR);
3220
3221 /// Create an implicit MemberExpr, with no location, qualifier, template
3222 /// arguments, and so on. Suitable only for non-static member access.
3223 static MemberExpr *CreateImplicit(const ASTContext &C, Expr *Base,
3224 bool IsArrow, ValueDecl *MemberDecl,
3225 QualType T, ExprValueKind VK,
3226 ExprObjectKind OK) {
3227 return Create(C, Base, IsArrow, SourceLocation(), NestedNameSpecifierLoc(),
3228 SourceLocation(), MemberDecl,
3229 DeclAccessPair::make(MemberDecl, MemberDecl->getAccess()),
3230 DeclarationNameInfo(), nullptr, T, VK, OK, NOUR_None);
3231 }
3232
3233 static MemberExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
3234 bool HasFoundDecl,
3235 bool HasTemplateKWAndArgsInfo,
3236 unsigned NumTemplateArgs);
3237
3238 void setBase(Expr *E) { Base = E; }
3239 Expr *getBase() const { return cast<Expr>(Base); }
3240
3241 /// Retrieve the member declaration to which this expression refers.
3242 ///
3243 /// The returned declaration will be a FieldDecl or (in C++) a VarDecl (for
3244 /// static data members), a CXXMethodDecl, or an EnumConstantDecl.
3245 ValueDecl *getMemberDecl() const { return MemberDecl; }
3246 void setMemberDecl(ValueDecl *D);
3247
3248 /// Retrieves the declaration found by lookup.
3249 DeclAccessPair getFoundDecl() const {
3250 if (!hasQualifierOrFoundDecl())
3251 return DeclAccessPair::make(getMemberDecl(),
3252 getMemberDecl()->getAccess());
3253 return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl;
3254 }
3255
3256 /// Determines whether this member expression actually had
3257 /// a C++ nested-name-specifier prior to the name of the member, e.g.,
3258 /// x->Base::foo.
3259 bool hasQualifier() const { return getQualifier() != nullptr; }
3260
3261 /// If the member name was qualified, retrieves the
3262 /// nested-name-specifier that precedes the member name, with source-location
3263 /// information.
3264 NestedNameSpecifierLoc getQualifierLoc() const {
3265 if (!hasQualifierOrFoundDecl())
3266 return NestedNameSpecifierLoc();
3267 return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc;
3268 }
3269
3270 /// If the member name was qualified, retrieves the
3271 /// nested-name-specifier that precedes the member name. Otherwise, returns
3272 /// NULL.
3273 NestedNameSpecifier *getQualifier() const {
3274 return getQualifierLoc().getNestedNameSpecifier();
3275 }
3276
3277 /// Retrieve the location of the template keyword preceding
3278 /// the member name, if any.
3279 SourceLocation getTemplateKeywordLoc() const {
3280 if (!hasTemplateKWAndArgsInfo())
3281 return SourceLocation();
3282 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3283 }
3284
3285 /// Retrieve the location of the left angle bracket starting the
3286 /// explicit template argument list following the member name, if any.
3287 SourceLocation getLAngleLoc() const {
3288 if (!hasTemplateKWAndArgsInfo())
3289 return SourceLocation();
3290 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3291 }
3292
3293 /// Retrieve the location of the right angle bracket ending the
3294 /// explicit template argument list following the member name, if any.
3295 SourceLocation getRAngleLoc() const {
3296 if (!hasTemplateKWAndArgsInfo())
3297 return SourceLocation();
3298 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3299 }
3300
3301 /// Determines whether the member name was preceded by the template keyword.
3302 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3303
3304 /// Determines whether the member name was followed by an
3305 /// explicit template argument list.
3306 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3307
3308 /// Copies the template arguments (if present) into the given
3309 /// structure.
3310 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3311 if (hasExplicitTemplateArgs())
3312 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3313 getTrailingObjects<TemplateArgumentLoc>(), List);
3314 }
3315
3316 /// Retrieve the template arguments provided as part of this
3317 /// template-id.
3318 const TemplateArgumentLoc *getTemplateArgs() const {
3319 if (!hasExplicitTemplateArgs())
3320 return nullptr;
3321
3322 return getTrailingObjects<TemplateArgumentLoc>();
3323 }
3324
3325 /// Retrieve the number of template arguments provided as part of this
3326 /// template-id.
3327 unsigned getNumTemplateArgs() const {
3328 if (!hasExplicitTemplateArgs())
3329 return 0;
3330
3331 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3332 }
3333
3334 ArrayRef<TemplateArgumentLoc> template_arguments() const {
3335 return {getTemplateArgs(), getNumTemplateArgs()};
3336 }
3337
3338 /// Retrieve the member declaration name info.
3339 DeclarationNameInfo getMemberNameInfo() const {
3340 return DeclarationNameInfo(MemberDecl->getDeclName(),
3341 MemberLoc, MemberDNLoc);
3342 }
3343
3344 SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; }
3345
3346 bool isArrow() const { return MemberExprBits.IsArrow; }
3347 void setArrow(bool A) { MemberExprBits.IsArrow = A; }
3348
3349 /// getMemberLoc - Return the location of the "member", in X->F, it is the
3350 /// location of 'F'.
3351 SourceLocation getMemberLoc() const { return MemberLoc; }
3352 void setMemberLoc(SourceLocation L) { MemberLoc = L; }
3353
3354 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
3355 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
3356
3357 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__)) { return MemberLoc; }
3358
3359 /// Determine whether the base of this explicit is implicit.
3360 bool isImplicitAccess() const {
3361 return getBase() && getBase()->isImplicitCXXThis();
3362 }
3363
3364 /// Returns true if this member expression refers to a method that
3365 /// was resolved from an overloaded set having size greater than 1.
3366 bool hadMultipleCandidates() const {
3367 return MemberExprBits.HadMultipleCandidates;
3368 }
3369 /// Sets the flag telling whether this expression refers to
3370 /// a method that was resolved from an overloaded set having size
3371 /// greater than 1.
3372 void setHadMultipleCandidates(bool V = true) {
3373 MemberExprBits.HadMultipleCandidates = V;
3374 }
3375
3376 /// Returns true if virtual dispatch is performed.
3377 /// If the member access is fully qualified, (i.e. X::f()), virtual
3378 /// dispatching is not performed. In -fapple-kext mode qualified
3379 /// calls to virtual method will still go through the vtable.
3380 bool performsVirtualDispatch(const LangOptions &LO) const {
3381 return LO.AppleKext || !hasQualifier();
3382 }
3383
3384 /// Is this expression a non-odr-use reference, and if so, why?
3385 /// This is only meaningful if the named member is a static member.
3386 NonOdrUseReason isNonOdrUse() const {
3387 return static_cast<NonOdrUseReason>(MemberExprBits.NonOdrUseReason);
3388 }
3389
3390 static bool classof(const Stmt *T) {
3391 return T->getStmtClass() == MemberExprClass;
3392 }
3393
3394 // Iterators
3395 child_range children() { return child_range(&Base, &Base+1); }
3396 const_child_range children() const {
3397 return const_child_range(&Base, &Base + 1);
3398 }
3399};
3400
3401/// CompoundLiteralExpr - [C99 6.5.2.5]
3402///
3403class CompoundLiteralExpr : public Expr {
3404 /// LParenLoc - If non-null, this is the location of the left paren in a
3405 /// compound literal like "(int){4}". This can be null if this is a
3406 /// synthesized compound expression.
3407 SourceLocation LParenLoc;
3408
3409 /// The type as written. This can be an incomplete array type, in
3410 /// which case the actual expression type will be different.
3411 /// The int part of the pair stores whether this expr is file scope.
3412 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope;
3413 Stmt *Init;
3414public:
3415 CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo,
3416 QualType T, ExprValueKind VK, Expr *init, bool fileScope)
3417 : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary),
3418 LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) {
3419 setDependence(computeDependence(this));
3420 }
3421
3422 /// Construct an empty compound literal.
3423 explicit CompoundLiteralExpr(EmptyShell Empty)
3424 : Expr(CompoundLiteralExprClass, Empty) { }
3425
3426 const Expr *getInitializer() const { return cast<Expr>(Init); }
3427 Expr *getInitializer() { return cast<Expr>(Init); }
3428 void setInitializer(Expr *E) { Init = E; }
3429
3430 bool isFileScope() const { return TInfoAndScope.getInt(); }
3431 void setFileScope(bool FS) { TInfoAndScope.setInt(FS); }
3432
3433 SourceLocation getLParenLoc() const { return LParenLoc; }
3434 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3435
3436 TypeSourceInfo *getTypeSourceInfo() const {
3437 return TInfoAndScope.getPointer();
3438 }
3439 void setTypeSourceInfo(TypeSourceInfo *tinfo) {
3440 TInfoAndScope.setPointer(tinfo);
3441 }
3442
3443 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
3444 // FIXME: Init should never be null.
3445 if (!Init)
3446 return SourceLocation();
3447 if (LParenLoc.isInvalid())
3448 return Init->getBeginLoc();
3449 return LParenLoc;
3450 }
3451 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
3452 // FIXME: Init should never be null.
3453 if (!Init)
3454 return SourceLocation();
3455 return Init->getEndLoc();
3456 }
3457
3458 static bool classof(const Stmt *T) {
3459 return T->getStmtClass() == CompoundLiteralExprClass;
3460 }
3461
3462 // Iterators
3463 child_range children() { return child_range(&Init, &Init+1); }
3464 const_child_range children() const {
3465 return const_child_range(&Init, &Init + 1);
3466 }
3467};
3468
3469/// CastExpr - Base class for type casts, including both implicit
3470/// casts (ImplicitCastExpr) and explicit casts that have some
3471/// representation in the source code (ExplicitCastExpr's derived
3472/// classes).
3473class CastExpr : public Expr {
3474 Stmt *Op;
3475
3476 bool CastConsistency() const;
3477
3478 const CXXBaseSpecifier * const *path_buffer() const {
3479 return const_cast<CastExpr*>(this)->path_buffer();
3480 }
3481 CXXBaseSpecifier **path_buffer();
3482
3483 friend class ASTStmtReader;
3484
3485protected:
3486 CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind,
3487 Expr *op, unsigned BasePathSize, bool HasFPFeatures)
3488 : Expr(SC, ty, VK, OK_Ordinary), Op(op) {
3489 CastExprBits.Kind = kind;
3490 CastExprBits.PartOfExplicitCast = false;
3491 CastExprBits.BasePathSize = BasePathSize;
3492 assert((CastExprBits.BasePathSize == BasePathSize) &&(static_cast<void> (0))
3493 "BasePathSize overflow!")(static_cast<void> (0));
3494 setDependence(computeDependence(this));
3495 assert(CastConsistency())(static_cast<void> (0));
3496 CastExprBits.HasFPFeatures = HasFPFeatures;
3497 }
3498
3499 /// Construct an empty cast.
3500 CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize,
3501 bool HasFPFeatures)
3502 : Expr(SC, Empty) {
3503 CastExprBits.PartOfExplicitCast = false;
3504 CastExprBits.BasePathSize = BasePathSize;
3505 CastExprBits.HasFPFeatures = HasFPFeatures;
3506 assert((CastExprBits.BasePathSize == BasePathSize) &&(static_cast<void> (0))
3507 "BasePathSize overflow!")(static_cast<void> (0));
3508 }
3509
3510 /// Return a pointer to the trailing FPOptions.
3511 /// \pre hasStoredFPFeatures() == true
3512 FPOptionsOverride *getTrailingFPFeatures();
3513 const FPOptionsOverride *getTrailingFPFeatures() const {
3514 return const_cast<CastExpr *>(this)->getTrailingFPFeatures();
3515 }
3516
3517public:
3518 CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; }
3519 void setCastKind(CastKind K) { CastExprBits.Kind = K; }
3520
3521 static const char *getCastKindName(CastKind CK);
3522 const char *getCastKindName() const { return getCastKindName(getCastKind()); }
3523
3524 Expr *getSubExpr() { return cast<Expr>(Op); }
3525 const Expr *getSubExpr() const { return cast<Expr>(Op); }
3526 void setSubExpr(Expr *E) { Op = E; }
3527
3528 /// Retrieve the cast subexpression as it was written in the source
3529 /// code, looking through any implicit casts or other intermediate nodes
3530 /// introduced by semantic analysis.
3531 Expr *getSubExprAsWritten();
3532 const Expr *getSubExprAsWritten() const {
3533 return const_cast<CastExpr *>(this)->getSubExprAsWritten();
3534 }
3535
3536 /// If this cast applies a user-defined conversion, retrieve the conversion
3537 /// function that it invokes.
3538 NamedDecl *getConversionFunction() const;
3539
3540 typedef CXXBaseSpecifier **path_iterator;
3541 typedef const CXXBaseSpecifier *const *path_const_iterator;
3542 bool path_empty() const { return path_size() == 0; }
3543 unsigned path_size() const { return CastExprBits.BasePathSize; }
3544 path_iterator path_begin() { return path_buffer(); }
3545 path_iterator path_end() { return path_buffer() + path_size(); }
3546 path_const_iterator path_begin() const { return path_buffer(); }
3547 path_const_iterator path_end() const { return path_buffer() + path_size(); }
3548
3549 llvm::iterator_range<path_iterator> path() {
3550 return llvm::make_range(path_begin(), path_end());
3551 }
3552 llvm::iterator_range<path_const_iterator> path() const {
3553 return llvm::make_range(path_begin(), path_end());
3554 }
3555
3556 const FieldDecl *getTargetUnionField() const {
3557 assert(getCastKind() == CK_ToUnion)(static_cast<void> (0));
3558 return getTargetFieldForToUnionCast(getType(), getSubExpr()->getType());
3559 }
3560
3561 bool hasStoredFPFeatures() const { return CastExprBits.HasFPFeatures; }
3562
3563 /// Get FPOptionsOverride from trailing storage.
3564 FPOptionsOverride getStoredFPFeatures() const {
3565 assert(hasStoredFPFeatures())(static_cast<void> (0));
3566 return *getTrailingFPFeatures();
3567 }
3568
3569 // Get the FP features status of this operation. Only meaningful for
3570 // operations on floating point types.
3571 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
3572 if (hasStoredFPFeatures())
3573 return getStoredFPFeatures().applyOverrides(LO);
3574 return FPOptions::defaultWithoutTrailingStorage(LO);
3575 }
3576
3577 FPOptionsOverride getFPFeatures() const {
3578 if (hasStoredFPFeatures())
3579 return getStoredFPFeatures();
3580 return FPOptionsOverride();
3581 }
3582
3583 static const FieldDecl *getTargetFieldForToUnionCast(QualType unionType,
3584 QualType opType);
3585 static const FieldDecl *getTargetFieldForToUnionCast(const RecordDecl *RD,
3586 QualType opType);
3587
3588 static bool classof(const Stmt *T) {
3589 return T->getStmtClass() >= firstCastExprConstant &&
3590 T->getStmtClass() <= lastCastExprConstant;
3591 }
3592
3593 // Iterators
3594 child_range children() { return child_range(&Op, &Op+1); }
3595 const_child_range children() const { return const_child_range(&Op, &Op + 1); }
3596};
3597
3598/// ImplicitCastExpr - Allows us to explicitly represent implicit type
3599/// conversions, which have no direct representation in the original
3600/// source code. For example: converting T[]->T*, void f()->void
3601/// (*f)(), float->double, short->int, etc.
3602///
3603/// In C, implicit casts always produce rvalues. However, in C++, an
3604/// implicit cast whose result is being bound to a reference will be
3605/// an lvalue or xvalue. For example:
3606///
3607/// @code
3608/// class Base { };
3609/// class Derived : public Base { };
3610/// Derived &&ref();
3611/// void f(Derived d) {
3612/// Base& b = d; // initializer is an ImplicitCastExpr
3613/// // to an lvalue of type Base
3614/// Base&& r = ref(); // initializer is an ImplicitCastExpr
3615/// // to an xvalue of type Base
3616/// }
3617/// @endcode
3618class ImplicitCastExpr final
3619 : public CastExpr,
3620 private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *,
3621 FPOptionsOverride> {
3622
3623 ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
3624 unsigned BasePathLength, FPOptionsOverride FPO,
3625 ExprValueKind VK)
3626 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength,
3627 FPO.requiresTrailingStorage()) {
3628 if (hasStoredFPFeatures())
3629 *getTrailingFPFeatures() = FPO;
3630 }
3631
3632 /// Construct an empty implicit cast.
3633 explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize,
3634 bool HasFPFeatures)
3635 : CastExpr(ImplicitCastExprClass, Shell, PathSize, HasFPFeatures) {}
3636
3637 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3638 return path_size();
3639 }
3640
3641public:
3642 enum OnStack_t { OnStack };
3643 ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op,
3644 ExprValueKind VK, FPOptionsOverride FPO)
3645 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0,
3646 FPO.requiresTrailingStorage()) {
3647 if (hasStoredFPFeatures())
3648 *getTrailingFPFeatures() = FPO;
3649 }
3650
3651 bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; }
3652 void setIsPartOfExplicitCast(bool PartOfExplicitCast) {
3653 CastExprBits.PartOfExplicitCast = PartOfExplicitCast;
3654 }
3655
3656 static ImplicitCastExpr *Create(const ASTContext &Context, QualType T,
3657 CastKind Kind, Expr *Operand,
3658 const CXXCastPath *BasePath,
3659 ExprValueKind Cat, FPOptionsOverride FPO);
3660
3661 static ImplicitCastExpr *CreateEmpty(const ASTContext &Context,
3662 unsigned PathSize, bool HasFPFeatures);
3663
3664 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
3665 return getSubExpr()->getBeginLoc();
3666 }
3667 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
3668 return getSubExpr()->getEndLoc();
3669 }
3670
3671 static bool classof(const Stmt *T) {
3672 return T->getStmtClass() == ImplicitCastExprClass;
3673 }
3674
3675 friend TrailingObjects;
3676 friend class CastExpr;
3677};
3678
3679/// ExplicitCastExpr - An explicit cast written in the source
3680/// code.
3681///
3682/// This class is effectively an abstract class, because it provides
3683/// the basic representation of an explicitly-written cast without
3684/// specifying which kind of cast (C cast, functional cast, static
3685/// cast, etc.) was written; specific derived classes represent the
3686/// particular style of cast and its location information.
3687///
3688/// Unlike implicit casts, explicit cast nodes have two different
3689/// types: the type that was written into the source code, and the
3690/// actual type of the expression as determined by semantic
3691/// analysis. These types may differ slightly. For example, in C++ one
3692/// can cast to a reference type, which indicates that the resulting
3693/// expression will be an lvalue or xvalue. The reference type, however,
3694/// will not be used as the type of the expression.
3695class ExplicitCastExpr : public CastExpr {
3696 /// TInfo - Source type info for the (written) type
3697 /// this expression is casting to.
3698 TypeSourceInfo *TInfo;
3699
3700protected:
3701 ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK,
3702 CastKind kind, Expr *op, unsigned PathSize,
3703 bool HasFPFeatures, TypeSourceInfo *writtenTy)
3704 : CastExpr(SC, exprTy, VK, kind, op, PathSize, HasFPFeatures),
3705 TInfo(writtenTy) {}
3706
3707 /// Construct an empty explicit cast.
3708 ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize,
3709 bool HasFPFeatures)
3710 : CastExpr(SC, Shell, PathSize, HasFPFeatures) {}
3711
3712public:
3713 /// getTypeInfoAsWritten - Returns the type source info for the type
3714 /// that this expression is casting to.
3715 TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; }
3716 void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; }
3717
3718 /// getTypeAsWritten - Returns the type that this expression is
3719 /// casting to, as written in the source code.
3720 QualType getTypeAsWritten() const { return TInfo->getType(); }
3721
3722 static bool classof(const Stmt *T) {
3723 return T->getStmtClass() >= firstExplicitCastExprConstant &&
3724 T->getStmtClass() <= lastExplicitCastExprConstant;
3725 }
3726};
3727
3728/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
3729/// cast in C++ (C++ [expr.cast]), which uses the syntax
3730/// (Type)expr. For example: @c (int)f.
3731class CStyleCastExpr final
3732 : public ExplicitCastExpr,
3733 private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *,
3734 FPOptionsOverride> {
3735 SourceLocation LPLoc; // the location of the left paren
3736 SourceLocation RPLoc; // the location of the right paren
3737
3738 CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op,
3739 unsigned PathSize, FPOptionsOverride FPO,
3740 TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation r)
3741 : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize,
3742 FPO.requiresTrailingStorage(), writtenTy),
3743 LPLoc(l), RPLoc(r) {
3744 if (hasStoredFPFeatures())
3745 *getTrailingFPFeatures() = FPO;
3746 }
3747
3748 /// Construct an empty C-style explicit cast.
3749 explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize,
3750 bool HasFPFeatures)
3751 : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize, HasFPFeatures) {}
3752
3753 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3754 return path_size();
3755 }
3756
3757public:
3758 static CStyleCastExpr *
3759 Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K,
3760 Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO,
3761 TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R);
3762
3763 static CStyleCastExpr *CreateEmpty(const ASTContext &Context,
3764 unsigned PathSize, bool HasFPFeatures);
3765
3766 SourceLocation getLParenLoc() const { return LPLoc; }
3767 void setLParenLoc(SourceLocation L) { LPLoc = L; }
3768
3769 SourceLocation getRParenLoc() const { return RPLoc; }
3770 void setRParenLoc(SourceLocation L) { RPLoc = L; }
3771
3772 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return LPLoc; }
3773 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
3774 return getSubExpr()->getEndLoc();
3775 }
3776
3777 static bool classof(const Stmt *T) {
3778 return T->getStmtClass() == CStyleCastExprClass;
3779 }
3780
3781 friend TrailingObjects;
3782 friend class CastExpr;
3783};
3784
3785/// A builtin binary operation expression such as "x + y" or "x <= y".
3786///
3787/// This expression node kind describes a builtin binary operation,
3788/// such as "x + y" for integer values "x" and "y". The operands will
3789/// already have been converted to appropriate types (e.g., by
3790/// performing promotions or conversions).
3791///
3792/// In C++, where operators may be overloaded, a different kind of
3793/// expression node (CXXOperatorCallExpr) is used to express the
3794/// invocation of an overloaded operator with operator syntax. Within
3795/// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is
3796/// used to store an expression "x + y" depends on the subexpressions
3797/// for x and y. If neither x or y is type-dependent, and the "+"
3798/// operator resolves to a built-in operation, BinaryOperator will be
3799/// used to express the computation (x and y may still be
3800/// value-dependent). If either x or y is type-dependent, or if the
3801/// "+" resolves to an overloaded operator, CXXOperatorCallExpr will
3802/// be used to express the computation.
3803class BinaryOperator : public Expr {
3804 enum { LHS, RHS, END_EXPR };
3805 Stmt *SubExprs[END_EXPR];
3806
3807public:
3808 typedef BinaryOperatorKind Opcode;
3809
3810protected:
3811 size_t offsetOfTrailingStorage() const;
3812
3813 /// Return a pointer to the trailing FPOptions
3814 FPOptionsOverride *getTrailingFPFeatures() {
3815 assert(BinaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
3816 return reinterpret_cast<FPOptionsOverride *>(
3817 reinterpret_cast<char *>(this) + offsetOfTrailingStorage());
3818 }
3819 const FPOptionsOverride *getTrailingFPFeatures() const {
3820 assert(BinaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
3821 return reinterpret_cast<const FPOptionsOverride *>(
3822 reinterpret_cast<const char *>(this) + offsetOfTrailingStorage());
3823 }
3824
3825 /// Build a binary operator, assuming that appropriate storage has been
3826 /// allocated for the trailing objects when needed.
3827 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
3828 QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
3829 SourceLocation opLoc, FPOptionsOverride FPFeatures);
3830
3831 /// Construct an empty binary operator.
3832 explicit BinaryOperator(EmptyShell Empty) : Expr(BinaryOperatorClass, Empty) {
3833 BinaryOperatorBits.Opc = BO_Comma;
3834 }
3835
3836public:
3837 static BinaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
3838
3839 static BinaryOperator *Create(const ASTContext &C, Expr *lhs, Expr *rhs,
3840 Opcode opc, QualType ResTy, ExprValueKind VK,
3841 ExprObjectKind OK, SourceLocation opLoc,
3842 FPOptionsOverride FPFeatures);
3843 SourceLocation getExprLoc() const { return getOperatorLoc(); }
3844 SourceLocation getOperatorLoc() const { return BinaryOperatorBits.OpLoc; }
3845 void setOperatorLoc(SourceLocation L) { BinaryOperatorBits.OpLoc = L; }
3846
3847 Opcode getOpcode() const {
3848 return static_cast<Opcode>(BinaryOperatorBits.Opc);
3849 }
3850 void setOpcode(Opcode Opc) { BinaryOperatorBits.Opc = Opc; }
3851
3852 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
3853 void setLHS(Expr *E) { SubExprs[LHS] = E; }
3854 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
3855 void setRHS(Expr *E) { SubExprs[RHS] = E; }
3856
3857 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
3858 return getLHS()->getBeginLoc();
3859 }
3860 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
3861 return getRHS()->getEndLoc();
3862 }
3863
3864 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
3865 /// corresponds to, e.g. "<<=".
3866 static StringRef getOpcodeStr(Opcode Op);
3867
3868 StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); }
3869
3870 /// Retrieve the binary opcode that corresponds to the given
3871 /// overloaded operator.
3872 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO);
3873
3874 /// Retrieve the overloaded operator kind that corresponds to
3875 /// the given binary opcode.
3876 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
3877
3878 /// predicates to categorize the respective opcodes.
3879 static bool isPtrMemOp(Opcode Opc) {
3880 return Opc == BO_PtrMemD || Opc == BO_PtrMemI;
3881 }
3882 bool isPtrMemOp() const { return isPtrMemOp(getOpcode()); }
3883
3884 static bool isMultiplicativeOp(Opcode Opc) {
3885 return Opc >= BO_Mul && Opc <= BO_Rem;
3886 }
3887 bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); }
3888 static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; }
3889 bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); }
3890 static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; }
3891 bool isShiftOp() const { return isShiftOp(getOpcode()); }
3892
3893 static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; }
3894 bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); }
3895
3896 static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; }
3897 bool isRelationalOp() const { return isRelationalOp(getOpcode()); }
3898
3899 static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; }
3900 bool isEqualityOp() const { return isEqualityOp(getOpcode()); }
3901
3902 static bool isComparisonOp(Opcode Opc) { return Opc >= BO_Cmp && Opc<=BO_NE; }
3903 bool isComparisonOp() const { return isComparisonOp(getOpcode()); }
3904
3905 static bool isCommaOp(Opcode Opc) { return Opc == BO_Comma; }
3906 bool isCommaOp() const { return isCommaOp(getOpcode()); }
3907
3908 static Opcode negateComparisonOp(Opcode Opc) {
3909 switch (Opc) {
3910 default:
3911 llvm_unreachable("Not a comparison operator.")__builtin_unreachable();
3912 case BO_LT: return BO_GE;
3913 case BO_GT: return BO_LE;
3914 case BO_LE: return BO_GT;
3915 case BO_GE: return BO_LT;
3916 case BO_EQ: return BO_NE;
3917 case BO_NE: return BO_EQ;
3918 }
3919 }
3920
3921 static Opcode reverseComparisonOp(Opcode Opc) {
3922 switch (Opc) {
3923 default:
3924 llvm_unreachable("Not a comparison operator.")__builtin_unreachable();
3925 case BO_LT: return BO_GT;
3926 case BO_GT: return BO_LT;
3927 case BO_LE: return BO_GE;
3928 case BO_GE: return BO_LE;
3929 case BO_EQ:
3930 case BO_NE:
3931 return Opc;
3932 }
3933 }
3934
3935 static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; }
3936 bool isLogicalOp() const { return isLogicalOp(getOpcode()); }
3937
3938 static bool isAssignmentOp(Opcode Opc) {
3939 return Opc >= BO_Assign && Opc <= BO_OrAssign;
3940 }
3941 bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); }
3942
3943 static bool isCompoundAssignmentOp(Opcode Opc) {
3944 return Opc > BO_Assign && Opc <= BO_OrAssign;
3945 }
3946 bool isCompoundAssignmentOp() const {
3947 return isCompoundAssignmentOp(getOpcode());
3948 }
3949 static Opcode getOpForCompoundAssignment(Opcode Opc) {
3950 assert(isCompoundAssignmentOp(Opc))(static_cast<void> (0));
3951 if (Opc >= BO_AndAssign)
3952 return Opcode(unsigned(Opc) - BO_AndAssign + BO_And);
3953 else
3954 return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul);
3955 }
3956
3957 static bool isShiftAssignOp(Opcode Opc) {
3958 return Opc == BO_ShlAssign || Opc == BO_ShrAssign;
3959 }
3960 bool isShiftAssignOp() const {
3961 return isShiftAssignOp(getOpcode());
3962 }
3963
3964 // Return true if a binary operator using the specified opcode and operands
3965 // would match the 'p = (i8*)nullptr + n' idiom for casting a pointer-sized
3966 // integer to a pointer.
3967 static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc,
3968 Expr *LHS, Expr *RHS);
3969
3970 static bool classof(const Stmt *S) {
3971 return S->getStmtClass() >= firstBinaryOperatorConstant &&
3972 S->getStmtClass() <= lastBinaryOperatorConstant;
3973 }
3974
3975 // Iterators
3976 child_range children() {
3977 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
3978 }
3979 const_child_range children() const {
3980 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
3981 }
3982
3983 /// Set and fetch the bit that shows whether FPFeatures needs to be
3984 /// allocated in Trailing Storage
3985 void setHasStoredFPFeatures(bool B) { BinaryOperatorBits.HasFPFeatures = B; }
3986 bool hasStoredFPFeatures() const { return BinaryOperatorBits.HasFPFeatures; }
3987
3988 /// Get FPFeatures from trailing storage
3989 FPOptionsOverride getStoredFPFeatures() const {
3990 assert(hasStoredFPFeatures())(static_cast<void> (0));
3991 return *getTrailingFPFeatures();
3992 }
3993 /// Set FPFeatures in trailing storage, used only by Serialization
3994 void setStoredFPFeatures(FPOptionsOverride F) {
3995 assert(BinaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
3996 *getTrailingFPFeatures() = F;
3997 }
3998
3999 // Get the FP features status of this operator. Only meaningful for
4000 // operations on floating point types.
4001 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
4002 if (BinaryOperatorBits.HasFPFeatures)
4003 return getStoredFPFeatures().applyOverrides(LO);
4004 return FPOptions::defaultWithoutTrailingStorage(LO);
4005 }
4006
4007 // This is used in ASTImporter
4008 FPOptionsOverride getFPFeatures(const LangOptions &LO) const {
4009 if (BinaryOperatorBits.HasFPFeatures)
4010 return getStoredFPFeatures();
4011 return FPOptionsOverride();
4012 }
4013
4014 // Get the FP contractability status of this operator. Only meaningful for
4015 // operations on floating point types.
4016 bool isFPContractableWithinStatement(const LangOptions &LO) const {
4017 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement();
4018 }
4019
4020 // Get the FENV_ACCESS status of this operator. Only meaningful for
4021 // operations on floating point types.
4022 bool isFEnvAccessOn(const LangOptions &LO) const {
4023 return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
4024 }
4025
4026protected:
4027 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
4028 QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
4029 SourceLocation opLoc, FPOptionsOverride FPFeatures,
4030 bool dead2);
4031
4032 /// Construct an empty BinaryOperator, SC is CompoundAssignOperator.
4033 BinaryOperator(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
4034 BinaryOperatorBits.Opc = BO_MulAssign;
4035 }
4036
4037 /// Return the size in bytes needed for the trailing objects.
4038 /// Used to allocate the right amount of storage.
4039 static unsigned sizeOfTrailingObjects(bool HasFPFeatures) {
4040 return HasFPFeatures * sizeof(FPOptionsOverride);
4041 }
4042};
4043
4044/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep
4045/// track of the type the operation is performed in. Due to the semantics of
4046/// these operators, the operands are promoted, the arithmetic performed, an
4047/// implicit conversion back to the result type done, then the assignment takes
4048/// place. This captures the intermediate type which the computation is done
4049/// in.
4050class CompoundAssignOperator : public BinaryOperator {
4051 QualType ComputationLHSType;
4052 QualType ComputationResultType;
4053
4054 /// Construct an empty CompoundAssignOperator.
4055 explicit CompoundAssignOperator(const ASTContext &C, EmptyShell Empty,
4056 bool hasFPFeatures)
4057 : BinaryOperator(CompoundAssignOperatorClass, Empty) {}
4058
4059protected:
4060 CompoundAssignOperator(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc,
4061 QualType ResType, ExprValueKind VK, ExprObjectKind OK,
4062 SourceLocation OpLoc, FPOptionsOverride FPFeatures,
4063 QualType CompLHSType, QualType CompResultType)
4064 : BinaryOperator(C, lhs, rhs, opc, ResType, VK, OK, OpLoc, FPFeatures,
4065 true),
4066 ComputationLHSType(CompLHSType), ComputationResultType(CompResultType) {
4067 assert(isCompoundAssignmentOp() &&(static_cast<void> (0))
4068 "Only should be used for compound assignments")(static_cast<void> (0));
4069 }
4070
4071public:
4072 static CompoundAssignOperator *CreateEmpty(const ASTContext &C,
4073 bool hasFPFeatures);
4074
4075 static CompoundAssignOperator *
4076 Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
4077 ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc,
4078 FPOptionsOverride FPFeatures, QualType CompLHSType = QualType(),
4079 QualType CompResultType = QualType());
4080
4081 // The two computation types are the type the LHS is converted
4082 // to for the computation and the type of the result; the two are
4083 // distinct in a few cases (specifically, int+=ptr and ptr-=ptr).
4084 QualType getComputationLHSType() const { return ComputationLHSType; }
4085 void setComputationLHSType(QualType T) { ComputationLHSType = T; }
4086
4087 QualType getComputationResultType() const { return ComputationResultType; }
4088 void setComputationResultType(QualType T) { ComputationResultType = T; }
4089
4090 static bool classof(const Stmt *S) {
4091 return S->getStmtClass() == CompoundAssignOperatorClass;
4092 }
4093};
4094
4095inline size_t BinaryOperator::offsetOfTrailingStorage() const {
4096 assert(BinaryOperatorBits.HasFPFeatures)(static_cast<void> (0));
4097 return isa<CompoundAssignOperator>(this) ? sizeof(CompoundAssignOperator)
4098 : sizeof(BinaryOperator);
4099}
4100
4101/// AbstractConditionalOperator - An abstract base class for
4102/// ConditionalOperator and BinaryConditionalOperator.
4103class AbstractConditionalOperator : public Expr {
4104 SourceLocation QuestionLoc, ColonLoc;
4105 friend class ASTStmtReader;
4106
4107protected:
4108 AbstractConditionalOperator(StmtClass SC, QualType T, ExprValueKind VK,
4109 ExprObjectKind OK, SourceLocation qloc,
4110 SourceLocation cloc)
4111 : Expr(SC, T, VK, OK), QuestionLoc(qloc), ColonLoc(cloc) {}
4112
4113 AbstractConditionalOperator(StmtClass SC, EmptyShell Empty)
4114 : Expr(SC, Empty) { }
4115
4116public:
4117 // getCond - Return the expression representing the condition for
4118 // the ?: operator.
4119 Expr *getCond() const;
4120
4121 // getTrueExpr - Return the subexpression representing the value of
4122 // the expression if the condition evaluates to true.
4123 Expr *getTrueExpr() const;
4124
4125 // getFalseExpr - Return the subexpression representing the value of
4126 // the expression if the condition evaluates to false. This is
4127 // the same as getRHS.
4128 Expr *getFalseExpr() const;
4129
4130 SourceLocation getQuestionLoc() const { return QuestionLoc; }
4131 SourceLocation getColonLoc() const { return ColonLoc; }
4132
4133 static bool classof(const Stmt *T) {
4134 return T->getStmtClass() == ConditionalOperatorClass ||
4135 T->getStmtClass() == BinaryConditionalOperatorClass;
4136 }
4137};
4138
4139/// ConditionalOperator - The ?: ternary operator. The GNU "missing
4140/// middle" extension is a BinaryConditionalOperator.
4141class ConditionalOperator : public AbstractConditionalOperator {
4142 enum { COND, LHS, RHS, END_EXPR };
4143 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4144
4145 friend class ASTStmtReader;
4146public:
4147 ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs,
4148 SourceLocation CLoc, Expr *rhs, QualType t,
4149 ExprValueKind VK, ExprObjectKind OK)
4150 : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc,
4151 CLoc) {
4152 SubExprs[COND] = cond;
4153 SubExprs[LHS] = lhs;
4154 SubExprs[RHS] = rhs;
4155 setDependence(computeDependence(this));
4156 }
4157
4158 /// Build an empty conditional operator.
4159 explicit ConditionalOperator(EmptyShell Empty)
4160 : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
4161
4162 // getCond - Return the expression representing the condition for
4163 // the ?: operator.
4164 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4165
4166 // getTrueExpr - Return the subexpression representing the value of
4167 // the expression if the condition evaluates to true.
4168 Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); }
4169
4170 // getFalseExpr - Return the subexpression representing the value of
4171 // the expression if the condition evaluates to false. This is
4172 // the same as getRHS.
4173 Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
4174
4175 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
4176 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
4177
4178 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
4179 return getCond()->getBeginLoc();
4180 }
4181 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
4182 return getRHS()->getEndLoc();
4183 }
4184
4185 static bool classof(const Stmt *T) {
4186 return T->getStmtClass() == ConditionalOperatorClass;
4187 }
4188
4189 // Iterators
4190 child_range children() {
4191 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
4192 }
4193 const_child_range children() const {
4194 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
4195 }
4196};
4197
4198/// BinaryConditionalOperator - The GNU extension to the conditional
4199/// operator which allows the middle operand to be omitted.
4200///
4201/// This is a different expression kind on the assumption that almost
4202/// every client ends up needing to know that these are different.
4203class BinaryConditionalOperator : public AbstractConditionalOperator {
4204 enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS };
4205
4206 /// - the common condition/left-hand-side expression, which will be
4207 /// evaluated as the opaque value
4208 /// - the condition, expressed in terms of the opaque value
4209 /// - the left-hand-side, expressed in terms of the opaque value
4210 /// - the right-hand-side
4211 Stmt *SubExprs[NUM_SUBEXPRS];
4212 OpaqueValueExpr *OpaqueValue;
4213
4214 friend class ASTStmtReader;
4215public:
4216 BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue,
4217 Expr *cond, Expr *lhs, Expr *rhs,
4218 SourceLocation qloc, SourceLocation cloc,
4219 QualType t, ExprValueKind VK, ExprObjectKind OK)
4220 : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
4221 qloc, cloc),
4222 OpaqueValue(opaqueValue) {
4223 SubExprs[COMMON] = common;
4224 SubExprs[COND] = cond;
4225 SubExprs[LHS] = lhs;
4226 SubExprs[RHS] = rhs;
4227 assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value")(static_cast<void> (0));
4228 setDependence(computeDependence(this));
4229 }
4230
4231 /// Build an empty conditional operator.
4232 explicit BinaryConditionalOperator(EmptyShell Empty)
4233 : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { }
4234
4235 /// getCommon - Return the common expression, written to the
4236 /// left of the condition. The opaque value will be bound to the
4237 /// result of this expression.
4238 Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); }
4239
4240 /// getOpaqueValue - Return the opaque value placeholder.
4241 OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
4242
4243 /// getCond - Return the condition expression; this is defined
4244 /// in terms of the opaque value.
4245 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4246
4247 /// getTrueExpr - Return the subexpression which will be
4248 /// evaluated if the condition evaluates to true; this is defined
4249 /// in terms of the opaque value.
4250 Expr *getTrueExpr() const {
4251 return cast<Expr>(SubExprs[LHS]);
4252 }
4253
4254 /// getFalseExpr - Return the subexpression which will be
4255 /// evaluated if the condnition evaluates to false; this is
4256 /// defined in terms of the opaque value.
4257 Expr *getFalseExpr() const {
4258 return cast<Expr>(SubExprs[RHS]);
4259 }
4260
4261 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
4262 return getCommon()->getBeginLoc();
4263 }
4264 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
4265 return getFalseExpr()->getEndLoc();
4266 }
4267
4268 static bool classof(const Stmt *T) {
4269 return T->getStmtClass() == BinaryConditionalOperatorClass;
4270 }
4271
4272 // Iterators
4273 child_range children() {
4274 return child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4275 }
4276 const_child_range children() const {
4277 return const_child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4278 }
4279};
4280
4281inline Expr *AbstractConditionalOperator::getCond() const {
4282 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4283 return co->getCond();
4284 return cast<BinaryConditionalOperator>(this)->getCond();
4285}
4286
4287inline Expr *AbstractConditionalOperator::getTrueExpr() const {
4288 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4289 return co->getTrueExpr();
4290 return cast<BinaryConditionalOperator>(this)->getTrueExpr();
4291}
4292
4293inline Expr *AbstractConditionalOperator::getFalseExpr() const {
4294 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4295 return co->getFalseExpr();
4296 return cast<BinaryConditionalOperator>(this)->getFalseExpr();
4297}
4298
4299/// AddrLabelExpr - The GNU address of label extension, representing &&label.
4300class AddrLabelExpr : public Expr {
4301 SourceLocation AmpAmpLoc, LabelLoc;
4302 LabelDecl *Label;
4303public:
4304 AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L,
4305 QualType t)
4306 : Expr(AddrLabelExprClass, t, VK_PRValue, OK_Ordinary), AmpAmpLoc(AALoc),
4307 LabelLoc(LLoc), Label(L) {
4308 setDependence(ExprDependence::None);
4309 }
4310
4311 /// Build an empty address of a label expression.
4312 explicit AddrLabelExpr(EmptyShell Empty)
4313 : Expr(AddrLabelExprClass, Empty) { }
4314
4315 SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; }
4316 void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; }
4317 SourceLocation getLabelLoc() const { return LabelLoc; }
4318 void setLabelLoc(SourceLocation L) { LabelLoc = L; }
4319
4320 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return AmpAmpLoc; }
4321 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return LabelLoc; }
4322
4323 LabelDecl *getLabel() const { return Label; }
4324 void setLabel(LabelDecl *L) { Label = L; }
4325
4326 static bool classof(const Stmt *T) {
4327 return T->getStmtClass() == AddrLabelExprClass;
4328 }
4329
4330 // Iterators
4331 child_range children() {
4332 return child_range(child_iterator(), child_iterator());
4333 }
4334 const_child_range children() const {
4335 return const_child_range(const_child_iterator(), const_child_iterator());
4336 }
4337};
4338
4339/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
4340/// The StmtExpr contains a single CompoundStmt node, which it evaluates and
4341/// takes the value of the last subexpression.
4342///
4343/// A StmtExpr is always an r-value; values "returned" out of a
4344/// StmtExpr will be copied.
4345class StmtExpr : public Expr {
4346 Stmt *SubStmt;
4347 SourceLocation LParenLoc, RParenLoc;
4348public:
4349 StmtExpr(CompoundStmt *SubStmt, QualType T, SourceLocation LParenLoc,
4350 SourceLocation RParenLoc, unsigned TemplateDepth)
4351 : Expr(StmtExprClass, T, VK_PRValue, OK_Ordinary), SubStmt(SubStmt),
4352 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4353 setDependence(computeDependence(this, TemplateDepth));
4354 // FIXME: A templated statement expression should have an associated
4355 // DeclContext so that nested declarations always have a dependent context.
4356 StmtExprBits.TemplateDepth = TemplateDepth;
4357 }
4358
4359 /// Build an empty statement expression.
4360 explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { }
4361
4362 CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
4363 const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
4364 void setSubStmt(CompoundStmt *S) { SubStmt = S; }
4365
4366 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return LParenLoc; }
4367 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
4368
4369 SourceLocation getLParenLoc() const { return LParenLoc; }
4370 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
4371 SourceLocation getRParenLoc() const { return RParenLoc; }
4372 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4373
4374 unsigned getTemplateDepth() const { return StmtExprBits.TemplateDepth; }
4375
4376 static bool classof(const Stmt *T) {
4377 return T->getStmtClass() == StmtExprClass;
4378 }
4379
4380 // Iterators
4381 child_range children() { return child_range(&SubStmt, &SubStmt+1); }
4382 const_child_range children() const {
4383 return const_child_range(&SubStmt, &SubStmt + 1);
4384 }
4385};
4386
4387/// ShuffleVectorExpr - clang-specific builtin-in function
4388/// __builtin_shufflevector.
4389/// This AST node represents a operator that does a constant
4390/// shuffle, similar to LLVM's shufflevector instruction. It takes
4391/// two vectors and a variable number of constant indices,
4392/// and returns the appropriately shuffled vector.
4393class ShuffleVectorExpr : public Expr {
4394 SourceLocation BuiltinLoc, RParenLoc;
4395
4396 // SubExprs - the list of values passed to the __builtin_shufflevector
4397 // function. The first two are vectors, and the rest are constant
4398 // indices. The number of values in this list is always
4399 // 2+the number of indices in the vector type.
4400 Stmt **SubExprs;
4401 unsigned NumExprs;
4402
4403public:
4404 ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type,
4405 SourceLocation BLoc, SourceLocation RP);
4406
4407 /// Build an empty vector-shuffle expression.
4408 explicit ShuffleVectorExpr(EmptyShell Empty)
4409 : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { }
4410
4411 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4412 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4413
4414 SourceLocation getRParenLoc() const { return RParenLoc; }
4415 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4416
4417 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
4418 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
4419
4420 static bool classof(const Stmt *T) {
4421 return T->getStmtClass() == ShuffleVectorExprClass;
4422 }
4423
4424 /// getNumSubExprs - Return the size of the SubExprs array. This includes the
4425 /// constant expression, the actual arguments passed in, and the function
4426 /// pointers.
4427 unsigned getNumSubExprs() const { return NumExprs; }
4428
4429 /// Retrieve the array of expressions.
4430 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
4431
4432 /// getExpr - Return the Expr at the specified index.
4433 Expr *getExpr(unsigned Index) {
4434 assert((Index < NumExprs) && "Arg access out of range!")(static_cast<void> (0));
4435 return cast<Expr>(SubExprs[Index]);
4436 }
4437 const Expr *getExpr(unsigned Index) const {
4438 assert((Index < NumExprs) && "Arg access out of range!")(static_cast<void> (0));
4439 return cast<Expr>(SubExprs[Index]);
4440 }
4441
4442 void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs);
4443
4444 llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const {
4445 assert((N < NumExprs - 2) && "Shuffle idx out of range!")(static_cast<void> (0));
4446 return getExpr(N+2)->EvaluateKnownConstInt(Ctx);
4447 }
4448
4449 // Iterators
4450 child_range children() {
4451 return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
4452 }
4453 const_child_range children() const {
4454 return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs);
4455 }
4456};
4457
4458/// ConvertVectorExpr - Clang builtin function __builtin_convertvector
4459/// This AST node provides support for converting a vector type to another
4460/// vector type of the same arity.
4461class ConvertVectorExpr : public Expr {
4462private:
4463 Stmt *SrcExpr;
4464 TypeSourceInfo *TInfo;
4465 SourceLocation BuiltinLoc, RParenLoc;
4466
4467 friend class ASTReader;
4468 friend class ASTStmtReader;
4469 explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {}
4470
4471public:
4472 ConvertVectorExpr(Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType,
4473 ExprValueKind VK, ExprObjectKind OK,
4474 SourceLocation BuiltinLoc, SourceLocation RParenLoc)
4475 : Expr(ConvertVectorExprClass, DstType, VK, OK), SrcExpr(SrcExpr),
4476 TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {
4477 setDependence(computeDependence(this));
4478 }
4479
4480 /// getSrcExpr - Return the Expr to be converted.
4481 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
4482
4483 /// getTypeSourceInfo - Return the destination type.
4484 TypeSourceInfo *getTypeSourceInfo() const {
4485 return TInfo;
4486 }
4487 void setTypeSourceInfo(TypeSourceInfo *ti) {
4488 TInfo = ti;
4489 }
4490
4491 /// getBuiltinLoc - Return the location of the __builtin_convertvector token.
4492 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4493
4494 /// getRParenLoc - Return the location of final right parenthesis.
4495 SourceLocation getRParenLoc() const { return RParenLoc; }
4496
4497 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
4498 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
4499
4500 static bool classof(const Stmt *T) {
4501 return T->getStmtClass() == ConvertVectorExprClass;
4502 }
4503
4504 // Iterators
4505 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
4506 const_child_range children() const {
4507 return const_child_range(&SrcExpr, &SrcExpr + 1);
4508 }
4509};
4510
4511/// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
4512/// This AST node is similar to the conditional operator (?:) in C, with
4513/// the following exceptions:
4514/// - the test expression must be a integer constant expression.
4515/// - the expression returned acts like the chosen subexpression in every
4516/// visible way: the type is the same as that of the chosen subexpression,
4517/// and all predicates (whether it's an l-value, whether it's an integer
4518/// constant expression, etc.) return the same result as for the chosen
4519/// sub-expression.
4520class ChooseExpr : public Expr {
4521 enum { COND, LHS, RHS, END_EXPR };
4522 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4523 SourceLocation BuiltinLoc, RParenLoc;
4524 bool CondIsTrue;
4525public:
4526 ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
4527 ExprValueKind VK, ExprObjectKind OK, SourceLocation RP,
4528 bool condIsTrue)
4529 : Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP),
4530 CondIsTrue(condIsTrue) {
4531 SubExprs[COND] = cond;
4532 SubExprs[LHS] = lhs;
4533 SubExprs[RHS] = rhs;
4534
4535 setDependence(computeDependence(this));
4536 }
4537
4538 /// Build an empty __builtin_choose_expr.
4539 explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { }
4540
4541 /// isConditionTrue - Return whether the condition is true (i.e. not
4542 /// equal to zero).
4543 bool isConditionTrue() const {
4544 assert(!isConditionDependent() &&(static_cast<void> (0))
4545 "Dependent condition isn't true or false")(static_cast<void> (0));
4546 return CondIsTrue;
4547 }
4548 void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; }
4549
4550 bool isConditionDependent() const {
4551 return getCond()->isTypeDependent() || getCond()->isValueDependent();
4552 }
4553
4554 /// getChosenSubExpr - Return the subexpression chosen according to the
4555 /// condition.
4556 Expr *getChosenSubExpr() const {
4557 return isConditionTrue() ? getLHS() : getRHS();
4558 }
4559
4560 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4561 void setCond(Expr *E) { SubExprs[COND] = E; }
4562 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
4563 void setLHS(Expr *E) { SubExprs[LHS] = E; }
4564 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
4565 void setRHS(Expr *E) { SubExprs[RHS] = E; }
4566
4567 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4568 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4569
4570 SourceLocation getRParenLoc() const { return RParenLoc; }
4571 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4572
4573 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
4574 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
4575
4576 static bool classof(const Stmt *T) {
4577 return T->getStmtClass() == ChooseExprClass;
4578 }
4579
4580 // Iterators
4581 child_range children() {
4582 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
4583 }
4584 const_child_range children() const {
4585 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
4586 }
4587};
4588
4589/// GNUNullExpr - Implements the GNU __null extension, which is a name
4590/// for a null pointer constant that has integral type (e.g., int or
4591/// long) and is the same size and alignment as a pointer. The __null
4592/// extension is typically only used by system headers, which define
4593/// NULL as __null in C++ rather than using 0 (which is an integer
4594/// that may not match the size of a pointer).
4595class GNUNullExpr : public Expr {
4596 /// TokenLoc - The location of the __null keyword.
4597 SourceLocation TokenLoc;
4598
4599public:
4600 GNUNullExpr(QualType Ty, SourceLocation Loc)
4601 : Expr(GNUNullExprClass, Ty, VK_PRValue, OK_Ordinary), TokenLoc(Loc) {
4602 setDependence(ExprDependence::None);
4603 }
4604
4605 /// Build an empty GNU __null expression.
4606 explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { }
4607
4608 /// getTokenLocation - The location of the __null token.
4609 SourceLocation getTokenLocation() const { return TokenLoc; }
4610 void setTokenLocation(SourceLocation L) { TokenLoc = L; }
4611
4612 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return TokenLoc; }
4613 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return TokenLoc; }
4614
4615 static bool classof(const Stmt *T) {
4616 return T->getStmtClass() == GNUNullExprClass;
4617 }
4618
4619 // Iterators
4620 child_range children() {
4621 return child_range(child_iterator(), child_iterator());
4622 }
4623 const_child_range children() const {
4624 return const_child_range(const_child_iterator(), const_child_iterator());
4625 }
4626};
4627
4628/// Represents a call to the builtin function \c __builtin_va_arg.
4629class VAArgExpr : public Expr {
4630 Stmt *Val;
4631 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo;
4632 SourceLocation BuiltinLoc, RParenLoc;
4633public:
4634 VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo,
4635 SourceLocation RPLoc, QualType t, bool IsMS)
4636 : Expr(VAArgExprClass, t, VK_PRValue, OK_Ordinary), Val(e),
4637 TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) {
4638 setDependence(computeDependence(this));
4639 }
4640
4641 /// Create an empty __builtin_va_arg expression.
4642 explicit VAArgExpr(EmptyShell Empty)
4643 : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {}
4644
4645 const Expr *getSubExpr() const { return cast<Expr>(Val); }
4646 Expr *getSubExpr() { return cast<Expr>(Val); }
4647 void setSubExpr(Expr *E) { Val = E; }
4648
4649 /// Returns whether this is really a Win64 ABI va_arg expression.
4650 bool isMicrosoftABI() const { return TInfo.getInt(); }
4651 void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); }
4652
4653 TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); }
4654 void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); }
4655
4656 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4657 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4658
4659 SourceLocation getRParenLoc() const { return RParenLoc; }
4660 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4661
4662 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
4663 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
4664
4665 static bool classof(const Stmt *T) {
4666 return T->getStmtClass() == VAArgExprClass;
4667 }
4668
4669 // Iterators
4670 child_range children() { return child_range(&Val, &Val+1); }
4671 const_child_range children() const {
4672 return const_child_range(&Val, &Val + 1);
4673 }
4674};
4675
4676/// Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(),
4677/// __builtin_FUNCTION(), or __builtin_FILE().
4678class SourceLocExpr final : public Expr {
4679 SourceLocation BuiltinLoc, RParenLoc;
4680 DeclContext *ParentContext;
4681
4682public:
4683 enum IdentKind { Function, File, Line, Column };
4684
4685 SourceLocExpr(const ASTContext &Ctx, IdentKind Type, SourceLocation BLoc,
4686 SourceLocation RParenLoc, DeclContext *Context);
4687
4688 /// Build an empty call expression.
4689 explicit SourceLocExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {}
4690
4691 /// Return the result of evaluating this SourceLocExpr in the specified
4692 /// (and possibly null) default argument or initialization context.
4693 APValue EvaluateInContext(const ASTContext &Ctx,
4694 const Expr *DefaultExpr) const;
4695
4696 /// Return a string representing the name of the specific builtin function.
4697 StringRef getBuiltinStr() const;
4698
4699 IdentKind getIdentKind() const {
4700 return static_cast<IdentKind>(SourceLocExprBits.Kind);
4701 }
4702
4703 bool isStringType() const {
4704 switch (getIdentKind()) {
4705 case File:
4706 case Function:
4707 return true;
4708 case Line:
4709 case Column:
4710 return false;
4711 }
4712 llvm_unreachable("unknown source location expression kind")__builtin_unreachable();
4713 }
4714 bool isIntType() const LLVM_READONLY__attribute__((__pure__)) { return !isStringType(); }
4715
4716 /// If the SourceLocExpr has been resolved return the subexpression
4717 /// representing the resolved value. Otherwise return null.
4718 const DeclContext *getParentContext() const { return ParentContext; }
4719 DeclContext *getParentContext() { return ParentContext; }
4720
4721 SourceLocation getLocation() const { return BuiltinLoc; }
4722 SourceLocation getBeginLoc() const { return BuiltinLoc; }
4723 SourceLocation getEndLoc() const { return RParenLoc; }
4724
4725 child_range children() {
4726 return child_range(child_iterator(), child_iterator());
4727 }
4728
4729 const_child_range children() const {
4730 return const_child_range(child_iterator(), child_iterator());
4731 }
4732
4733 static bool classof(const Stmt *T) {
4734 return T->getStmtClass() == SourceLocExprClass;
4735 }
4736
4737private:
4738 friend class ASTStmtReader;
4739};
4740
4741/// Describes an C or C++ initializer list.
4742///
4743/// InitListExpr describes an initializer list, which can be used to
4744/// initialize objects of different types, including
4745/// struct/class/union types, arrays, and vectors. For example:
4746///
4747/// @code
4748/// struct foo x = { 1, { 2, 3 } };
4749/// @endcode
4750///
4751/// Prior to semantic analysis, an initializer list will represent the
4752/// initializer list as written by the user, but will have the
4753/// placeholder type "void". This initializer list is called the
4754/// syntactic form of the initializer, and may contain C99 designated
4755/// initializers (represented as DesignatedInitExprs), initializations
4756/// of subobject members without explicit braces, and so on. Clients
4757/// interested in the original syntax of the initializer list should
4758/// use the syntactic form of the initializer list.
4759///
4760/// After semantic analysis, the initializer list will represent the
4761/// semantic form of the initializer, where the initializations of all
4762/// subobjects are made explicit with nested InitListExpr nodes and
4763/// C99 designators have been eliminated by placing the designated
4764/// initializations into the subobject they initialize. Additionally,
4765/// any "holes" in the initialization, where no initializer has been
4766/// specified for a particular subobject, will be replaced with
4767/// implicitly-generated ImplicitValueInitExpr expressions that
4768/// value-initialize the subobjects. Note, however, that the
4769/// initializer lists may still have fewer initializers than there are
4770/// elements to initialize within the object.
4771///
4772/// After semantic analysis has completed, given an initializer list,
4773/// method isSemanticForm() returns true if and only if this is the
4774/// semantic form of the initializer list (note: the same AST node
4775/// may at the same time be the syntactic form).
4776/// Given the semantic form of the initializer list, one can retrieve
4777/// the syntactic form of that initializer list (when different)
4778/// using method getSyntacticForm(); the method returns null if applied
4779/// to a initializer list which is already in syntactic form.
4780/// Similarly, given the syntactic form (i.e., an initializer list such
4781/// that isSemanticForm() returns false), one can retrieve the semantic
4782/// form using method getSemanticForm().
4783/// Since many initializer lists have the same syntactic and semantic forms,
4784/// getSyntacticForm() may return NULL, indicating that the current
4785/// semantic initializer list also serves as its syntactic form.
4786class InitListExpr : public Expr {
4787 // FIXME: Eliminate this vector in favor of ASTContext allocation
4788 typedef ASTVector<Stmt *> InitExprsTy;
4789 InitExprsTy InitExprs;
4790 SourceLocation LBraceLoc, RBraceLoc;
4791
4792 /// The alternative form of the initializer list (if it exists).
4793 /// The int part of the pair stores whether this initializer list is
4794 /// in semantic form. If not null, the pointer points to:
4795 /// - the syntactic form, if this is in semantic form;
4796 /// - the semantic form, if this is in syntactic form.
4797 llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm;
4798
4799 /// Either:
4800 /// If this initializer list initializes an array with more elements than
4801 /// there are initializers in the list, specifies an expression to be used
4802 /// for value initialization of the rest of the elements.
4803 /// Or
4804 /// If this initializer list initializes a union, specifies which
4805 /// field within the union will be initialized.
4806 llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
4807
4808public:
4809 InitListExpr(const ASTContext &C, SourceLocation lbraceloc,
4810 ArrayRef<Expr*> initExprs, SourceLocation rbraceloc);
4811
4812 /// Build an empty initializer list.
4813 explicit InitListExpr(EmptyShell Empty)
4814 : Expr(InitListExprClass, Empty), AltForm(nullptr, true) { }
4815
4816 unsigned getNumInits() const { return InitExprs.size(); }
4817
4818 /// Retrieve the set of initializers.
4819 Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); }
4820
4821 /// Retrieve the set of initializers.
4822 Expr * const *getInits() const {
4823 return reinterpret_cast<Expr * const *>(InitExprs.data());
4824 }
4825
4826 ArrayRef<Expr *> inits() {
4827 return llvm::makeArrayRef(getInits(), getNumInits());
4828 }
4829
4830 ArrayRef<Expr *> inits() const {
4831 return llvm::makeArrayRef(getInits(), getNumInits());
4832 }
4833
4834 const Expr *getInit(unsigned Init) const {
4835 assert(Init < getNumInits() && "Initializer access out of range!")(static_cast<void> (0));
4836 return cast_or_null<Expr>(InitExprs[Init]);
4837 }
4838
4839 Expr *getInit(unsigned Init) {
4840 assert(Init < getNumInits() && "Initializer access out of range!")(static_cast<void> (0));
4841 return cast_or_null<Expr>(InitExprs[Init]);
4842 }
4843
4844 void setInit(unsigned Init, Expr *expr) {
4845 assert(Init < getNumInits() && "Initializer access out of range!")(static_cast<void> (0));
4846 InitExprs[Init] = expr;
4847
4848 if (expr)
4849 setDependence(getDependence() | expr->getDependence());
4850 }
4851
4852 /// Mark the semantic form of the InitListExpr as error when the semantic
4853 /// analysis fails.
4854 void markError() {
4855 assert(isSemanticForm())(static_cast<void> (0));
4856 setDependence(getDependence() | ExprDependence::ErrorDependent);
4857 }
4858
4859 /// Reserve space for some number of initializers.
4860 void reserveInits(const ASTContext &C, unsigned NumInits);
4861
4862 /// Specify the number of initializers
4863 ///
4864 /// If there are more than @p NumInits initializers, the remaining
4865 /// initializers will be destroyed. If there are fewer than @p
4866 /// NumInits initializers, NULL expressions will be added for the
4867 /// unknown initializers.
4868 void resizeInits(const ASTContext &Context, unsigned NumInits);
4869
4870 /// Updates the initializer at index @p Init with the new
4871 /// expression @p expr, and returns the old expression at that
4872 /// location.
4873 ///
4874 /// When @p Init is out of range for this initializer list, the
4875 /// initializer list will be extended with NULL expressions to
4876 /// accommodate the new entry.
4877 Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr);
4878
4879 /// If this initializer list initializes an array with more elements
4880 /// than there are initializers in the list, specifies an expression to be
4881 /// used for value initialization of the rest of the elements.
4882 Expr *getArrayFiller() {
4883 return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
4884 }
4885 const Expr *getArrayFiller() const {
4886 return const_cast<InitListExpr *>(this)->getArrayFiller();
4887 }
4888 void setArrayFiller(Expr *filler);
4889
4890 /// Return true if this is an array initializer and its array "filler"
4891 /// has been set.
4892 bool hasArrayFiller() const { return getArrayFiller(); }
4893
4894 /// If this initializes a union, specifies which field in the
4895 /// union to initialize.
4896 ///
4897 /// Typically, this field is the first named field within the
4898 /// union. However, a designated initializer can specify the
4899 /// initialization of a different field within the union.
4900 FieldDecl *getInitializedFieldInUnion() {
4901 return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
4902 }
4903 const FieldDecl *getInitializedFieldInUnion() const {
4904 return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion();
4905 }
4906 void setInitializedFieldInUnion(FieldDecl *FD) {
4907 assert((FD == nullptr(static_cast<void> (0))
4908 || getInitializedFieldInUnion() == nullptr(static_cast<void> (0))
4909 || getInitializedFieldInUnion() == FD)(static_cast<void> (0))
4910 && "Only one field of a union may be initialized at a time!")(static_cast<void> (0));
4911 ArrayFillerOrUnionFieldInit = FD;
4912 }
4913
4914 // Explicit InitListExpr's originate from source code (and have valid source
4915 // locations). Implicit InitListExpr's are created by the semantic analyzer.
4916 // FIXME: This is wrong; InitListExprs created by semantic analysis have
4917 // valid source locations too!
4918 bool isExplicit() const {
4919 return LBraceLoc.isValid() && RBraceLoc.isValid();
4920 }
4921
4922 // Is this an initializer for an array of characters, initialized by a string
4923 // literal or an @encode?
4924 bool isStringLiteralInit() const;
4925
4926 /// Is this a transparent initializer list (that is, an InitListExpr that is
4927 /// purely syntactic, and whose semantics are that of the sole contained
4928 /// initializer)?
4929 bool isTransparent() const;
4930
4931 /// Is this the zero initializer {0} in a language which considers it
4932 /// idiomatic?
4933 bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const;
4934
4935 SourceLocation getLBraceLoc() const { return LBraceLoc; }
4936 void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; }
4937 SourceLocation getRBraceLoc() const { return RBraceLoc; }
4938 void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; }
4939
4940 bool isSemanticForm() const { return AltForm.getInt(); }
4941 InitListExpr *getSemanticForm() const {
4942 return isSemanticForm() ? nullptr : AltForm.getPointer();
4943 }
4944 bool isSyntacticForm() const {
4945 return !AltForm.getInt() || !AltForm.getPointer();
4946 }
4947 InitListExpr *getSyntacticForm() const {
4948 return isSemanticForm() ? AltForm.getPointer() : nullptr;
4949 }
4950
4951 void setSyntacticForm(InitListExpr *Init) {
4952 AltForm.setPointer(Init);
4953 AltForm.setInt(true);
4954 Init->AltForm.setPointer(this);
4955 Init->AltForm.setInt(false);
4956 }
4957
4958 bool hadArrayRangeDesignator() const {
4959 return InitListExprBits.HadArrayRangeDesignator != 0;
4960 }
4961 void sawArrayRangeDesignator(bool ARD = true) {
4962 InitListExprBits.HadArrayRangeDesignator = ARD;
4963 }
4964
4965 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
4966 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
4967
4968 static bool classof(const Stmt *T) {
4969 return T->getStmtClass() == InitListExprClass;
4970 }
4971
4972 // Iterators
4973 child_range children() {
4974 const_child_range CCR = const_cast<const InitListExpr *>(this)->children();
4975 return child_range(cast_away_const(CCR.begin()),
4976 cast_away_const(CCR.end()));
4977 }
4978
4979 const_child_range children() const {
4980 // FIXME: This does not include the array filler expression.
4981 if (InitExprs.empty())
4982 return const_child_range(const_child_iterator(), const_child_iterator());
4983 return const_child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size());
4984 }
4985
4986 typedef InitExprsTy::iterator iterator;
4987 typedef InitExprsTy::const_iterator const_iterator;
4988 typedef InitExprsTy::reverse_iterator reverse_iterator;
4989 typedef InitExprsTy::const_reverse_iterator const_reverse_iterator;
4990
4991 iterator begin() { return InitExprs.begin(); }
4992 const_iterator begin() const { return InitExprs.begin(); }
4993 iterator end() { return InitExprs.end(); }
4994 const_iterator end() const { return InitExprs.end(); }
4995 reverse_iterator rbegin() { return InitExprs.rbegin(); }
4996 const_reverse_iterator rbegin() const { return InitExprs.rbegin(); }
4997 reverse_iterator rend() { return InitExprs.rend(); }
4998 const_reverse_iterator rend() const { return InitExprs.rend(); }
4999
5000 friend class ASTStmtReader;
5001 friend class ASTStmtWriter;
5002};
5003
5004/// Represents a C99 designated initializer expression.
5005///
5006/// A designated initializer expression (C99 6.7.8) contains one or
5007/// more designators (which can be field designators, array
5008/// designators, or GNU array-range designators) followed by an
5009/// expression that initializes the field or element(s) that the
5010/// designators refer to. For example, given:
5011///
5012/// @code
5013/// struct point {
5014/// double x;
5015/// double y;
5016/// };
5017/// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
5018/// @endcode
5019///
5020/// The InitListExpr contains three DesignatedInitExprs, the first of
5021/// which covers @c [2].y=1.0. This DesignatedInitExpr will have two
5022/// designators, one array designator for @c [2] followed by one field
5023/// designator for @c .y. The initialization expression will be 1.0.
5024class DesignatedInitExpr final
5025 : public Expr,
5026 private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> {
5027public:
5028 /// Forward declaration of the Designator class.
5029 class Designator;
5030
5031private:
5032 /// The location of the '=' or ':' prior to the actual initializer
5033 /// expression.
5034 SourceLocation EqualOrColonLoc;
5035
5036 /// Whether this designated initializer used the GNU deprecated
5037 /// syntax rather than the C99 '=' syntax.
5038 unsigned GNUSyntax : 1;
5039
5040 /// The number of designators in this initializer expression.
5041 unsigned NumDesignators : 15;
5042
5043 /// The number of subexpressions of this initializer expression,
5044 /// which contains both the initializer and any additional
5045 /// expressions used by array and array-range designators.
5046 unsigned NumSubExprs : 16;
5047
5048 /// The designators in this designated initialization
5049 /// expression.
5050 Designator *Designators;
5051
5052 DesignatedInitExpr(const ASTContext &C, QualType Ty,
5053 llvm::ArrayRef<Designator> Designators,
5054 SourceLocation EqualOrColonLoc, bool GNUSyntax,
5055 ArrayRef<Expr *> IndexExprs, Expr *Init);
5056
5057 explicit DesignatedInitExpr(unsigned NumSubExprs)
5058 : Expr(DesignatedInitExprClass, EmptyShell()),
5059 NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { }
5060
5061public:
5062 /// A field designator, e.g., ".x".
5063 struct FieldDesignator {
5064 /// Refers to the field that is being initialized. The low bit
5065 /// of this field determines whether this is actually a pointer
5066 /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When
5067 /// initially constructed, a field designator will store an
5068 /// IdentifierInfo*. After semantic analysis has resolved that
5069 /// name, the field designator will instead store a FieldDecl*.
5070 uintptr_t NameOrField;
5071
5072 /// The location of the '.' in the designated initializer.
5073 SourceLocation DotLoc;
5074
5075 /// The location of the field name in the designated initializer.
5076 SourceLocation FieldLoc;
5077 };
5078
5079 /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
5080 struct ArrayOrRangeDesignator {
5081 /// Location of the first index expression within the designated
5082 /// initializer expression's list of subexpressions.
5083 unsigned Index;
5084 /// The location of the '[' starting the array range designator.
5085 SourceLocation LBracketLoc;
5086 /// The location of the ellipsis separating the start and end
5087 /// indices. Only valid for GNU array-range designators.
5088 SourceLocation EllipsisLoc;
5089 /// The location of the ']' terminating the array range designator.
5090 SourceLocation RBracketLoc;
5091 };
5092
5093 /// Represents a single C99 designator.
5094 ///
5095 /// @todo This class is infuriatingly similar to clang::Designator,
5096 /// but minor differences (storing indices vs. storing pointers)
5097 /// keep us from reusing it. Try harder, later, to rectify these
5098 /// differences.
5099 class Designator {
5100 /// The kind of designator this describes.
5101 enum {
5102 FieldDesignator,
5103 ArrayDesignator,
5104 ArrayRangeDesignator
5105 } Kind;
5106
5107 union {
5108 /// A field designator, e.g., ".x".
5109 struct FieldDesignator Field;
5110 /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
5111 struct ArrayOrRangeDesignator ArrayOrRange;
5112 };
5113 friend class DesignatedInitExpr;
5114
5115 public:
5116 Designator() {}
5117
5118 /// Initializes a field designator.
5119 Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc,
5120 SourceLocation FieldLoc)
5121 : Kind(FieldDesignator) {
5122 new (&Field) DesignatedInitExpr::FieldDesignator;
5123 Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01;
5124 Field.DotLoc = DotLoc;
5125 Field.FieldLoc = FieldLoc;
5126 }
5127
5128 /// Initializes an array designator.
5129 Designator(unsigned Index, SourceLocation LBracketLoc,
5130 SourceLocation RBracketLoc)
5131 : Kind(ArrayDesignator) {
5132 new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator;
5133 ArrayOrRange.Index = Index;
5134 ArrayOrRange.LBracketLoc = LBracketLoc;
5135 ArrayOrRange.EllipsisLoc = SourceLocation();
5136 ArrayOrRange.RBracketLoc = RBracketLoc;
5137 }
5138
5139 /// Initializes a GNU array-range designator.
5140 Designator(unsigned Index, SourceLocation LBracketLoc,
5141 SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
5142 : Kind(ArrayRangeDesignator) {
5143 new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator;
5144 ArrayOrRange.Index = Index;
5145 ArrayOrRange.LBracketLoc = LBracketLoc;
5146 ArrayOrRange.EllipsisLoc = EllipsisLoc;
5147 ArrayOrRange.RBracketLoc = RBracketLoc;
5148 }
5149
5150 bool isFieldDesignator() const { return Kind == FieldDesignator; }
5151 bool isArrayDesignator() const { return Kind == ArrayDesignator; }
5152 bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
5153
5154 IdentifierInfo *getFieldName() const;
5155
5156 FieldDecl *getField() const {
5157 assert(Kind == FieldDesignator && "Only valid on a field designator")(static_cast<void> (0));
5158 if (Field.NameOrField & 0x01)
5159 return nullptr;
5160 else
5161 return reinterpret_cast<FieldDecl *>(Field.NameOrField);
5162 }
5163
5164 void setField(FieldDecl *FD) {
5165 assert(Kind == FieldDesignator && "Only valid on a field designator")(static_cast<void> (0));
5166 Field.NameOrField = reinterpret_cast<uintptr_t>(FD);
5167 }
5168
5169 SourceLocation getDotLoc() const {
5170 assert(Kind == FieldDesignator && "Only valid on a field designator")(static_cast<void> (0));
5171 return Field.DotLoc;
5172 }
5173
5174 SourceLocation getFieldLoc() const {
5175 assert(Kind == FieldDesignator && "Only valid on a field designator")(static_cast<void> (0));
5176 return Field.FieldLoc;
5177 }
5178
5179 SourceLocation getLBracketLoc() const {
5180 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&(static_cast<void> (0))
5181 "Only valid on an array or array-range designator")(static_cast<void> (0));
5182 return ArrayOrRange.LBracketLoc;
5183 }
5184
5185 SourceLocation getRBracketLoc() const {
5186 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&(static_cast<void> (0))
5187 "Only valid on an array or array-range designator")(static_cast<void> (0));
5188 return ArrayOrRange.RBracketLoc;
5189 }
5190
5191 SourceLocation getEllipsisLoc() const {
5192 assert(Kind == ArrayRangeDesignator &&(static_cast<void> (0))
5193 "Only valid on an array-range designator")(static_cast<void> (0));
5194 return ArrayOrRange.EllipsisLoc;
5195 }
5196
5197 unsigned getFirstExprIndex() const {
5198 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&(static_cast<void> (0))
5199 "Only valid on an array or array-range designator")(static_cast<void> (0));
5200 return ArrayOrRange.Index;
5201 }
5202
5203 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
5204 if (Kind == FieldDesignator)
5205 return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc();
5206 else
5207 return getLBracketLoc();
5208 }
5209 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
5210 return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc();
5211 }
5212 SourceRange getSourceRange() const LLVM_READONLY__attribute__((__pure__)) {
5213 return SourceRange(getBeginLoc(), getEndLoc());
5214 }
5215 };
5216
5217 static DesignatedInitExpr *Create(const ASTContext &C,
5218 llvm::ArrayRef<Designator> Designators,
5219 ArrayRef<Expr*> IndexExprs,
5220 SourceLocation EqualOrColonLoc,
5221 bool GNUSyntax, Expr *Init);
5222
5223 static DesignatedInitExpr *CreateEmpty(const ASTContext &C,
5224 unsigned NumIndexExprs);
5225
5226 /// Returns the number of designators in this initializer.
5227 unsigned size() const { return NumDesignators; }
5228
5229 // Iterator access to the designators.
5230 llvm::MutableArrayRef<Designator> designators() {
5231 return {Designators, NumDesignators};
5232 }
5233
5234 llvm::ArrayRef<Designator> designators() const {
5235 return {Designators, NumDesignators};
5236 }
5237
5238 Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; }
5239 const Designator *getDesignator(unsigned Idx) const {
5240 return &designators()[Idx];
5241 }
5242
5243 void setDesignators(const ASTContext &C, const Designator *Desigs,
5244 unsigned NumDesigs);
5245
5246 Expr *getArrayIndex(const Designator &D) const;
5247 Expr *getArrayRangeStart(const Designator &D) const;
5248 Expr *getArrayRangeEnd(const Designator &D) const;
5249
5250 /// Retrieve the location of the '=' that precedes the
5251 /// initializer value itself, if present.
5252 SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; }
5253 void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; }
5254
5255 /// Whether this designated initializer should result in direct-initialization
5256 /// of the designated subobject (eg, '{.foo{1, 2, 3}}').
5257 bool isDirectInit() const { return EqualOrColonLoc.isInvalid(); }
5258
5259 /// Determines whether this designated initializer used the
5260 /// deprecated GNU syntax for designated initializers.
5261 bool usesGNUSyntax() const { return GNUSyntax; }
5262 void setGNUSyntax(bool GNU) { GNUSyntax = GNU; }
5263
5264 /// Retrieve the initializer value.
5265 Expr *getInit() const {
5266 return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin());
5267 }
5268
5269 void setInit(Expr *init) {
5270 *child_begin() = init;
5271 }
5272
5273 /// Retrieve the total number of subexpressions in this
5274 /// designated initializer expression, including the actual
5275 /// initialized value and any expressions that occur within array
5276 /// and array-range designators.
5277 unsigned getNumSubExprs() const { return NumSubExprs; }
5278
5279 Expr *getSubExpr(unsigned Idx) const {
5280 assert(Idx < NumSubExprs && "Subscript out of range")(static_cast<void> (0));
5281 return cast<Expr>(getTrailingObjects<Stmt *>()[Idx]);
5282 }
5283
5284 void setSubExpr(unsigned Idx, Expr *E) {
5285 assert(Idx < NumSubExprs && "Subscript out of range")(static_cast<void> (0));
5286 getTrailingObjects<Stmt *>()[Idx] = E;
5287 }
5288
5289 /// Replaces the designator at index @p Idx with the series
5290 /// of designators in [First, Last).
5291 void ExpandDesignator(const ASTContext &C, unsigned Idx,
5292 const Designator *First, const Designator *Last);
5293
5294 SourceRange getDesignatorsSourceRange() const;
5295
5296 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
5297 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
5298
5299 static bool classof(const Stmt *T) {
5300 return T->getStmtClass() == DesignatedInitExprClass;
5301 }
5302
5303 // Iterators
5304 child_range children() {
5305 Stmt **begin = getTrailingObjects<Stmt *>();
5306 return child_range(begin, begin + NumSubExprs);
5307 }
5308 const_child_range children() const {
5309 Stmt * const *begin = getTrailingObjects<Stmt *>();
5310 return const_child_range(begin, begin + NumSubExprs);
5311 }
5312
5313 friend TrailingObjects;
5314};
5315
5316/// Represents a place-holder for an object not to be initialized by
5317/// anything.
5318///
5319/// This only makes sense when it appears as part of an updater of a
5320/// DesignatedInitUpdateExpr (see below). The base expression of a DIUE
5321/// initializes a big object, and the NoInitExpr's mark the spots within the
5322/// big object not to be overwritten by the updater.
5323///
5324/// \see DesignatedInitUpdateExpr
5325class NoInitExpr : public Expr {
5326public:
5327 explicit NoInitExpr(QualType ty)
5328 : Expr(NoInitExprClass, ty, VK_PRValue, OK_Ordinary) {
5329 setDependence(computeDependence(this));
5330 }
5331
5332 explicit NoInitExpr(EmptyShell Empty)
5333 : Expr(NoInitExprClass, Empty) { }
5334
5335 static bool classof(const Stmt *T) {
5336 return T->getStmtClass() == NoInitExprClass;
5337 }
5338
5339 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5340 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5341
5342 // Iterators
5343 child_range children() {
5344 return child_range(child_iterator(), child_iterator());
5345 }
5346 const_child_range children() const {
5347 return const_child_range(const_child_iterator(), const_child_iterator());
5348 }
5349};
5350
5351// In cases like:
5352// struct Q { int a, b, c; };
5353// Q *getQ();
5354// void foo() {
5355// struct A { Q q; } a = { *getQ(), .q.b = 3 };
5356// }
5357//
5358// We will have an InitListExpr for a, with type A, and then a
5359// DesignatedInitUpdateExpr for "a.q" with type Q. The "base" for this DIUE
5360// is the call expression *getQ(); the "updater" for the DIUE is ".q.b = 3"
5361//
5362class DesignatedInitUpdateExpr : public Expr {
5363 // BaseAndUpdaterExprs[0] is the base expression;
5364 // BaseAndUpdaterExprs[1] is an InitListExpr overwriting part of the base.
5365 Stmt *BaseAndUpdaterExprs[2];
5366
5367public:
5368 DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc,
5369 Expr *baseExprs, SourceLocation rBraceLoc);
5370
5371 explicit DesignatedInitUpdateExpr(EmptyShell Empty)
5372 : Expr(DesignatedInitUpdateExprClass, Empty) { }
5373
5374 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__));
5375 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__));
5376
5377 static bool classof(const Stmt *T) {
5378 return T->getStmtClass() == DesignatedInitUpdateExprClass;
5379 }
5380
5381 Expr *getBase() const { return cast<Expr>(BaseAndUpdaterExprs[0]); }
5382 void setBase(Expr *Base) { BaseAndUpdaterExprs[0] = Base; }
5383
5384 InitListExpr *getUpdater() const {
5385 return cast<InitListExpr>(BaseAndUpdaterExprs[1]);
5386 }
5387 void setUpdater(Expr *Updater) { BaseAndUpdaterExprs[1] = Updater; }
5388
5389 // Iterators
5390 // children = the base and the updater
5391 child_range children() {
5392 return child_range(&BaseAndUpdaterExprs[0], &BaseAndUpdaterExprs[0] + 2);
5393 }
5394 const_child_range children() const {
5395 return const_child_range(&BaseAndUpdaterExprs[0],
5396 &BaseAndUpdaterExprs[0] + 2);
5397 }
5398};
5399
5400/// Represents a loop initializing the elements of an array.
5401///
5402/// The need to initialize the elements of an array occurs in a number of
5403/// contexts:
5404///
5405/// * in the implicit copy/move constructor for a class with an array member
5406/// * when a lambda-expression captures an array by value
5407/// * when a decomposition declaration decomposes an array
5408///
5409/// There are two subexpressions: a common expression (the source array)
5410/// that is evaluated once up-front, and a per-element initializer that
5411/// runs once for each array element.
5412///
5413/// Within the per-element initializer, the common expression may be referenced
5414/// via an OpaqueValueExpr, and the current index may be obtained via an
5415/// ArrayInitIndexExpr.
5416class ArrayInitLoopExpr : public Expr {
5417 Stmt *SubExprs[2];
5418
5419 explicit ArrayInitLoopExpr(EmptyShell Empty)
5420 : Expr(ArrayInitLoopExprClass, Empty), SubExprs{} {}
5421
5422public:
5423 explicit ArrayInitLoopExpr(QualType T, Expr *CommonInit, Expr *ElementInit)
5424 : Expr(ArrayInitLoopExprClass, T, VK_PRValue, OK_Ordinary),
5425 SubExprs{CommonInit, ElementInit} {
5426 setDependence(computeDependence(this));
5427 }
5428
5429 /// Get the common subexpression shared by all initializations (the source
5430 /// array).
5431 OpaqueValueExpr *getCommonExpr() const {
5432 return cast<OpaqueValueExpr>(SubExprs[0]);
5433 }
5434
5435 /// Get the initializer to use for each array element.
5436 Expr *getSubExpr() const { return cast<Expr>(SubExprs[1]); }
5437
5438 llvm::APInt getArraySize() const {
5439 return cast<ConstantArrayType>(getType()->castAsArrayTypeUnsafe())
5440 ->getSize();
5441 }
5442
5443 static bool classof(const Stmt *S) {
5444 return S->getStmtClass() == ArrayInitLoopExprClass;
5445 }
5446
5447 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
5448 return getCommonExpr()->getBeginLoc();
5449 }
5450 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
5451 return getCommonExpr()->getEndLoc();
5452 }
5453
5454 child_range children() {
5455 return child_range(SubExprs, SubExprs + 2);
5456 }
5457 const_child_range children() const {
5458 return const_child_range(SubExprs, SubExprs + 2);
5459 }
5460
5461 friend class ASTReader;
5462 friend class ASTStmtReader;
5463 friend class ASTStmtWriter;
5464};
5465
5466/// Represents the index of the current element of an array being
5467/// initialized by an ArrayInitLoopExpr. This can only appear within the
5468/// subexpression of an ArrayInitLoopExpr.
5469class ArrayInitIndexExpr : public Expr {
5470 explicit ArrayInitIndexExpr(EmptyShell Empty)
5471 : Expr(ArrayInitIndexExprClass, Empty) {}
5472
5473public:
5474 explicit ArrayInitIndexExpr(QualType T)
5475 : Expr(ArrayInitIndexExprClass, T, VK_PRValue, OK_Ordinary) {
5476 setDependence(ExprDependence::None);
5477 }
5478
5479 static bool classof(const Stmt *S) {
5480 return S->getStmtClass() == ArrayInitIndexExprClass;
5481 }
5482
5483 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5484 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5485
5486 child_range children() {
5487 return child_range(child_iterator(), child_iterator());
5488 }
5489 const_child_range children() const {
5490 return const_child_range(const_child_iterator(), const_child_iterator());
5491 }
5492
5493 friend class ASTReader;
5494 friend class ASTStmtReader;
5495};
5496
5497/// Represents an implicitly-generated value initialization of
5498/// an object of a given type.
5499///
5500/// Implicit value initializations occur within semantic initializer
5501/// list expressions (InitListExpr) as placeholders for subobject
5502/// initializations not explicitly specified by the user.
5503///
5504/// \see InitListExpr
5505class ImplicitValueInitExpr : public Expr {
5506public:
5507 explicit ImplicitValueInitExpr(QualType ty)
5508 : Expr(ImplicitValueInitExprClass, ty, VK_PRValue, OK_Ordinary) {
5509 setDependence(computeDependence(this));
5510 }
5511
5512 /// Construct an empty implicit value initialization.
5513 explicit ImplicitValueInitExpr(EmptyShell Empty)
5514 : Expr(ImplicitValueInitExprClass, Empty) { }
5515
5516 static bool classof(const Stmt *T) {
5517 return T->getStmtClass() == ImplicitValueInitExprClass;
5518 }
5519
5520 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5521 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return SourceLocation(); }
5522
5523 // Iterators
5524 child_range children() {
5525 return child_range(child_iterator(), child_iterator());
5526 }
5527 const_child_range children() const {
5528 return const_child_range(const_child_iterator(), const_child_iterator());
5529 }
5530};
5531
5532class ParenListExpr final
5533 : public Expr,
5534 private llvm::TrailingObjects<ParenListExpr, Stmt *> {
5535 friend class ASTStmtReader;
5536 friend TrailingObjects;
5537
5538 /// The location of the left and right parentheses.
5539 SourceLocation LParenLoc, RParenLoc;
5540
5541 /// Build a paren list.
5542 ParenListExpr(SourceLocation LParenLoc, ArrayRef<Expr *> Exprs,
5543 SourceLocation RParenLoc);
5544
5545 /// Build an empty paren list.
5546 ParenListExpr(EmptyShell Empty, unsigned NumExprs);
5547
5548public:
5549 /// Create a paren list.
5550 static ParenListExpr *Create(const ASTContext &Ctx, SourceLocation LParenLoc,
5551 ArrayRef<Expr *> Exprs,
5552 SourceLocation RParenLoc);
5553
5554 /// Create an empty paren list.
5555 static ParenListExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumExprs);
5556
5557 /// Return the number of expressions in this paren list.
5558 unsigned getNumExprs() const { return ParenListExprBits.NumExprs; }
5559
5560 Expr *getExpr(unsigned Init) {
5561 assert(Init < getNumExprs() && "Initializer access out of range!")(static_cast<void> (0));
5562 return getExprs()[Init];
5563 }
5564
5565 const Expr *getExpr(unsigned Init) const {
5566 return const_cast<ParenListExpr *>(this)->getExpr(Init);
5567 }
5568
5569 Expr **getExprs() {
5570 return reinterpret_cast<Expr **>(getTrailingObjects<Stmt *>());
5571 }
5572
5573 ArrayRef<Expr *> exprs() {
5574 return llvm::makeArrayRef(getExprs(), getNumExprs());
5575 }
5576
5577 SourceLocation getLParenLoc() const { return LParenLoc; }
5578 SourceLocation getRParenLoc() const { return RParenLoc; }
5579 SourceLocation getBeginLoc() const { return getLParenLoc(); }
5580 SourceLocation getEndLoc() const { return getRParenLoc(); }
5581
5582 static bool classof(const Stmt *T) {
5583 return T->getStmtClass() == ParenListExprClass;
5584 }
5585
5586 // Iterators
5587 child_range children() {
5588 return child_range(getTrailingObjects<Stmt *>(),
5589 getTrailingObjects<Stmt *>() + getNumExprs());
5590 }
5591 const_child_range children() const {
5592 return const_child_range(getTrailingObjects<Stmt *>(),
5593 getTrailingObjects<Stmt *>() + getNumExprs());
5594 }
5595};
5596
5597/// Represents a C11 generic selection.
5598///
5599/// A generic selection (C11 6.5.1.1) contains an unevaluated controlling
5600/// expression, followed by one or more generic associations. Each generic
5601/// association specifies a type name and an expression, or "default" and an
5602/// expression (in which case it is known as a default generic association).
5603/// The type and value of the generic selection are identical to those of its
5604/// result expression, which is defined as the expression in the generic
5605/// association with a type name that is compatible with the type of the
5606/// controlling expression, or the expression in the default generic association
5607/// if no types are compatible. For example:
5608///
5609/// @code
5610/// _Generic(X, double: 1, float: 2, default: 3)
5611/// @endcode
5612///
5613/// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f
5614/// or 3 if "hello".
5615///
5616/// As an extension, generic selections are allowed in C++, where the following
5617/// additional semantics apply:
5618///
5619/// Any generic selection whose controlling expression is type-dependent or
5620/// which names a dependent type in its association list is result-dependent,
5621/// which means that the choice of result expression is dependent.
5622/// Result-dependent generic associations are both type- and value-dependent.
5623class GenericSelectionExpr final
5624 : public Expr,
5625 private llvm::TrailingObjects<GenericSelectionExpr, Stmt *,
5626 TypeSourceInfo *> {
5627 friend class ASTStmtReader;
5628 friend class ASTStmtWriter;
5629 friend TrailingObjects;
5630
5631 /// The number of association expressions and the index of the result
5632 /// expression in the case where the generic selection expression is not
5633 /// result-dependent. The result index is equal to ResultDependentIndex
5634 /// if and only if the generic selection expression is result-dependent.
5635 unsigned NumAssocs, ResultIndex;
5636 enum : unsigned {
5637 ResultDependentIndex = std::numeric_limits<unsigned>::max(),
5638 ControllingIndex = 0,
5639 AssocExprStartIndex = 1
5640 };
5641
5642 /// The location of the "default" and of the right parenthesis.
5643 SourceLocation DefaultLoc, RParenLoc;
5644
5645 // GenericSelectionExpr is followed by several trailing objects.
5646 // They are (in order):
5647 //
5648 // * A single Stmt * for the controlling expression.
5649 // * An array of getNumAssocs() Stmt * for the association expressions.
5650 // * An array of getNumAssocs() TypeSourceInfo *, one for each of the
5651 // association expressions.
5652 unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
5653 // Add one to account for the controlling expression; the remainder
5654 // are the associated expressions.
5655 return 1 + getNumAssocs();
5656 }
5657
5658 unsigned numTrailingObjects(OverloadToken<TypeSourceInfo *>) const {
5659 return getNumAssocs();
5660 }
5661
5662 template <bool Const> class AssociationIteratorTy;
5663 /// Bundle together an association expression and its TypeSourceInfo.
5664 /// The Const template parameter is for the const and non-const versions
5665 /// of AssociationTy.
5666 template <bool Const> class AssociationTy {
5667 friend class GenericSelectionExpr;
5668 template <bool OtherConst> friend class AssociationIteratorTy;
5669 using ExprPtrTy = std::conditional_t<Const, const Expr *, Expr *>;
5670 using TSIPtrTy =
5671 std::conditional_t<Const, const TypeSourceInfo *, TypeSourceInfo *>;
5672 ExprPtrTy E;
5673 TSIPtrTy TSI;
5674 bool Selected;
5675 AssociationTy(ExprPtrTy E, TSIPtrTy TSI, bool Selected)
5676 : E(E), TSI(TSI), Selected(Selected) {}
5677
5678 public:
5679 ExprPtrTy getAssociationExpr() const { return E; }
5680 TSIPtrTy getTypeSourceInfo() const { return TSI; }
5681 QualType getType() const { return TSI ? TSI->getType() : QualType(); }
5682 bool isSelected() const { return Selected; }
5683 AssociationTy *operator->() { return this; }
5684 const AssociationTy *operator->() const { return this; }
5685 }; // class AssociationTy
5686
5687 /// Iterator over const and non-const Association objects. The Association
5688 /// objects are created on the fly when the iterator is dereferenced.
5689 /// This abstract over how exactly the association expressions and the
5690 /// corresponding TypeSourceInfo * are stored.
5691 template <bool Const>
5692 class AssociationIteratorTy
5693 : public llvm::iterator_facade_base<
5694 AssociationIteratorTy<Const>, std::input_iterator_tag,
5695 AssociationTy<Const>, std::ptrdiff_t, AssociationTy<Const>,
5696 AssociationTy<Const>> {
5697 friend class GenericSelectionExpr;
5698 // FIXME: This iterator could conceptually be a random access iterator, and
5699 // it would be nice if we could strengthen the iterator category someday.
5700 // However this iterator does not satisfy two requirements of forward
5701 // iterators:
5702 // a) reference = T& or reference = const T&
5703 // b) If It1 and It2 are both dereferenceable, then It1 == It2 if and only
5704 // if *It1 and *It2 are bound to the same objects.
5705 // An alternative design approach was discussed during review;
5706 // store an Association object inside the iterator, and return a reference
5707 // to it when dereferenced. This idea was discarded beacuse of nasty
5708 // lifetime issues:
5709 // AssociationIterator It = ...;
5710 // const Association &Assoc = *It++; // Oops, Assoc is dangling.
5711 using BaseTy = typename AssociationIteratorTy::iterator_facade_base;
5712 using StmtPtrPtrTy =
5713 std::conditional_t<Const, const Stmt *const *, Stmt **>;
5714 using TSIPtrPtrTy = std::conditional_t<Const, const TypeSourceInfo *const *,
5715 TypeSourceInfo **>;
5716 StmtPtrPtrTy E; // = nullptr; FIXME: Once support for gcc 4.8 is dropped.
5717 TSIPtrPtrTy TSI; // Kept in sync with E.
5718 unsigned Offset = 0, SelectedOffset = 0;
5719 AssociationIteratorTy(StmtPtrPtrTy E, TSIPtrPtrTy TSI, unsigned Offset,
5720 unsigned SelectedOffset)
5721 : E(E), TSI(TSI), Offset(Offset), SelectedOffset(SelectedOffset) {}
5722
5723 public:
5724 AssociationIteratorTy() : E(nullptr), TSI(nullptr) {}
5725 typename BaseTy::reference operator*() const {
5726 return AssociationTy<Const>(cast<Expr>(*E), *TSI,
5727 Offset == SelectedOffset);
5728 }
5729 typename BaseTy::pointer operator->() const { return **this; }
5730 using BaseTy::operator++;
5731 AssociationIteratorTy &operator++() {
5732 ++E;
5733 ++TSI;
5734 ++Offset;
5735 return *this;
5736 }
5737 bool operator==(AssociationIteratorTy Other) const { return E == Other.E; }
5738 }; // class AssociationIterator
5739
5740 /// Build a non-result-dependent generic selection expression.
5741 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc,
5742 Expr *ControllingExpr,
5743 ArrayRef<TypeSourceInfo *> AssocTypes,
5744 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
5745 SourceLocation RParenLoc,
5746 bool ContainsUnexpandedParameterPack,
5747 unsigned ResultIndex);
5748
5749 /// Build a result-dependent generic selection expression.
5750 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc,
5751 Expr *ControllingExpr,
5752 ArrayRef<TypeSourceInfo *> AssocTypes,
5753 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
5754 SourceLocation RParenLoc,
5755 bool ContainsUnexpandedParameterPack);
5756
5757 /// Build an empty generic selection expression for deserialization.
5758 explicit GenericSelectionExpr(EmptyShell Empty, unsigned NumAssocs);
5759
5760public:
5761 /// Create a non-result-dependent generic selection expression.
5762 static GenericSelectionExpr *
5763 Create(const ASTContext &Context, SourceLocation GenericLoc,
5764 Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes,
5765 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
5766 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack,
5767 unsigned ResultIndex);
5768
5769 /// Create a result-dependent generic selection expression.
5770 static GenericSelectionExpr *
5771 Create(const ASTContext &Context, SourceLocation GenericLoc,
5772 Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes,
5773 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
5774 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack);
5775
5776 /// Create an empty generic selection expression for deserialization.
5777 static GenericSelectionExpr *CreateEmpty(const ASTContext &Context,
5778 unsigned NumAssocs);
5779
5780 using Association = AssociationTy<false>;
5781 using ConstAssociation = AssociationTy<true>;
5782 using AssociationIterator = AssociationIteratorTy<false>;
5783 using ConstAssociationIterator = AssociationIteratorTy<true>;
5784 using association_range = llvm::iterator_range<AssociationIterator>;
5785 using const_association_range =
5786 llvm::iterator_range<ConstAssociationIterator>;
5787
5788 /// The number of association expressions.
5789 unsigned getNumAssocs() const { return NumAssocs; }
5790
5791 /// The zero-based index of the result expression's generic association in
5792 /// the generic selection's association list. Defined only if the
5793 /// generic selection is not result-dependent.
5794 unsigned getResultIndex() const {
5795 assert(!isResultDependent() &&(static_cast<void> (0))
5796 "Generic selection is result-dependent but getResultIndex called!")(static_cast<void> (0));
5797 return ResultIndex;
5798 }
5799
5800 /// Whether this generic selection is result-dependent.
5801 bool isResultDependent() const { return ResultIndex == ResultDependentIndex; }
5802
5803 /// Return the controlling expression of this generic selection expression.
5804 Expr *getControllingExpr() {
5805 return cast<Expr>(getTrailingObjects<Stmt *>()[ControllingIndex]);
5806 }
5807 const Expr *getControllingExpr() const {
5808 return cast<Expr>(getTrailingObjects<Stmt *>()[ControllingIndex]);
5809 }
5810
5811 /// Return the result expression of this controlling expression. Defined if
5812 /// and only if the generic selection expression is not result-dependent.
5813 Expr *getResultExpr() {
5814 return cast<Expr>(
5815 getTrailingObjects<Stmt *>()[AssocExprStartIndex + getResultIndex()]);
5816 }
5817 const Expr *getResultExpr() const {
5818 return cast<Expr>(
5819 getTrailingObjects<Stmt *>()[AssocExprStartIndex + getResultIndex()]);
5820 }
5821
5822 ArrayRef<Expr *> getAssocExprs() const {
5823 return {reinterpret_cast<Expr *const *>(getTrailingObjects<Stmt *>() +
5824 AssocExprStartIndex),
5825 NumAssocs};
5826 }
5827 ArrayRef<TypeSourceInfo *> getAssocTypeSourceInfos() const {
5828 return {getTrailingObjects<TypeSourceInfo *>(), NumAssocs};
5829 }
5830
5831 /// Return the Ith association expression with its TypeSourceInfo,
5832 /// bundled together in GenericSelectionExpr::(Const)Association.
5833 Association getAssociation(unsigned I) {
5834 assert(I < getNumAssocs() &&(static_cast<void> (0))
5835 "Out-of-range index in GenericSelectionExpr::getAssociation!")(static_cast<void> (0));
5836 return Association(
5837 cast<Expr>(getTrailingObjects<Stmt *>()[AssocExprStartIndex + I]),
5838 getTrailingObjects<TypeSourceInfo *>()[I],
5839 !isResultDependent() && (getResultIndex() == I));
5840 }
5841 ConstAssociation getAssociation(unsigned I) const {
5842 assert(I < getNumAssocs() &&(static_cast<void> (0))
5843 "Out-of-range index in GenericSelectionExpr::getAssociation!")(static_cast<void> (0));
5844 return ConstAssociation(
5845 cast<Expr>(getTrailingObjects<Stmt *>()[AssocExprStartIndex + I]),
5846 getTrailingObjects<TypeSourceInfo *>()[I],
5847 !isResultDependent() && (getResultIndex() == I));
5848 }
5849
5850 association_range associations() {
5851 AssociationIterator Begin(getTrailingObjects<Stmt *>() +
5852 AssocExprStartIndex,
5853 getTrailingObjects<TypeSourceInfo *>(),
5854 /*Offset=*/0, ResultIndex);
5855 AssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs,
5856 /*Offset=*/NumAssocs, ResultIndex);
5857 return llvm::make_range(Begin, End);
5858 }
5859
5860 const_association_range associations() const {
5861 ConstAssociationIterator Begin(getTrailingObjects<Stmt *>() +
5862 AssocExprStartIndex,
5863 getTrailingObjects<TypeSourceInfo *>(),
5864 /*Offset=*/0, ResultIndex);
5865 ConstAssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs,
5866 /*Offset=*/NumAssocs, ResultIndex);
5867 return llvm::make_range(Begin, End);
5868 }
5869
5870 SourceLocation getGenericLoc() const {
5871 return GenericSelectionExprBits.GenericLoc;
5872 }
5873 SourceLocation getDefaultLoc() const { return DefaultLoc; }
5874 SourceLocation getRParenLoc() const { return RParenLoc; }
5875 SourceLocation getBeginLoc() const { return getGenericLoc(); }
5876 SourceLocation getEndLoc() const { return getRParenLoc(); }
5877
5878 static bool classof(const Stmt *T) {
5879 return T->getStmtClass() == GenericSelectionExprClass;
5880 }
5881
5882 child_range children() {
5883 return child_range(getTrailingObjects<Stmt *>(),
5884 getTrailingObjects<Stmt *>() +
5885 numTrailingObjects(OverloadToken<Stmt *>()));
5886 }
5887 const_child_range children() const {
5888 return const_child_range(getTrailingObjects<Stmt *>(),
5889 getTrailingObjects<Stmt *>() +
5890 numTrailingObjects(OverloadToken<Stmt *>()));
5891 }
5892};
5893
5894//===----------------------------------------------------------------------===//
5895// Clang Extensions
5896//===----------------------------------------------------------------------===//
5897
5898/// ExtVectorElementExpr - This represents access to specific elements of a
5899/// vector, and may occur on the left hand side or right hand side. For example
5900/// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector.
5901///
5902/// Note that the base may have either vector or pointer to vector type, just
5903/// like a struct field reference.
5904///
5905class ExtVectorElementExpr : public Expr {
5906 Stmt *Base;
5907 IdentifierInfo *Accessor;
5908 SourceLocation AccessorLoc;
5909public:
5910 ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base,
5911 IdentifierInfo &accessor, SourceLocation loc)
5912 : Expr(ExtVectorElementExprClass, ty, VK,
5913 (VK == VK_PRValue ? OK_Ordinary : OK_VectorComponent)),
5914 Base(base), Accessor(&accessor), AccessorLoc(loc) {
5915 setDependence(computeDependence(this));
5916 }
5917
5918 /// Build an empty vector element expression.
5919 explicit ExtVectorElementExpr(EmptyShell Empty)
5920 : Expr(ExtVectorElementExprClass, Empty) { }
5921
5922 const Expr *getBase() const { return cast<Expr>(Base); }
5923 Expr *getBase() { return cast<Expr>(Base); }
5924 void setBase(Expr *E) { Base = E; }
5925
5926 IdentifierInfo &getAccessor() const { return *Accessor; }
5927 void setAccessor(IdentifierInfo *II) { Accessor = II; }
5928
5929 SourceLocation getAccessorLoc() const { return AccessorLoc; }
5930 void setAccessorLoc(SourceLocation L) { AccessorLoc = L; }
5931
5932 /// getNumElements - Get the number of components being selected.
5933 unsigned getNumElements() const;
5934
5935 /// containsDuplicateElements - Return true if any element access is
5936 /// repeated.
5937 bool containsDuplicateElements() const;
5938
5939 /// getEncodedElementAccess - Encode the elements accessed into an llvm
5940 /// aggregate Constant of ConstantInt(s).
5941 void getEncodedElementAccess(SmallVectorImpl<uint32_t> &Elts) const;
5942
5943 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
5944 return getBase()->getBeginLoc();
5945 }
5946 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return AccessorLoc; }
5947
5948 /// isArrow - Return true if the base expression is a pointer to vector,
5949 /// return false if the base expression is a vector.
5950 bool isArrow() const;
5951
5952 static bool classof(const Stmt *T) {
5953 return T->getStmtClass() == ExtVectorElementExprClass;
5954 }
5955
5956 // Iterators
5957 child_range children() { return child_range(&Base, &Base+1); }
5958 const_child_range children() const {
5959 return const_child_range(&Base, &Base + 1);
5960 }
5961};
5962
5963/// BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
5964/// ^{ statement-body } or ^(int arg1, float arg2){ statement-body }
5965class BlockExpr : public Expr {
5966protected:
5967 BlockDecl *TheBlock;
5968public:
5969 BlockExpr(BlockDecl *BD, QualType ty)
5970 : Expr(BlockExprClass, ty, VK_PRValue, OK_Ordinary), TheBlock(BD) {
5971 setDependence(computeDependence(this));
5972 }
5973
5974 /// Build an empty block expression.
5975 explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { }
5976
5977 const BlockDecl *getBlockDecl() const { return TheBlock; }
5978 BlockDecl *getBlockDecl() { return TheBlock; }
5979 void setBlockDecl(BlockDecl *BD) { TheBlock = BD; }
5980
5981 // Convenience functions for probing the underlying BlockDecl.
5982 SourceLocation getCaretLocation() const;
5983 const Stmt *getBody() const;
5984 Stmt *getBody();
5985
5986 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
5987 return getCaretLocation();
5988 }
5989 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
5990 return getBody()->getEndLoc();
5991 }
5992
5993 /// getFunctionType - Return the underlying function type for this block.
5994 const FunctionProtoType *getFunctionType() const;
5995
5996 static bool classof(const Stmt *T) {
5997 return T->getStmtClass() == BlockExprClass;
5998 }
5999
6000 // Iterators
6001 child_range children() {
6002 return child_range(child_iterator(), child_iterator());
6003 }
6004 const_child_range children() const {
6005 return const_child_range(const_child_iterator(), const_child_iterator());
6006 }
6007};
6008
6009/// Copy initialization expr of a __block variable and a boolean flag that
6010/// indicates whether the expression can throw.
6011struct BlockVarCopyInit {
6012 BlockVarCopyInit() = default;
6013 BlockVarCopyInit(Expr *CopyExpr, bool CanThrow)
6014 : ExprAndFlag(CopyExpr, CanThrow) {}
6015 void setExprAndFlag(Expr *CopyExpr, bool CanThrow) {
6016 ExprAndFlag.setPointerAndInt(CopyExpr, CanThrow);
6017 }
6018 Expr *getCopyExpr() const { return ExprAndFlag.getPointer(); }
6019 bool canThrow() const { return ExprAndFlag.getInt(); }
6020 llvm::PointerIntPair<Expr *, 1, bool> ExprAndFlag;
6021};
6022
6023/// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2]
6024/// This AST node provides support for reinterpreting a type to another
6025/// type of the same size.
6026class AsTypeExpr : public Expr {
6027private:
6028 Stmt *SrcExpr;
6029 SourceLocation BuiltinLoc, RParenLoc;
6030
6031 friend class ASTReader;
6032 friend class ASTStmtReader;
6033 explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {}
6034
6035public:
6036 AsTypeExpr(Expr *SrcExpr, QualType DstType, ExprValueKind VK,
6037 ExprObjectKind OK, SourceLocation BuiltinLoc,
6038 SourceLocation RParenLoc)
6039 : Expr(AsTypeExprClass, DstType, VK, OK), SrcExpr(SrcExpr),
6040 BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {
6041 setDependence(computeDependence(this));
6042 }
6043
6044 /// getSrcExpr - Return the Expr to be converted.
6045 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
6046
6047 /// getBuiltinLoc - Return the location of the __builtin_astype token.
6048 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
6049
6050 /// getRParenLoc - Return the location of final right parenthesis.
6051 SourceLocation getRParenLoc() const { return RParenLoc; }
6052
6053 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
6054 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
6055
6056 static bool classof(const Stmt *T) {
6057 return T->getStmtClass() == AsTypeExprClass;
6058 }
6059
6060 // Iterators
6061 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
6062 const_child_range children() const {
6063 return const_child_range(&SrcExpr, &SrcExpr + 1);
6064 }
6065};
6066
6067/// PseudoObjectExpr - An expression which accesses a pseudo-object
6068/// l-value. A pseudo-object is an abstract object, accesses to which
6069/// are translated to calls. The pseudo-object expression has a
6070/// syntactic form, which shows how the expression was actually
6071/// written in the source code, and a semantic form, which is a series
6072/// of expressions to be executed in order which detail how the
6073/// operation is actually evaluated. Optionally, one of the semantic
6074/// forms may also provide a result value for the expression.
6075///
6076/// If any of the semantic-form expressions is an OpaqueValueExpr,
6077/// that OVE is required to have a source expression, and it is bound
6078/// to the result of that source expression. Such OVEs may appear
6079/// only in subsequent semantic-form expressions and as
6080/// sub-expressions of the syntactic form.
6081///
6082/// PseudoObjectExpr should be used only when an operation can be
6083/// usefully described in terms of fairly simple rewrite rules on
6084/// objects and functions that are meant to be used by end-developers.
6085/// For example, under the Itanium ABI, dynamic casts are implemented
6086/// as a call to a runtime function called __dynamic_cast; using this
6087/// class to describe that would be inappropriate because that call is
6088/// not really part of the user-visible semantics, and instead the
6089/// cast is properly reflected in the AST and IR-generation has been
6090/// taught to generate the call as necessary. In contrast, an
6091/// Objective-C property access is semantically defined to be
6092/// equivalent to a particular message send, and this is very much
6093/// part of the user model. The name of this class encourages this
6094/// modelling design.
6095class PseudoObjectExpr final
6096 : public Expr,
6097 private llvm::TrailingObjects<PseudoObjectExpr, Expr *> {
6098 // PseudoObjectExprBits.NumSubExprs - The number of sub-expressions.
6099 // Always at least two, because the first sub-expression is the
6100 // syntactic form.
6101
6102 // PseudoObjectExprBits.ResultIndex - The index of the
6103 // sub-expression holding the result. 0 means the result is void,
6104 // which is unambiguous because it's the index of the syntactic
6105 // form. Note that this is therefore 1 higher than the value passed
6106 // in to Create, which is an index within the semantic forms.
6107 // Note also that ASTStmtWriter assumes this encoding.
6108
6109 Expr **getSubExprsBuffer() { return getTrailingObjects<Expr *>(); }
6110 const Expr * const *getSubExprsBuffer() const {
6111 return getTrailingObjects<Expr *>();
6112 }
6113
6114 PseudoObjectExpr(QualType type, ExprValueKind VK,
6115 Expr *syntactic, ArrayRef<Expr*> semantic,
6116 unsigned resultIndex);
6117
6118 PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs);
6119
6120 unsigned getNumSubExprs() const {
6121 return PseudoObjectExprBits.NumSubExprs;
6122 }
6123
6124public:
6125 /// NoResult - A value for the result index indicating that there is
6126 /// no semantic result.
6127 enum : unsigned { NoResult = ~0U };
6128
6129 static PseudoObjectExpr *Create(const ASTContext &Context, Expr *syntactic,
6130 ArrayRef<Expr*> semantic,
6131 unsigned resultIndex);
6132
6133 static PseudoObjectExpr *Create(const ASTContext &Context, EmptyShell shell,
6134 unsigned numSemanticExprs);
6135
6136 /// Return the syntactic form of this expression, i.e. the
6137 /// expression it actually looks like. Likely to be expressed in
6138 /// terms of OpaqueValueExprs bound in the semantic form.
6139 Expr *getSyntacticForm() { return getSubExprsBuffer()[0]; }
6140 const Expr *getSyntacticForm() const { return getSubExprsBuffer()[0]; }
6141
6142 /// Return the index of the result-bearing expression into the semantics
6143 /// expressions, or PseudoObjectExpr::NoResult if there is none.
6144 unsigned getResultExprIndex() const {
6145 if (PseudoObjectExprBits.ResultIndex == 0) return NoResult;
6146 return PseudoObjectExprBits.ResultIndex - 1;
6147 }
6148
6149 /// Return the result-bearing expression, or null if there is none.
6150 Expr *getResultExpr() {
6151 if (PseudoObjectExprBits.ResultIndex == 0)
6152 return nullptr;
6153 return getSubExprsBuffer()[PseudoObjectExprBits.ResultIndex];
6154 }
6155 const Expr *getResultExpr() const {
6156 return const_cast<PseudoObjectExpr*>(this)->getResultExpr();
6157 }
6158
6159 unsigned getNumSemanticExprs() const { return getNumSubExprs() - 1; }
6160
6161 typedef Expr * const *semantics_iterator;
6162 typedef const Expr * const *const_semantics_iterator;
6163 semantics_iterator semantics_begin() {
6164 return getSubExprsBuffer() + 1;
6165 }
6166 const_semantics_iterator semantics_begin() const {
6167 return getSubExprsBuffer() + 1;
6168 }
6169 semantics_iterator semantics_end() {
6170 return getSubExprsBuffer() + getNumSubExprs();
6171 }
6172 const_semantics_iterator semantics_end() const {
6173 return getSubExprsBuffer() + getNumSubExprs();
6174 }
6175
6176 llvm::iterator_range<semantics_iterator> semantics() {
6177 return llvm::make_range(semantics_begin(), semantics_end());
6178 }
6179 llvm::iterator_range<const_semantics_iterator> semantics() const {
6180 return llvm::make_range(semantics_begin(), semantics_end());
6181 }
6182
6183 Expr *getSemanticExpr(unsigned index) {
6184 assert(index + 1 < getNumSubExprs())(static_cast<void> (0));
6185 return getSubExprsBuffer()[index + 1];
6186 }
6187 const Expr *getSemanticExpr(unsigned index) const {
6188 return const_cast<PseudoObjectExpr*>(this)->getSemanticExpr(index);
6189 }
6190
6191 SourceLocation getExprLoc() const LLVM_READONLY__attribute__((__pure__)) {
6192 return getSyntacticForm()->getExprLoc();
6193 }
6194
6195 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) {
6196 return getSyntacticForm()->getBeginLoc();
6197 }
6198 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) {
6199 return getSyntacticForm()->getEndLoc();
6200 }
6201
6202 child_range children() {
6203 const_child_range CCR =
6204 const_cast<const PseudoObjectExpr *>(this)->children();
6205 return child_range(cast_away_const(CCR.begin()),
6206 cast_away_const(CCR.end()));
6207 }
6208 const_child_range children() const {
6209 Stmt *const *cs = const_cast<Stmt *const *>(
6210 reinterpret_cast<const Stmt *const *>(getSubExprsBuffer()));
6211 return const_child_range(cs, cs + getNumSubExprs());
6212 }
6213
6214 static bool classof(const Stmt *T) {
6215 return T->getStmtClass() == PseudoObjectExprClass;
6216 }
6217
6218 friend TrailingObjects;
6219 friend class ASTStmtReader;
6220};
6221
6222/// AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*,
6223/// __atomic_load, __atomic_store, and __atomic_compare_exchange_*, for the
6224/// similarly-named C++11 instructions, and __c11 variants for <stdatomic.h>,
6225/// and corresponding __opencl_atomic_* for OpenCL 2.0.
6226/// All of these instructions take one primary pointer, at least one memory
6227/// order. The instructions for which getScopeModel returns non-null value
6228/// take one synch scope.
6229class AtomicExpr : public Expr {
6230public:
6231 enum AtomicOp {
6232#define BUILTIN(ID, TYPE, ATTRS)
6233#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID,
6234#include "clang/Basic/Builtins.def"
6235 // Avoid trailing comma
6236 BI_First = 0
6237 };
6238
6239private:
6240 /// Location of sub-expressions.
6241 /// The location of Scope sub-expression is NumSubExprs - 1, which is
6242 /// not fixed, therefore is not defined in enum.
6243 enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR };
6244 Stmt *SubExprs[END_EXPR + 1];
6245 unsigned NumSubExprs;
6246 SourceLocation BuiltinLoc, RParenLoc;
6247 AtomicOp Op;
6248
6249 friend class ASTStmtReader;
6250public:
6251 AtomicExpr(SourceLocation BLoc, ArrayRef<Expr*> args, QualType t,
6252 AtomicOp op, SourceLocation RP);
6253
6254 /// Determine the number of arguments the specified atomic builtin
6255 /// should have.
6256 static unsigned getNumSubExprs(AtomicOp Op);
6257
6258 /// Build an empty AtomicExpr.
6259 explicit AtomicExpr(EmptyShell Empty) : Expr(AtomicExprClass, Empty) { }
6260
6261 Expr *getPtr() const {
6262 return cast<Expr>(SubExprs[PTR]);
6263 }
6264 Expr *getOrder() const {
6265 return cast<Expr>(SubExprs[ORDER]);
6266 }
6267 Expr *getScope() const {
6268 assert(getScopeModel() && "No scope")(static_cast<void> (0));
6269 return cast<Expr>(SubExprs[NumSubExprs - 1]);
6270 }
6271 Expr *getVal1() const {
6272 if (Op == AO__c11_atomic_init || Op == AO__opencl_atomic_init)
6273 return cast<Expr>(SubExprs[ORDER]);
6274 assert(NumSubExprs > VAL1)(static_cast<void> (0));
6275 return cast<Expr>(SubExprs[VAL1]);
6276 }
6277 Expr *getOrderFail() const {
6278 assert(NumSubExprs > ORDER_FAIL)(static_cast<void> (0));
6279 return cast<Expr>(SubExprs[ORDER_FAIL]);
6280 }
6281 Expr *getVal2() const {
6282 if (Op == AO__atomic_exchange)
6283 return cast<Expr>(SubExprs[ORDER_FAIL]);
6284 assert(NumSubExprs > VAL2)(static_cast<void> (0));
6285 return cast<Expr>(SubExprs[VAL2]);
6286 }
6287 Expr *getWeak() const {
6288 assert(NumSubExprs > WEAK)(static_cast<void> (0));
6289 return cast<Expr>(SubExprs[WEAK]);
6290 }
6291 QualType getValueType() const;
6292
6293 AtomicOp getOp() const { return Op; }
6294 unsigned getNumSubExprs() const { return NumSubExprs; }
6295
6296 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
6297 const Expr * const *getSubExprs() const {
6298 return reinterpret_cast<Expr * const *>(SubExprs);
6299 }
6300
6301 bool isVolatile() const {
6302 return getPtr()->getType()->getPointeeType().isVolatileQualified();
6303 }
6304
6305 bool isCmpXChg() const {
6306 return getOp() == AO__c11_atomic_compare_exchange_strong ||
6307 getOp() == AO__c11_atomic_compare_exchange_weak ||
6308 getOp() == AO__opencl_atomic_compare_exchange_strong ||
6309 getOp() == AO__opencl_atomic_compare_exchange_weak ||
6310 getOp() == AO__atomic_compare_exchange ||
6311 getOp() == AO__atomic_compare_exchange_n;
6312 }
6313
6314 bool isOpenCL() const {
6315 return getOp() >= AO__opencl_atomic_init &&
6316 getOp() <= AO__opencl_atomic_fetch_max;
6317 }
6318
6319 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
6320 SourceLocation getRParenLoc() const { return RParenLoc; }
6321
6322 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return BuiltinLoc; }
6323 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return RParenLoc; }
6324
6325 static bool classof(const Stmt *T) {
6326 return T->getStmtClass() == AtomicExprClass;
6327 }
6328
6329 // Iterators
6330 child_range children() {
6331 return child_range(SubExprs, SubExprs+NumSubExprs);
6332 }
6333 const_child_range children() const {
6334 return const_child_range(SubExprs, SubExprs + NumSubExprs);
6335 }
6336
6337 /// Get atomic scope model for the atomic op code.
6338 /// \return empty atomic scope model if the atomic op code does not have
6339 /// scope operand.
6340 static std::unique_ptr<AtomicScopeModel> getScopeModel(AtomicOp Op) {
6341 auto Kind =
6342 (Op >= AO__opencl_atomic_load && Op <= AO__opencl_atomic_fetch_max)
6343 ? AtomicScopeModelKind::OpenCL
6344 : AtomicScopeModelKind::None;
6345 return AtomicScopeModel::create(Kind);
6346 }
6347
6348 /// Get atomic scope model.
6349 /// \return empty atomic scope model if this atomic expression does not have
6350 /// scope operand.
6351 std::unique_ptr<AtomicScopeModel> getScopeModel() const {
6352 return getScopeModel(getOp());
6353 }
6354};
6355
6356/// TypoExpr - Internal placeholder for expressions where typo correction
6357/// still needs to be performed and/or an error diagnostic emitted.
6358class TypoExpr : public Expr {
6359 // The location for the typo name.
6360 SourceLocation TypoLoc;
6361
6362public:
6363 TypoExpr(QualType T, SourceLocation TypoLoc)
6364 : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary), TypoLoc(TypoLoc) {
6365 assert(T->isDependentType() && "TypoExpr given a non-dependent type")(static_cast<void> (0));
6366 setDependence(ExprDependence::TypeValueInstantiation |
6367 ExprDependence::Error);
6368 }
6369
6370 child_range children() {
6371 return child_range(child_iterator(), child_iterator());
6372 }
6373 const_child_range children() const {
6374 return const_child_range(const_child_iterator(), const_child_iterator());
6375 }
6376
6377 SourceLocation getBeginLoc() const LLVM_READONLY__attribute__((__pure__)) { return TypoLoc; }
6378 SourceLocation getEndLoc() const LLVM_READONLY__attribute__((__pure__)) { return TypoLoc; }
6379
6380 static bool classof(const Stmt *T) {
6381 return T->getStmtClass() == TypoExprClass;
6382 }
6383
6384};
6385
6386/// Frontend produces RecoveryExprs on semantic errors that prevent creating
6387/// other well-formed expressions. E.g. when type-checking of a binary operator
6388/// fails, we cannot produce a BinaryOperator expression. Instead, we can choose
6389/// to produce a recovery expression storing left and right operands.
6390///
6391/// RecoveryExpr does not have any semantic meaning in C++, it is only useful to
6392/// preserve expressions in AST that would otherwise be dropped. It captures
6393/// subexpressions of some expression that we could not construct and source
6394/// range covered by the expression.
6395///
6396/// By default, RecoveryExpr uses dependence-bits to take advantage of existing
6397/// machinery to deal with dependent code in C++, e.g. RecoveryExpr is preserved
6398/// in `decltype(<broken-expr>)` as part of the `DependentDecltypeType`. In
6399/// addition to that, clang does not report most errors on dependent
6400/// expressions, so we get rid of bogus errors for free. However, note that
6401/// unlike other dependent expressions, RecoveryExpr can be produced in
6402/// non-template contexts.
6403///
6404/// We will preserve the type in RecoveryExpr when the type is known, e.g.
6405/// preserving the return type for a broken non-overloaded function call, a
6406/// overloaded call where all candidates have the same return type. In this
6407/// case, the expression is not type-dependent (unless the known type is itself
6408/// dependent)
6409///
6410/// One can also reliably suppress all bogus errors on expressions containing
6411/// recovery expressions by examining results of Expr::containsErrors().
6412class RecoveryExpr final : public Expr,
6413 private llvm::TrailingObjects<RecoveryExpr, Expr *> {
6414public:
6415 static RecoveryExpr *Create(ASTContext &Ctx, QualType T,
6416 SourceLocation BeginLoc, SourceLocation EndLoc,
6417 ArrayRef<Expr *> SubExprs);
6418 static RecoveryExpr *CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs);
6419
6420 ArrayRef<Expr *> subExpressions() {
6421 auto *B = getTrailingObjects<Expr *>();
6422 return llvm::makeArrayRef(B, B + NumExprs);
6423 }
6424
6425 ArrayRef<const Expr *> subExpressions() const {
6426 return const_cast<RecoveryExpr *>(this)->subExpressions();
6427 }
6428
6429 child_range children() {
6430 Stmt **B = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
6431 return child_range(B, B + NumExprs);
6432 }
6433
6434 SourceLocation getBeginLoc() const { return BeginLoc; }
6435 SourceLocation getEndLoc() const { return EndLoc; }
6436
6437 static bool classof(const Stmt *T) {
6438 return T->getStmtClass() == RecoveryExprClass;
6439 }
6440
6441private:
6442 RecoveryExpr(ASTContext &Ctx, QualType T, SourceLocation BeginLoc,
6443 SourceLocation EndLoc, ArrayRef<Expr *> SubExprs);
6444 RecoveryExpr(EmptyShell Empty, unsigned NumSubExprs)
6445 : Expr(RecoveryExprClass, Empty), NumExprs(NumSubExprs) {}
6446
6447 size_t numTrailingObjects(OverloadToken<Stmt *>) const { return NumExprs; }
6448
6449 SourceLocation BeginLoc, EndLoc;
6450 unsigned NumExprs;
6451 friend TrailingObjects;
6452 friend class ASTStmtReader;
6453 friend class ASTStmtWriter;
6454};
6455
6456} // end namespace clang
6457
6458#endif // LLVM_CLANG_AST_EXPR_H