aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema
AgeCommit message (Collapse)Author
2011-01-11Add TemplateArgument::CreatePackCopy() to create a new parameter packDouglas Gregor
in ASTContext-allocated memory, copying the provided template arguments. Use this new routine where we can. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123289 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11Implement partial ordering of class template partial specializationsDouglas Gregor
and function templates that contain variadic templates. This involves three small-ish changes: (1) When transforming a pack expansion, if the transformed argument still contains unexpanded parameter packs, build a pack expansion. This can happen during the substitution that occurs into class template partial specialiation template arguments during partial ordering. (2) When performing template argument deduction where the argument is a pack expansion, match against the pattern of that pack expansion. (3) When performing template argument deduction against a non-pack parameter, or a non-expansion template argument, deduction fails if the argument itself is a pack expansion (C++0x [temp.deduct.type]p22). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123279 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11Implement C++ [temp.func.order]p5 more directly, by passing down theDouglas Gregor
number of explicit call arguments. This actually fixes an erroneous test for [temp.deduct.partial]p11, where we were considering parameters corresponding to arguments beyond those that were explicitly provided. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123244 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11Added warning about invalid register specification for local variables.Abramo Bagnara
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123236 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11In Microsoft mode, force 64 bit hex integer constants to signed type if the ↵Francois Pichet
LL or i64 suffix is used. This MSVC behavior. For example: void f(long long){ printf("long long"); } void f(unsigned long long) { printf("unsigned long long"); } int main() { f(0xffffffffffffffffLL); } Will print "long long" using MSVC. This patch also fixes 16 compile errors related to overloading issues when parsing the MSVC 2008 C++ standard lib. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123231 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11Ensure that the result type of an Objective-C class message send isDouglas Gregor
complete. However, if it returns a reference type, don't require the type it refers to to be complete. Fixes <rdar://problem/8807070>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123214 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11When mapping from a function parameter pack to the set of functionDouglas Gregor
parameters it expanded to, map exactly the number of function parameters that were expanded rather than just running to the end of the instantiated parameter list. This finishes the implementation of the last sentence of C++0x [temp.deduct.call]p1. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123213 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-11Implement the last bullet of [temp.deduct.type]p5 and part of the lastDouglas Gregor
sentence of [temp.deduct.call]p1, both of which concern the non-deducibility of parameter packs not at the end of a parameter-type-list. The latter isn't fully implemented yet; see the new FIXME. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123210 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-10Implement more of C++0x [temp.arg.explicit]p9, allowing extension ofDouglas Gregor
pack expansions in template argument lists and function parameter lists. The implementation of this paragraph should be complete *except* for cases where we're substituting into one of the unexpanded packs in a pack expansion; that's a general issue I haven't solved yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123188 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-10Repent for my copy-and-paste sins, factoring out the code that formsDouglas Gregor
argument packs from a set of deduced arguments, then checks that those argument packs match previously-deduced argument packs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123182 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-10Factor out the code to set up template argument deduction for a set ofDouglas Gregor
template argument packs. This also ensures that explicitly-specified template arguments get properly represented in those cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123180 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-10Work-in-progress implementation of C++0x [temp.arg.explicit]p9, whichDouglas Gregor
allows an argument pack determines via explicit specification of function template arguments to be extended by further, deduced arguments. For example: template<class ... Types> void f(Types ... values); void g() { f<int*, float*>(0, 0, 0); // Types is deduced to the sequence int*, float*, int } There are a number of FIXMEs in here that indicate places where we need to implement + test retained expansions, plus a number of other places in deduction where we need to correctly cope with the explicitly-specified arguments when deducing an argument pack. Furthermore, it appears that the RecursiveASTVisitor needs to be auditied; it's missing some traversals (especially w.r.t. template arguments) that cause it not to find unexpanded parameter packs when it should. The good news, however, is that the tr1::tuple implementation now works fully, and the tr1::bind example (both from N2080) is actually working now. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123163 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-08Renamed CXXBaseOrMemberInitializer to CXXCtorInitializer. This is both shorter,Sean Hunt
more accurate, and makes it make sense for it to hold a delegating constructor call. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123084 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-08Check for delegating constructors and (currently) return an error about them.Sean Hunt
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123076 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-08Remove a kludge from analysis based warnings that used to detectChandler Carruth
temporaries with no-return destructors. The CFG now properly supports temporaries and implicit destructors which both makes this kludge no longer work, and conveniently removes the need for it. Turn on CFG handling of implicit destructors and initializers. Several ad-hoc benchmarks don't indicate any measurable performance impact from growing the CFG, and it fixes real correctness problems with warnings. As a result of turning on these CFG elements, we started to tickle an inf-loop in the unreachable code logic used for warnings. The fix is trivial. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123056 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-08Add semantic checking that the "thousands grouping"Ted Kremenek
prefix in a printf format string is matched with the appropriate conversion specifier. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123055 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-07When instantiating the arguments to an initializer, use theDouglas Gregor
TreeTransform version of TransformExprs() rather than explicit loop, so that we expand pack expansions properly. Test cast coming soon... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123014 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-07Fix a valgrind error when transforming function prototypes withDouglas Gregor
function parameter pack expansions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123007 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-07Implement substitution of a function parameter pack for its set ofDouglas Gregor
instantiated function parameters, enabling instantiation of arbitrary pack expansions involving function parameter packs. At this point, we can now correctly compile a simple, variadic print() example: #include <iostream> #include <string> void print() {} template<typename Head, typename ...Tail> void print(const Head &head, const Tail &...tail) { std::cout << head; print(tail...); } int main() { std::string hello = "Hello"; print(hello, ", world!", " ", 2011, '\n'); } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123000 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-07Factor out the template transformation of a sequence of functionDouglas Gregor
parameters into parameter types, so that substitution of explicitly-specified function template arguments uses the same path. This enables the use of explicitly-specified function template arguments with variadic templates. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122986 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-06Implement template argument deduction from a call to a functionDouglas Gregor
template whose last parameter is a parameter pack. This allows us to form a call to, e.g., template<typename ...Args1, typename ...Args2> void f(std::pair<Args1, Args2> ...pairs); given zero or more instances of "pair". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122973 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-06Introduce an AttributedType, but don't actually use it anywhere yet.John McCall
The initial TreeTransform is a cop-out, but it's more-or-less equivalent to what we were doing before, or rather what we're doing now and might eventually stop doing in favor of using this type. I am simultaneously intrigued by the possibilities of rebuilding a dependent Attri git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122942 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Fast-path an arity check when performing template argument deduction that ↵Douglas Gregor
compares two parameter-type-lists. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122928 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Eliminate an unnecessary dance where we tried to cope with the lack ofDouglas Gregor
TypeSourceInfo when transforming a function parameter. The callees of this routine already assume that TypeSourceInfo will be present, and we want to always be sure that it exists. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122927 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Initial implementation of function parameter packs. This implementation allows:Douglas Gregor
1) Declaration of function parameter packs 2) Instantiation of function parameter packs within function types. 3) Template argument deduction of function parameter packs when matching two function types. We're missing all of the important template-instantiation logic for function template definitions, along with template argument deduction from the argument list of a function call, so don't even think of trying to use these for real yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122926 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Don't warn on missing 'copy' attribute on a 'block'Fariborz Jahanian
property when it is 'readonly'. // rdar://8820813 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122923 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05hasInit() -> hasDefaultArg()Douglas Gregor
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122905 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Add Decl::isParameterPack(), which covers both function and templateDouglas Gregor
parameter packs, along with ParmVarDecl::isParameterPack(), which looks for function parameter packs. Use these routines to fix some obvious FIXMEs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122904 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Propagate the "deduced from array bound" bit when comparing deducedDouglas Gregor
template argument packs. Plus, remove a FIXME that I fixed yesterday. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122903 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05When we're converting deduced template arguments to the type of theDouglas Gregor
corresponding template parameter, make sure that prior converted template arguments are available for substitution. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122902 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Use the proper enum as parameter, instead of unsigned. No functionality change.Argyrios Kyrtzidis
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122900 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Eliminate two "unsupported" errors relating to variadic templates: oneDouglas Gregor
for template template argument pack expansions (which was no longer used) and another that was a placeholder for an llvm_unreachable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122898 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Replace the representation of template template argument packDouglas Gregor
expansions with something that is easier to use correctly: a new template argment kind, rather than a bit on an existing kind. Update all of the switch statements that deal with template arguments, fixing a few latent bugs in the process. I"m happy with this representation, now. And, oh look! Template instantiation and deduction work for template template argument pack expansions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122896 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Add semantic analysis for the creation of and an AST representationDouglas Gregor
for template template argument pack expansions. This allows fun such as: template<template<class> class ...> struct apply_impl { /*...*/ }; template<template<class> class ...Metafunctions> struct apply { typedef typename apply_impl<Metafunctions...>::type type; }; However, neither template argument deduction nor template instantiation is implemented for template template argument packs, so this functionality isn't useful yet. I'll probably replace the encoding of template template argument pack expansions in TemplateArgument so that it's harder to accidentally forget about the expansion. However, this is a step in the right general direction. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122890 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Update C++ [temp.param]p11 citation to reflect the changes in C++0x. No ↵Douglas Gregor
functionality change git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122878 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Implement C++0x [temp.param]p11 for non-type and template templateDouglas Gregor
parameter packs. Also, the "no template parameters after a template parameter pack" rule only applies to primary class templates. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122877 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Implement proper parameter pack matching for non-type templateDouglas Gregor
parameters and template template parameters. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122875 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Implement support for template template parameter packs, e.g.,Douglas Gregor
template<template<class> class ...Metafunctions> struct apply_to_each; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122874 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Fix the -Asserts build.John McCall
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122872 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Refactor the application of type attributes so that attributes fromJohn McCall
the declaration-specifiers and on the declarator itself are moved to the appropriate declarator chunk. This permits a greatly simplified model for how to apply these attributes, as well as allowing a much more efficient query for the GC attribute. Now all qualifier queries follow the same basic strategy of "local qualifiers, local qualifiers on the canonical type, then look through arrays". This can be easily optimized by changing the canonical qualified-array-type representation. Do not process type attributes as decl attributes on declarations with declarators. When computing the type of a block, synthesize a prototype function declarator chunk if the decl-spec type was not a function. This simplifies the logic for building block signatures. Change the logic which inserts an objc_read_weak on a block literal to only fire if the block has a __weak __block variable, rather than if the return type of the block is __weak qualified, which is not actually a sensible thing to ask. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122871 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-05Many of the built-in operator candidates introduced into overloadDouglas Gregor
resolution require that the pointed-to type be an object type, but we weren't filtering out non-object types. Do so, fixing PR7851. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122853 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Eliminate some completely useless code that attempted to perform someDouglas Gregor
conversions on the substituted non-type template arguments of a class template partial specialization. C++ [temp.class.spec]p8 actually prohibits all of the cases where this code would have fired. Hey, it's better than having to deal with variadic templates here! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122852 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Improve our handling of non-type template parameters in partialDouglas Gregor
specializations. We weren't dealing with any of the cases where the type of the non-type template argument differs from the type of the corresponding template parameter in the primary template. We would think that the template parameter in the partial specialization was not deducible (and warn about it, incorrectly), then fail to convert a deduced parameter to the type of the template parameter in the partial specialization (which may involve truncation, among other things). Fixes PR8905. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122851 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Remove an unnecessary FIXME for variadic templatesDouglas Gregor
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122848 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Minor cleanups for template argument deduction in the presence ofDouglas Gregor
variadic templates. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122847 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Improve the checking of deduced template arguments stored within template ↵Douglas Gregor
argument packs when finishing template argument deduction for a function template git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122843 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Implement the sizeof...(pack) expression to compute the length of aDouglas Gregor
parameter pack. Note that we're missing proper libclang support for the new SizeOfPackExpr expression node. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122813 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Prefer getAs<ComplexType> rather than cast<ComplexType> on canonical type. ↵Abramo Bagnara
Suggestion by Douglas Gregor! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122807 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Implement -Wself-assign, which warns on code such as:Chandler Carruth
int x = 42; x = x; // Warns here. The warning avoids macro expansions, templates, user-defined assignment operators, and volatile types, so false positives are expected to be low. The common (mis-)use of this code pattern is to silence unused variable warnings, but a more idiomatic way of doing that is '(void)x;'. A follow-up to this will add a note and fix-it hint suggesting this replacement in cases where the StmtExpr consists precisely of the self assignment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122804 91177308-0d34-0410-b5e6-96231b3b80d8
2011-01-04Enhance the diagnostic for negative array sizes to include theChandler Carruth
declaration name of the array when present. This ensures that a poor-man's C++03 static_assert will include the user error message often embedded in the name. Update all the tests to reflect the new wording, and add a test for the name behavior. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122802 91177308-0d34-0410-b5e6-96231b3b80d8