summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Fixing a FIXME; the RetTy template parameter is always bool in practice, and ↵Aaron Ballman2014-01-031-48/+47
| | | | | | so it has been removed. No functional changes intended. llvm-svn: 198440
* Eliminate UnaryTypeTraitExprAlp Toker2014-01-011-5/+0
| | | | | | | | | | | | | Remove UnaryTypeTraitExpr and switch all remaining type trait related handling over to TypeTraitExpr. The UTT/BTT/TT enum prefix and evaluation code is retained pending further cleanup. This is part of the ongoing work to unify type traits following the removal of BinaryTypeTraitExpr in r197273. llvm-svn: 198271
* Rename isBuiltinCall() to getBuiltinCallee()Alp Toker2013-12-281-7/+7
| | | | | | | | This better describes what the function does. Cleanup only. llvm-svn: 198127
* Eliminate BinaryTypeTraitExprAlp Toker2013-12-131-5/+0
| | | | | | | | | | | | | | | | | There's nothing special about type traits accepting two arguments. This commit eliminates BinaryTypeTraitExpr and switches all related handling over to TypeTraitExpr. Also fixes a CodeGen failure with variadic type traits appearing in a non-constant expression. The BTT/TT prefix and evaluation code is retained as-is for now but will soon be further cleaned up. This is part of the ongoing work to unify type traits. llvm-svn: 197273
* Add front-end infrastructure now address space casts are in LLVM IR.David Tweed2013-12-111-0/+2
| | | | | | | | | | With the introduction of explicit address space casts into LLVM, there's a need to provide a new cast kind the front-end can create for C/OpenCL/CUDA and code to produce address space casts from those kinds when appropriate. Patch by Michele Scandale! llvm-svn: 197036
* Modern gcc is happy to constant evaluate __builtin_strlen in various casesRichard Smith2013-11-151-17/+42
| | | | | | | where we didn't. Extend our constant evaluation for __builtin_strlen to handle any constant array of chars, not just string literals, to match. llvm-svn: 194762
* PR17615: A delegating constructor initializer is a full-expression. Don'tRichard Smith2013-11-071-2/+5
| | | | | | forget to clean up temporaries at the end of it. llvm-svn: 194213
* Silencing some MSVC warnings about not all control paths returning a value ↵Aaron Ballman2013-11-061-0/+2
| | | | | | when they actually do. llvm-svn: 194156
* More constant evaluation cleanup, and fix an issue where we'd override anRichard Smith2013-11-061-22/+25
| | | | | | | earlier 'non-constant' diagnostic with a later one if the earlier one was from a side-effect we thought we could evaluate past. llvm-svn: 194117
* Simplify: we don't care why constant evaluation might have failed when we'reRichard Smith2013-11-051-6/+3
| | | | | | checking an expression for constant overflow. llvm-svn: 194099
* Refactor constant expression handling and make a couple of tweaks to make it aRichard Smith2013-11-051-64/+156
| | | | | | | | | bit more robust against future changes. This includes a slight diagnostic improvement: if we know we're only trying to form a constant expression, take the first diagnostic which shows the expression is not a constant expression, rather than preferring the first one which makes the expression unfoldable. llvm-svn: 194098
* Add constant evaluation support for __builtin_isinf, __builtin_isfinite,Richard Smith2013-10-151-0/+24
| | | | | | __builtin_isnan, and __builtin_isnormal. Patch by Karthik Bhat! Tests by me. llvm-svn: 192729
* Fix comment to match name of variable.Nick Lewycky2013-09-221-1/+1
| | | | llvm-svn: 191171
* Add the intrinsic __builtin_convertvectorHal Finkel2013-09-181-0/+1
| | | | | | | | | | | | | | | | | | LLVM supports applying conversion instructions to vectors of the same number of elements (fptrunc, fptosi, etc.) but there had been no way for a Clang user to cause such instructions to be generated when using builtin vector types. C-style casting on vectors is already defined in terms of bitcasts, and so cannot be used for these conversions as well (without leading to a very confusing set of semantics). As a result, this adds a __builtin_convertvector intrinsic (patterned after the OpenCL __builtin_astype intrinsic). This is intended to aid the creation of vector intrinsic headers that create generic IR instead of target-dependent intrinsics (in other words, this is a generic _mm_cvtepi32_ps). As noted in the documentation, the action of __builtin_convertvector is defined in terms of the action of a C-style cast on each vector element. llvm-svn: 190915
* Fix const-eval of vector init-lists of a vector.Eli Friedman2013-09-171-1/+1
| | | | | | | | | Like any other type, an init list for a vector can have the same type as the vector itself; handle that case. <rdar://problem/14990460> llvm-svn: 190844
* Part three of PR15721: if we have an invalid CXXDefaultInitExpr, don't crash ifRichard Smith2013-09-131-2/+6
| | | | | | we try to constant-evaluate it. Patch by Karthik Bhat, test by me. llvm-svn: 190722
* PR5683: Issue a warning when subtracting pointers to types of zero size, andRichard Smith2013-09-101-0/+9
| | | | | | | treat such subtractions as being non-constant. Patch by Serge Pavlov! With a few tweaks by me. llvm-svn: 190439
* Adjust clang for change to APFloat::toString.Eli Friedman2013-08-291-1/+10
| | | | | | | | I changed the diagnostic printing code because it's probably better to cut off a digit from DBL_MAX than to print something like 1.300000001 when the user wrote 1.3. llvm-svn: 189625
* Constify more uses of ASTContext&. No functional change.Craig Topper2013-08-221-7/+8
| | | | llvm-svn: 188991
* PR16755: When initializing or modifying a bitfield member in a constantRichard Smith2013-08-061-7/+48
| | | | | | expression, truncate the stored value to the size of the bitfield. llvm-svn: 187782
* C++1y: track object lifetime during constexpr evaluation, and don't allowRichard Smith2013-07-241-59/+170
| | | | | | | objects to be used once their lifetimes end. This completes the C++1y constexpr extensions. llvm-svn: 187025
* Make IgnoreParens() look through ChooseExprs.Eli Friedman2013-07-201-2/+2
| | | | | | | | | | | | | This is the same way GenericSelectionExpr works, and it's generally a more consistent approach. A large part of this patch is devoted to caching the value of the condition of a ChooseExpr; it's needed to avoid threading an ASTContext into IgnoreParens(). Fixes <rdar://problem/14438917>. llvm-svn: 186738
* Add a __builtin_addressof that performs the same functionality as the built-inRichard Smith2013-07-111-1/+7
| | | | | | | | | | | & operator (ignoring any overloaded operator& for the type). The purpose of this builtin is for use in std::addressof, to allow it to be made constexpr; the existing implementation technique (reinterpret_cast to some reference type, take address, reinterpert_cast back) does not permit this because reinterpret_cast between reference types is not permitted in a constant expression in C++11 onwards. llvm-svn: 186053
* PR16377: Allow evaluation of statement expressions in constant evaluation,Richard Smith2013-06-201-2/+47
| | | | | | why not. Apparently GCC supports this. llvm-svn: 184396
* PR14503: Don't assert if a constexpr constructor temploid instantiates to aRichard Smith2013-06-181-0/+5
| | | | | | | constructor that does not initialize all members, and that constructor is used to initialize a global. llvm-svn: 184211
* Emit initializers for static-storage-duration temporaries as constants whereRichard Smith2013-06-141-0/+1
| | | | | | possible. llvm-svn: 183967
* More for PR12457: fix handling of __builtin_isinf_sign and test.Richard Smith2013-06-131-1/+1
| | | | llvm-svn: 183890
* Towards PR12457: constant expression evaluation support for ↵Richard Smith2013-06-131-14/+63
| | | | | | __builtin_parity{,l,ll}, __builtin_ffs{,l,ll}, and __builtin_fpclassify. llvm-svn: 183889
* Fix part of PR12457. Patch by Justin Bogner!Richard Smith2013-06-131-0/+34
| | | | llvm-svn: 183886
* PR12086, PR15117Richard Smith2013-06-121-4/+54
| | | | | | | | | | | | | | | | | | | Introduce CXXStdInitializerListExpr node, representing the implicit construction of a std::initializer_list<T> object from its underlying array. The AST representation of such an expression goes from an InitListExpr with a flag set, to a CXXStdInitializerListExpr containing a MaterializeTemporaryExpr containing an InitListExpr (possibly wrapped in a CXXBindTemporaryExpr). This more detailed representation has several advantages, the most important of which is that the new MaterializeTemporaryExpr allows us to directly model lifetime extension of the underlying temporary array. Using that, this patch *drastically* simplifies the IR generation of this construct, provides IR generation support for nested global initializer_list objects, fixes several bugs where the destructors for the underlying array would accidentally not get invoked, and provides constant expression evaluation support for std::initializer_list objects. llvm-svn: 183872
* When a static storage duration temporary appears in a constant expression, itRichard Smith2013-06-061-2/+7
| | | | | | | | must be initialized by a constant expression (not just a core constant expression), because we're going to emit it as a global. Core issue for this is pending. llvm-svn: 183388
* Model temporary lifetime-extension explicitly in the AST. Use this model toRichard Smith2013-06-051-11/+63
| | | | | | | | | handle temporaries which have been lifetime-extended to static storage duration within constant expressions. This correctly handles nested lifetime extension (through reference members of aggregates in aggregate initializers) but non-constant-expression emission hasn't yet been updated to do the same. llvm-svn: 183283
* Refactor constant expression evaluation to associate the complete object of aRichard Smith2013-06-031-83/+165
| | | | | | | | | | | | | | materialized temporary with the corresponding MaterializeTemporaryExpr. This is groundwork for providing C++11's guaranteed static initialization for global references bound to lifetime-extended temporaries (if the initialization is a constant expression). In passing, fix a couple of bugs where some evaluation failures didn't trigger diagnostics, and a rejects-valid where potential constant expression testing would assume that it knew the dynamic type of *this and would reject programs which relied on it being some derived type. llvm-svn: 183093
* PR14772: Support constant expression evaluation for _Atomic types.Richard Smith2013-05-231-14/+64
| | | | | | | | | * Treat _Atomic(T) as a literal type if T is a literal type. * Evaluate expressions of this type properly. * Fix a lurking bug where we built completely bogus ASTs for converting to _Atomic types in C++ in some cases, caught by the tests for this change. llvm-svn: 182541
* Tidy up now that PointerUnion has an operator== that works.Richard Smith2013-05-161-2/+1
| | | | llvm-svn: 181983
* Use only explicit bool conversion operatorDavid Blaikie2013-05-151-1/+1
| | | | | | | | | | | | | | | | | | | The most common (non-buggy) case are where such objects are used as return expressions in bool-returning functions or as boolean function arguments. In those cases I've used (& added if necessary) a named function to provide the equivalent (or sometimes negative, depending on convenient wording) test. DiagnosticBuilder kept its implicit conversion operator owing to the prevalent use of it in return statements. One bug was found in ExprConstant.cpp involving a comparison of two PointerUnions (PointerUnion did not previously have an operator==, so instead both operands were converted to bool & then compared). A test is included in test/SemaCXX/constant-expression-cxx1y.cpp for the fix (adding operator== to PointerUnion in LLVM). llvm-svn: 181869
* Suppress bogus "use of undefined constexpr function" error if the function bodyRichard Smith2013-05-141-0/+5
| | | | | | was erroneous and got discarded. llvm-svn: 181758
* Suppress GCC warning for no return after covered switch, and remove someRichard Smith2013-05-131-2/+1
| | | | | | debugging code from an unreachable codepath. llvm-svn: 181731
* C++1y: support for 'switch' statements in constexpr functions. This is somewhatRichard Smith2013-05-121-9/+142
| | | | | | | | inefficient; we perform a linear scan of switch labels to find the one matching the condition, and then walk the body looking for that label. Both parts should be straightforward to optimize. llvm-svn: 181671
* Implement C++1y constant initializer rules: in a constant initializer for anRichard Smith2013-05-091-32/+47
| | | | | | | | object x, x's subobjects can be constructed by constexpr constructor even if they are of non-literal type, and can be read and written even though they're not members of a constexpr object or temporary. llvm-svn: 181506
* C++1y: Add a step limit to constexpr evaluation, to catch runaway loops.Richard Smith2013-05-081-4/+22
| | | | llvm-svn: 181388
* C++1y constant expression evaluation: compound assignment support for ↵Richard Smith2013-05-071-43/+62
| | | | | | floating-point and pointer types. llvm-svn: 181376
* C++1y constant expression evaluation: support for compound assignments on ↵Richard Smith2013-05-071-131/+248
| | | | | | integers. llvm-svn: 181287
* C++1y: an assignment operator is implicitly 'constexpr' if it would only ↵Richard Smith2013-05-071-0/+21
| | | | | | call 'constexpr' assignment operators for a literal class type. llvm-svn: 181284
* Add llvm_unreachable at end of fully covered switchHans Wennborg2013-05-061-0/+1
| | | | | | To pacify GCC warning about control reaching end of non-void function. llvm-svn: 181197
* Require the containing type to be complete when we seeJohn McCall2013-05-061-0/+4
| | | | | | | | | | | | __alignof__ of a field. This problem can only happen in C++11. Also do some petty optimizations. rdar://13784901 llvm-svn: 181185
* C++1y: support range-based for loops in constant expressions.Richard Smith2013-05-061-0/+39
| | | | llvm-svn: 181184
* C++1y: support 'for', 'while', and 'do ... while' in constant expressions.Richard Smith2013-05-061-12/+101
| | | | llvm-svn: 181181
* C++1y: support for increment and decrement in constant expression evaluation.Richard Smith2013-05-051-28/+218
| | | | llvm-svn: 181173
* Factor out duplication between lvalue-to-rvalue conversions and variableRichard Smith2013-05-051-238/+244
| | | | | | | assignments in constant expressions. No significant functionality changes (slight improvement to potential constant expression checking). llvm-svn: 181170
OpenPOWER on IntegriCloud