| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
|
|
| |
a switch with any default case. This both warns when an enumerator is
missing and asserts if a value sneaks through despite the warning.
While in there fix a bunch of coding style issues with this code.
llvm-svn: 130648
|
| |
|
|
|
|
|
| |
adding an unreachable annotation. Remarkably this one was already
enumarting every trait.
llvm-svn: 130647
|
| |
|
|
|
|
|
|
|
| |
enumerators.
Also remove a default that led to llvm_unreachable to make another
switch warn if any enumerators fail to be covered.
llvm-svn: 130646
|
| |
|
|
|
|
|
|
| |
over type traits.
Add the missing trait from this switch that Clang's warning uncovered.
llvm-svn: 130645
|
| |
|
|
|
|
|
|
| |
case returning a value.
Silences a GCC warning.
llvm-svn: 130644
|
| |
|
|
|
|
|
|
|
|
|
| |
As might be surmised from their names, these aren't type traits, they're
expression traits. Amazingly enough, they're expression traits that we
have, and fully implement. These "type" traits are even parsed from the
same tokens as the expression traits. Luckily, the parser only tried the
expression trait parsing for these tokens, so this was all just a pile
of dead code.
llvm-svn: 130643
|
| |
|
|
|
|
|
|
|
|
| |
As far as I know, this implementation is complete but might be missing a
few optimizations. Exceptions and virtual bases are handled correctly.
Because I'm an optimist, the web page has appropriately been updated. If
I'm wrong, feel free to downgrade its support categories.
llvm-svn: 130642
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
1) Moved the completeness checking routine above the evaluation routine
so the reader sees that we do in fact check for complete types when
necessary.
2) Remove the FIXME comment about not doing this.
3) Make the arguments to the evaluate function agree in order with those
to the completeness checking function.
4) Completely specify the enumerators for the completeness checking
function rather than relying on a default.
5) Remove a check for the Borland language to only require complete
types in a few places. Borland's own documentation doesn't agree with
this: some of the previously unspecified traits *do* require
a complete type, some don't.
6) Correctly split the traits which do not require complete types from
those that do, clarifying comments and citations to the standard or
other documentation where relevant.
llvm-svn: 130641
|
| |
|
|
|
|
|
|
|
| |
traits where possible. For the rest, group them and add some
documentation regarding their origins.
No functionality change intended.
llvm-svn: 130639
|
| |
|
|
|
|
| |
a single pattern for implementing each.
llvm-svn: 130638
|
| |
|
|
|
|
| |
stop considering whether I can compress them. :)
llvm-svn: 130633
|
| |
|
|
|
|
|
| |
devirtualize Decl (because bits can't get laid out in base
classes if the base is POD).
llvm-svn: 130632
|
| |
|
|
|
|
|
|
|
|
|
| |
SubstTemplateTypeParmType to be 'getIdentifier' instead of 'getName' as
it returns an identifier. This makes them more consistent with the
NamedDecl interface.
Also, switch back to using this interface to acquire the indentifier in
TypePrinter.cpp. I missed this in r130628.
llvm-svn: 130629
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
accompanying fixes to make it work today.
The core of this patch is to provide a link from a TemplateTypeParmType
back to the TemplateTypeParmDecl node which declared it. This in turn
provides much more precise information about the type, where it came
from, and how it functions for AST consumers.
To make the patch work almost a year after its first attempt, it needed
serialization support, and it now retains the old getName() interface.
Finally, it requires us to not attempt to instantiate the type in an
unsupported friend decl -- specifically those coming from template
friend decls but which refer to a specific type through a dependent
name.
A cleaner representation of the last item would be to build
FriendTemplateDecl nodes for these, storing their template parameters
etc, and to perform proper instantation of them like any other template
declaration. They can still be flagged as unsupported for the purpose of
access checking, etc.
This passed an asserts-enabled bootstrap for me, and the reduced test
case mentioned in the original review thread no longer causes issues,
likely fixed at somewhere amidst the 24k revisions that have elapsed.
llvm-svn: 130628
|
| |
|
|
| |
llvm-svn: 130622
|
| |
|
|
| |
llvm-svn: 130621
|
| |
|
|
|
|
| |
wchar_t is an unsigned type.
llvm-svn: 130620
|
| |
|
|
|
|
| |
particular, make sure to handle WCHAR_MIN correctly.
llvm-svn: 130618
|
| |
|
|
| |
llvm-svn: 130616
|
| |
|
|
|
|
|
|
|
| |
partial ordering of function templates, use a simple superset
relationship rather than the convertibility-implying
isMoreQualifiedThan/compatibilyIncludes relationship. Fixes partial
ordering between references and address-space-qualified references.
llvm-svn: 130612
|
| |
|
|
|
|
| |
SynthesizeByrefCopyDestroyHelper(). No change in functionality intended.
llvm-svn: 130608
|
| |
|
|
| |
llvm-svn: 130606
|
| |
|
|
|
|
|
|
|
|
|
| |
types after looking through arrays. Arrays with an unknown bound seem to
be specifically allowed in the library type traits in C++0x, and GCC's
builtin __is_trivial returns 'true' for the type 'int[]'. Now Clang
agrees with GCC about __is_trivial here.
Also hardens these methods against dependent types by just returning false.
llvm-svn: 130605
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
trait arguments. Reflow the logic to use early exit instead of a complex
condition expression. Switch to a switch for acting on different type
traits and add a bunch of the recently implemented type traits here.
This fixes one of the regressions with the new __is_standard_layout
trait to again require a complete type. It also fixes some latent bugs
in other traits that never did impose this despite the standard
requiring it. However, all these bugs were hidden for non-borland
systems where the default is to require a complete type.
It's unclear to me what the best approach here is: providing an explicit
lists for the ones requiring complete types only w/ Borland and using
a default for the rest, or forcing this switch to enumerate the traits
and make it clear which way each one goes.
I'm still working on cleaning up the tests so that they actually catch
this, a much more comprehensive update to the tests will come once I've
worked through the bugs I'm finding via inspection.
llvm-svn: 130604
|
| |
|
|
|
|
|
| |
based on Doug's preferences when we discussed this in IRC. This brings
the wording more in line with the standard.
llvm-svn: 130603
|
| |
|
|
|
|
|
|
|
|
|
|
| |
a Type method isStandardLayoutType, to keep our user API matching the
type trait builtins as closely as possible. Also, implement it in terms
of other Type APIs rather than in terms of other type traits. This
models the implementation on that of isLiteralType and isTrivialType.
There remain some common problems with these traits still, so this is
a bit of a WIP. However, we can now fix all of these traits at the same
time and in a consistent manner.
llvm-svn: 130602
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
type trait. The previous implementation suffered from several problems:
1) It implemented all of the logic in RecordType by walking over every
base and field in a CXXRecordDecl and validating the constraints of
the standard. This made for very straightforward code, but is
extremely inefficient. It also is conceptually wrong, the logic tied
to the C++ definition of standard-layout classes should be in
CXXRecordDecl, not RecordType.
2) To address the performance problems with #1, a cache bit was added to
CXXRecordDecl, and at the completion of every C++ class, the
RecordType was queried to determine if it was a standard layout
class, and that state was cached. Two things went very very wrong
with this. First, the caching version of the query *was never
called*. Even within the recursive steps of the walk over all fields
and bases the caching variant was not called, making each query
a full *recursive* walk. Second, despite the cache not being used, it
was computed for every class declared, even when the trait was never
used in the program. This probably significantly regressed compile
time performance for edge-case files.
3) An ASTContext was required merely to query the type trait because
querying it performed the actual computations.
4) The caching bit wasn't managed correctly (uninitialized).
The new implementation follows the system for all the other traits on
C++ classes by encoding all the state needed in the definition data and
building up the trait incrementally as each base and member are added to
the definition of the class.
The idiosyncracies of the specification of standard-layout classes
requires more state than I would like; currently 5 bits. I could
eliminate one of the bits easily at the expense of both clarity and
resilience of the code. I might be able to eliminate one of the other
bits by computing its state in terms of other state bits in the
definition. I've already done that in one place where there was a fairly
simple way to achieve it.
It's possible some of the bits could be moved out of the definition data
and into some other structure which isn't serialized if the serialized
bloat is a problem. That would preclude serialization of a partial class
declaration, but that's likely already precluded.
Comments on any of these issues welcome.
llvm-svn: 130601
|
| |
|
|
| |
llvm-svn: 130600
|
| |
|
|
| |
llvm-svn: 130598
|
| |
|
|
|
|
|
| |
that library has never been in the SDK. Fortunately, it shouldn't be necessary,
since that library was also removed in 10.6.
llvm-svn: 130595
|
| |
|
|
|
|
|
|
| |
to the linker.
- Only do this explicitly with the argument for now, the linker will need to
explicitly add support for this.
llvm-svn: 130594
|
| |
|
|
|
|
| |
-mios-simulator-version-min.
llvm-svn: 130593
|
| |
|
|
|
|
| |
update -mios-simulator-version-min to set it.
llvm-svn: 130592
|
| |
|
|
|
|
| |
and associated deployment target environment variable.
llvm-svn: 130591
|
| |
|
|
| |
llvm-svn: 130581
|
| |
|
|
| |
llvm-svn: 130564
|
| |
|
|
| |
llvm-svn: 130561
|
| |
|
|
|
|
| |
Radar 9333566. Patch by Chad Rosier!
llvm-svn: 130554
|
| |
|
|
| |
llvm-svn: 130550
|
| |
|
|
|
|
|
|
| |
rhs when its 'forwarding' pointer may be modified
in rhs evaluation as result of call to Block_copy.
// rdar://9309454
llvm-svn: 130545
|
| |
|
|
| |
llvm-svn: 130525
|
| |
|
|
| |
llvm-svn: 130516
|
| |
|
|
|
|
|
| |
actually have to implement them, since in modern versions of MSVC they're
aliases to the standard C types.
llvm-svn: 130509
|
| |
|
|
|
|
| |
identifiers in libc++.
llvm-svn: 130508
|
| |
|
|
| |
llvm-svn: 130500
|
| |
|
|
|
|
|
|
|
|
|
| |
definition of POD. Specifically, this allows certain non-aggregate
types due to their data members being private.
The representation of C++11 POD testing is pretty gross. Any suggestions
for improvements there are welcome. Especially the name
'isCXX11PODType()' seems truly unfortunate.
llvm-svn: 130492
|
| |
|
|
| |
llvm-svn: 130491
|
| |
|
|
|
|
| |
instantiated in a different PCH than its containing class. Otherwise we get double definition errors. Fixes a Boost.MPL problem that affects Boost.Accumulators and probably a lot more of Boost.
llvm-svn: 130488
|
| |
|
|
|
|
|
|
|
|
| |
Teaches isLiteralType and isTrivialType to behave plausibly and most
importantly not crash on normal RecordDecls.
Sadly I have no real way to test this. I stumbled onto it by
mis-implementing a warning.
llvm-svn: 130483
|
| |
|
|
|
|
| |
new type trait __is_same
llvm-svn: 130468
|