summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Revert my patches which removed Diagnostic.h includes by moving some ↵Benjamin Kramer2012-02-071-1/+0
| | | | | | | | | | | | | | | | | | operator overloads out of line. This seems to negatively affect compile time onsome ObjC tests (which use a lot of partial diagnostics I assume). I have to come up with a way to keep them inline without including Diagnostic.h everywhere. Now adding a new diagnostic requires a full rebuild of e.g. the static analyzer which doesn't even use those diagnostics. This reverts commit 6496bd10dc3a6d5e3266348f08b6e35f8184bc99. This reverts commit 7af19b817ba964ac560b50c1ed6183235f699789. This reverts commit fdd15602a42bbe26185978ef1e17019f6d969aa7. This reverts commit 00bd44d5677783527d7517c1ffe45e4d75a0f56f. This reverts commit ef9b60ffed980864a8db26ad30344be429e58ff5. llvm-svn: 150006
* Introduce basic ASTs for lambda expressions. This covers:Douglas Gregor2012-02-071-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | - Capturing variables by-reference and by-copy within a lambda - The representation of lambda captures - The creation of the non-static data members in the lambda class that store the captured variables - The initialization of the non-static data members from the captured variables - Pretty-printing lambda expressions There are a number of FIXMEs, both explicit and implied, including: - Creating a field for a capture of 'this' - Improved diagnostics for initialization failures when capturing variables by copy - Dealing with temporaries created during said initialization - Template instantiation - AST (de-)serialization - Binding and returning the lambda expression; turning it into a proper temporary - Lots and lots of semantic constraints - Parameter pack captures llvm-svn: 149977
* constexpr: Fix implementation of DR1311: check for volatile qualifiers inRichard Smith2012-02-051-2/+5
| | | | | | | lvalue-to-rvalue conversions on the source type of the conversion, not the target type (which has them removed for non-class types). llvm-svn: 149796
* Move various diagnostic operator<< overloads out of line and remove includes ↵Benjamin Kramer2012-02-041-0/+1
| | | | | | | | | of Diagnostic.h. Fix all the files that depended on transitive includes of Diagnostic.h. With this patch in place changing a diagnostic no longer requires a full rebuild of the StaticAnalyzer. llvm-svn: 149781
* constexpr:Richard Smith2012-02-041-1/+2
| | | | | | | | | | The recent support for potential constant expressions exposed a bug in the implementation of libstdc++4.6, where numeric_limits<int>::min() is defined as (int)1 << 31, which isn't a constant expression. Disable the 'constexpr function never produces a constant expression' error inside system headers to compensate. llvm-svn: 149729
* constexpr:Richard Smith2012-02-021-15/+161
| | | | | | | * support the gcc __builtin_constant_p() ? ... : ... folding hack in C++11 * check for unspecified values in pointer comparisons and pointer subtractions llvm-svn: 149578
* constexpr: check for overflow in pointer subtraction.Richard Smith2012-02-011-6/+23
| | | | | | | | | | | | | This is a mess. According to the C++11 standard, pointer subtraction only has undefined behavior if the difference of the array indices does not fit into a ptrdiff_t. However, common implementations effectively perform a char* subtraction first, and then divide the result by the element size, which can cause overflows in some cases. Those cases are not considered to be undefined behavior by this change; perhaps they should be. llvm-svn: 149490
* constexpr: overflow checking for integral and floating-point arithmetic.Richard Smith2012-02-011-7/+38
| | | | llvm-svn: 149473
* constexpr: require 'this' to point to an object in a constexpr method call.Richard Smith2012-02-011-1/+5
| | | | llvm-svn: 149467
* constexpr: add support for comparisons of pointer-to-members.Richard Smith2012-02-011-3/+51
| | | | llvm-svn: 149463
* constexpr: Treat INT_MIN % -1 as undefined behavior in C++11. Technically, itRichard Smith2012-01-311-6/+4
| | | | | | isn't, but this is just a (reported) defect in the wording. llvm-svn: 149448
* constexpr: the result of a relational operator between pointers to void isRichard Smith2012-01-311-0/+12
| | | | | | | unspecified unless the pointers are equal; therefore, such a comparison is not a constant expression unless the pointers are equal. llvm-svn: 149366
* constexpr: catch a collection of integral undefined behaviors:Richard Smith2012-01-311-10/+57
| | | | | | | | | -INT_MIN and INT_MIN / -1 Shift by a negative or too large quantity Left shift of negative value Overflow in left shift llvm-svn: 149344
* constexpr: remove integral conversion overflow checking introduced in r149286.Richard Smith2012-01-311-7/+0
| | | | | | | As Eli points out, this is implementation-defined, and the way we define it makes this fine. llvm-svn: 149327
* constexpr: disallow signed integer overflow in integral conversions in constantRichard Smith2012-01-301-8/+19
| | | | | | expressions in C++11. llvm-svn: 149286
* constexpr: Implement the [dcl.constexpr]p5 check for whether a constexprRichard Smith2012-01-271-93/+228
| | | | | | | function definition can produce a constant expression. This also provides the last few checks for [dcl.constexpr]p3 and [dcl.constexpr]p4. llvm-svn: 149108
* AST/ExprConstant.cpp: Silence a warning on ms cl.exe. "bool" does not prefer ↵NAKAMURA Takumi2012-01-261-1/+1
| | | | | | to be compared to integer. llvm-svn: 149059
* constexpr: evaluate (bool)&x as true when x is a local variable or a temporary.Richard Smith2012-01-261-4/+0
| | | | llvm-svn: 149045
* constexpr: add support for anonymous struct and union members in literal types.Richard Smith2012-01-251-18/+61
| | | | llvm-svn: 148987
* More dead code removal (using -Wunreachable-code)David Blaikie2012-01-201-9/+1
| | | | llvm-svn: 148577
* Move narrowing conversion detection code from SemaInit to SemaOverload, readyRichard Smith2012-01-181-27/+38
| | | | | | | | | | | | | for it to be used in converted constant expression checking, and fix a couple of issues: - Conversion operators implicitly invoked prior to the narrowing conversion were not being correctly handled when determining whether a constant value was narrowed. - For conversions from floating-point to integral types, the diagnostic text incorrectly always claimed that the source expression was not a constant expression. llvm-svn: 148381
* A call to strlen is not a constant expression, even if we're treating it as aRichard Smith2012-01-181-1/+8
| | | | | | builtin. llvm-svn: 148374
* Enable constant evaluation of implicit calls to constexpr conversion operators.Richard Smith2012-01-171-1/+2
| | | | llvm-svn: 148333
* Some improvements to the handling of C11 atomic types:David Chisnall2012-01-161-0/+8
| | | | | | | | | | | | | | | | | | - Add atomic-to/from-nonatomic cast types - Emit atomic operations for arithmetic on atomic types - Emit non-atomic stores for initialisation of atomic types, but atomic stores and loads for every other store / load - Add a __atomic_init() intrinsic which does a non-atomic store to an _Atomic() type. This is needed for the corresponding C11 stdatomic.h function. - Enables the relevant __has_feature() checks. The feature isn't 100% complete yet, but it's done enough that we want people testing it. Still to do: - Make the arithmetic operations on atomic types (e.g. Atomic(int) foo = 1; foo++;) use the correct LLVM intrinsic if one exists, not a loop with a cmpxchg. - Add a signal fence builtin - Properly set the fenv state in atomic operations on floating point values - Correctly handle things like _Atomic(_Complex double) which are too large for an atomic cmpxchg on some platforms (this requires working out what 'correctly' means in this context) - Fix the many remaining corner cases llvm-svn: 148242
* constexpr: casts to void* are allowed in constant expressions, don't set theRichard Smith2012-01-151-3/+3
| | | | | | | designator invalid. (Since we can't read the value of such a pointer, this only affects the quality of diagnostics.) llvm-svn: 148208
* constexpr irgen: Add irgen support for APValue::Struct, APValue::Union,Richard Smith2012-01-141-5/+8
| | | | | | | | | | | | | | | | | | | | APValue::Array and APValue::MemberPointer. All APValue values can now be emitted as constants. Add new CGCXXABI entry point for emitting an APValue MemberPointer. The other entrypoints dealing with constant member pointers are no longer necessary and will be removed in a later change. Switch codegen from using EvaluateAsRValue/EvaluateAsLValue to VarDecl::evaluateValue. This performs caching and deals with the nasty cases in C++11 where a non-const object's initializer can refer indirectly to previously-initialized fields within the same object. Building the intermediate APValue object incurs a measurable performance hit on pathological testcases with huge initializer lists, so we continue to build IR directly from the Expr nodes for array and record types outside of C++11. llvm-svn: 148178
* Fix a silly mistake in ComplexExprEvaluator::ZeroInitialization. ↵Eli Friedman2012-01-131-1/+1
| | | | | | <rdar://problem/10691092>. llvm-svn: 148157
* constexpr: initialization of a union from an empty initializer-list shouldRichard Smith2012-01-121-8/+23
| | | | | | | | | zero-initialize the first union member. Also fix a bug where initializing an array of types compatible with wchar_t from a wide string literal failed in C, and fortify the C++ tests in this area. This part can't be tested without a code change to enable array evaluation in C (where an existing test fails). llvm-svn: 148035
* Allow constant-folding of references which were formed in a manner not permittedRichard Smith2012-01-121-10/+6
| | | | | | in a constant expression, for compatibility with g++. llvm-svn: 148020
* Implement the missing pieces of Evaluate for _Complex types. With that ↵Eli Friedman2012-01-101-5/+39
| | | | | | complete, remove some code from CGExprConstant which is no longer necessary. While I'm here, a couple minor tweaks to _Complex-in-C++. (Specifically, make _Complex types literal types, and don't warn for _Complex int.) llvm-svn: 147840
* PR11724: Implement evaluation for constexpr defaulted trivial union copy/moveRichard Smith2012-01-101-2/+16
| | | | | | | constructors. These are a special case whose behavior cannot be modeled as a user-written constructor. llvm-svn: 147839
* C++11 generalized constant expressions: implement checking and diagnostics forRichard Smith2012-01-061-229/+317
| | | | | | | pointer-arithmetic-related undefined behavior and unspecified results. We continue to fold such values, but now notice they aren't constant expressions. llvm-svn: 147659
* Address Richard's review comments on r147561 (Evaluate support for ↵Eli Friedman2012-01-051-5/+9
| | | | | | address-of-label differences). llvm-svn: 147631
* Add an APValue representation for the difference between two ↵Eli Friedman2012-01-041-0/+46
| | | | | | | | | | address-of-label expressions. Add support to Evaluate and CGExprConstant for generating/handling them. Remove the special-case for such differences in Expr::isConstantInitializer. With that done, remove a bunch of buggy code from CGExprConstant for handling scalar expressions which is no longer necessary. Fixes PR11705. llvm-svn: 147561
* Get rid of an unnecessary check; the AST for init-lists is the same ↵Eli Friedman2012-01-031-6/+4
| | | | | | independent of whether we're in C++11 mode. llvm-svn: 147503
* Support constant evaluation for OpenCL nested vector literals. Patch by ↵Eli Friedman2012-01-031-43/+32
| | | | | | Anton Lokhmotov. llvm-svn: 147496
* Unrevert r147271, reverted in r147361.Richard Smith2011-12-301-48/+172
| | | | | | | | | | | | Also temporarily remove the assumption from IR gen that we can emit IR for every constant we can fold, since it isn't currently true in C++11, to fix PR11676. Original comment from r147271: constexpr: perform zero-initialization prior to / instead of performing a constructor call when appropriate. Thanks to Eli for spotting this. llvm-svn: 147384
* Revert r147271. This fixes PR11676.Rafael Espindola2011-12-301-172/+48
| | | | llvm-svn: 147362
* Small refactoring and simplification of constant evaluation and some of itsRichard Smith2011-12-281-57/+66
| | | | | | clients. No functionality change. llvm-svn: 147318
* constexpr: support for evaluation and codegen of typeid constants.Richard Smith2011-12-271-0/+16
| | | | llvm-svn: 147290
* constexpr: perform zero-initialization prior to / instead of performing aRichard Smith2011-12-251-48/+172
| | | | | | constructor call when appropriate. Thanks to Eli for spotting this. llvm-svn: 147271
* Add support for bitcasts to vector type in Evaluate.Eli Friedman2011-12-221-0/+85
| | | | llvm-svn: 147137
* PR11614: Mark defaulted special constructors as constexpr if their implicitRichard Smith2011-12-221-0/+45
| | | | | | definition would satisfy the constexpr requirements. llvm-svn: 147128
* PR11637: implement special-case constant evaluation for char arrays initializedRichard Smith2011-12-221-0/+26
| | | | | | by string literals. llvm-svn: 147120
* Cast enumerators from different anonymous enums to unsigned, to appease gccMatt Beaumont-Gay2011-12-211-4/+4
| | | | llvm-svn: 147067
* constexpr: diagnostic improvements for invalid lvalue-to-rvalue conversions inRichard Smith2011-12-211-25/+113
| | | | | | constant expressions. llvm-svn: 147035
* Evaluation support for ExprWithCleanups. We won't evaluate any expression whichRichard Smith2011-12-191-0/+4
| | | | | | actually requires non-trivial cleanups, so no cleanups need to be performed. llvm-svn: 146916
* Improve r146813 (for PR11595) to give an appropriate diagnostic.Richard Smith2011-12-191-6/+11
| | | | llvm-svn: 146915
* constexpr handling improvements. Produce detailed diagnostics when a 'constexpr'Richard Smith2011-12-191-65/+54
| | | | | | | | | | | | | | | | | | | | | variable is initialized by a non-constant expression, and pass in the variable being declared so that earlier-initialized fields' values can be used. Rearrange VarDecl init evaluation to make this possible, and in so doing fix a long-standing issue in our C++ constant expression handling, where we would mishandle cases like: extern const int a; const int n = a; const int a = 5; int arr[n]; Here, n is not initialized by a constant expression, so can't be used in an ICE, even though the initialization expression would be an ICE if it appeared later in the TU. This requires computing whether the initializer is an ICE eagerly, and saving that information in PCH files. llvm-svn: 146856
* PR11604: don't allow floating-literal-to-integer casts in ICEs if the ↵Richard Smith2011-12-181-3/+17
| | | | | | | | | | (truncated) floating literal value does not fit into the destination type. Such casts have undefined behavior at translation time; treating them as non-ICE matches the behavior of modern gcc versions. llvm-svn: 146842
OpenPOWER on IntegriCloud