Commit Graph

507 Commits

Author SHA1 Message Date
Aaron Ballman 26440abcdd Silence a "not all control paths return a value" warning from MSVC. Should also silence a -Wreturn-type warning. NFC intended.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243109 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-24 12:47:27 +00:00
Alex Denisov 7fe6f5798b Cleanup ObjCInterfaceDecl lookup for ObjC literals
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243092 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-24 05:09:40 +00:00
Douglas Gregor ffad82b290 Implement the Objective-C __kindof type qualifier.
The __kindof type qualifier can be applied to Objective-C object
(pointer) types to indicate id-like behavior, which includes implicit
"downcasting" of __kindof types to subclasses and id-like message-send
behavior. __kindof types provide better type bounds for substitutions
into unspecified generic types, which preserves more type information.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241548 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 03:58:42 +00:00
Douglas Gregor a6620f3825 Substitute type arguments into uses of Objective-C interface members.
When messaging a method that was defined in an Objective-C class (or
category or extension thereof) that has type parameters, substitute
the type arguments for those type parameters. Similarly, substitute
into property accesses, instance variables, and other references.

This includes general infrastructure for substituting the type
arguments associated with an ObjCObject(Pointer)Type into a type
referenced within a particular context, handling all of the
substitutions required to deal with (e.g.) inheritance involving
parameterized classes. In cases where no type arguments are available
(e.g., because we're messaging via some unspecialized type, id, etc.),
we substitute in the type bounds for the type parameters instead.

Example:

  @interface NSSet<T : id<NSCopying>> : NSObject <NSCopying>
  - (T)firstObject;
  @end

  void f(NSSet<NSString *> *stringSet, NSSet *anySet) {
    [stringSet firstObject]; // produces NSString*
    [anySet firstObject]; // produces id<NSCopying> (the bound)
  }

When substituting for the type parameters given an unspecialized
context (i.e., no specific type arguments were given), substituting
the type bounds unconditionally produces type signatures that are too
strong compared to the pre-generics signatures. Instead, use the
following rule:

  - In covariant positions, such as method return types, replace type
    parameters with “id” or “Class” (the latter only when the type
    parameter bound is “Class” or qualified class, e.g,
    “Class<NSCopying>”)
  - In other positions (e.g., parameter types), replace type
    parameters with their type bounds.
  - When a specialized Objective-C object or object pointer type
    contains a type parameter in its type arguments (e.g.,
    NSArray<T>*, but not NSArray<NSString *> *), replace the entire
    object/object pointer type with its unspecialized version (e.g.,
    NSArray *).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241543 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 03:57:53 +00:00
Douglas Gregor 06714fc31e Handle Objective-C type arguments.
Objective-C type arguments can be provided in angle brackets following
an Objective-C interface type. Syntactically, this is the same
position as one would provide protocol qualifiers (e.g.,
id<NSCopying>), so parse both together and let Sema sort out the
ambiguous cases. This applies both when parsing types and when parsing
the superclass of an Objective-C class, which can now be a specialized
type (e.g., NSMutableArray<T> inherits from NSArray<T>).

Check Objective-C type arguments against the type parameters of the
corresponding class. Verify the length of the type argument list and
that each type argument satisfies the corresponding bound.

Specializations of parameterized Objective-C classes are represented
in the type system as distinct types. Both specialized types (e.g.,
NSArray<NSString *> *) and unspecialized types (NSArray *) are
represented, separately.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241542 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 03:57:35 +00:00
Douglas Gregor 5df68d34cd Parsing, semantic analysis, and AST for Objective-C type parameters.
Produce type parameter declarations for Objective-C type parameters,
and attach lists of type parameters to Objective-C classes,
categories, forward declarations, and extensions as
appropriate. Perform semantic analysis of type bounds for type
parameters, both in isolation and across classes/categories/extensions
to ensure consistency.

Also handle (de-)serialization of Objective-C type parameter lists,
along with sundry other things one must do to add a new declaration to
Clang.

Note that Objective-C type parameters are typedef name declarations,
like typedefs and C++11 type aliases, in support of type erasure.

Part of rdar://problem/6294649.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241541 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 03:57:15 +00:00
Alex Denisov 3849076ca6 [ObjC] Add NSValue support for objc_boxed_expressions
Patch extends ObjCBoxedExpr to accept records (structs and unions):

typedef struct __attribute__((objc_boxable)) _Color {
  int r, g, b;
} Color;

Color color;
NSValue *boxedColor = @(color); // [NSValue valueWithBytes:&color objCType:@encode(Color)];



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240761 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-26 05:28:36 +00:00
Alexander Kornienko 8ca7705aa3 Revert r240270 ("Fixed/added namespace ending comments using clang-tidy").
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240353 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 23:07:51 +00:00
Alexander Kornienko ac58acc7f2 Fixed/added namespace ending comments using clang-tidy. NFC
The patch is generated using this command:

  $ tools/extra/clang-tidy/tool/run-clang-tidy.py -fix \
      -checks=-*,llvm-namespace-comment -header-filter='llvm/.*|clang/.*' \
      work/llvm/tools/clang

To reduce churn, not touching namespaces spanning less than 10 lines.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240270 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 09:47:44 +00:00
Douglas Gregor 109dad2dfc Introduced pragmas for audited nullability regions.
Introduce the clang pragmas "assume_nonnull begin" and "assume_nonnull
end" in which we make default assumptions about the nullability of many
unannotated pointers:

  - Single-level pointers are inferred to __nonnull
  - NSError** in a (function or method) parameter list is inferred to
    NSError * __nullable * __nullable.
  - CFErrorRef * in a (function or method) parameter list is inferred
    to CFErrorRef __nullable * __nullable.
  - Other multi-level pointers are never inferred to anything.

Implements rdar://problem/19191042.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240156 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-19 18:25:57 +00:00
Douglas Gregor e3a960065d Extend type nullability qualifiers for Objective-C.
Introduce context-sensitive, non-underscored nullability specifiers
(nonnull, nullable, null_unspecified) for Objective-C method return
types, method parameter types, and properties.

Introduce Objective-C-specific semantics, including computation of the
nullability of the result of a message send, merging of nullability
information from the @interface of a class into its @implementation,
etc .

This is the Objective-C part of rdar://problem/18868820.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240154 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-19 18:14:38 +00:00
Fariborz Jahanian d6104dcab5 [Objective-C Sema]This patch fixes the warning when clang issues
"multiple methods named '<selector>' found" warning by noting 
the method that is actualy used. It also cleans up and refactors
code in this area and selects a method that matches actual arguments
in case of receiver being a forward class object.
rdar://19265430


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235023 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-15 17:26:21 +00:00
Fariborz Jahanian f6543787b0 [Objective-C Sema] Fixes a typo which did not allow
bridge casting to super class of object's bridge type.
rdar://18311183


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234652 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-10 22:07:47 +00:00
Fariborz Jahanian 7e9f4eeaf9 [Objective-C Sema] It is permissable to bridge cast to 'id'
of a CFType bridged to some unknown Objective-C type. 
rdar://20113785


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234545 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-09 23:39:53 +00:00
Chandler Carruth 1ede25994e [Modules] Make Sema's map of referenced selectors have a deterministic
order based on order of insertion.

This should cause both our warnings about these and the modules
serialization to be deterministic as a consequence.

Found by inspection.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233343 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-27 00:55:05 +00:00
Fariborz Jahanian 45e5caa859 [Objective-C Sema]. Remove -Wreceiver-is-weak warning.
It is incorrect and better warning is issued under
-Warc-repeated-use-of-weak. rdar://16316934.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231851 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-10 21:28:33 +00:00
John McCall e9bbc1a72b Recognize objc_bridge(id) on bridged casts to CF types.
Fixes <rdar://20107345>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231814 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-10 18:41:23 +00:00
Alex Denisov 5dc6c6cd87 New ObjC warning: circular containers.
This commit adds new warning to prevent user from creating 'circular containers'.

Mutable collections from NSFoundation allows user to add collection to itself, e.g.: 

NSMutableArray *a = [NSMutableArray new]; 
[a addObject:a]; 

The code above leads to really weird behaviour (crashes, 'endless' recursion) and 
retain cycles (collection retains itself) if ARC enabled.

Patch checks the following collections: 
  - NSMutableArray, 
  - NSMutableDictionary, 
  - NSMutableSet, 
  - NSMutableOrderedSet, 
  - NSCountedSet. 



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231265 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-04 17:55:52 +00:00
Ben Langmuir b378995a9f Allow (Object *)kMyGlobalCFObj casts without bridging
Previously we allowed these casts only for constants declared in system
headers, which we assume are retain/release-neutral. Now also allow them
for constants in user headers, treating them as +0.  Practically, this
means that we will now allow:
id x = (id)kMyGlobalConst;

But unlike with system headers we cannot mix them with +1 values:
id y = (id)(b ? kMyGlobalConst : [Obj newValAtPlusOne]); // error
id z = (id)(b ? kSystemGlobalConst: [Obj newValAtPlusOne]); // OK

Thanks to John for suggesting this improvement.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230534 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-25 20:09:06 +00:00
Alex Denisov 414133a38e Fix crash when clang tries to build NSNumber literal after forward declaration
Bug report: http://llvm.org/bugs/show_bug.cgi?id=22561

Clang tries to create ObjCBoxedExpression of type 'NSNumber'
when 'NSNumber' has only forward declaration, this cause a crash later, 
when 'Sema' refers to a nil QualType of the whole expression.
Please, refer to the bug report for the better explanation.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229402 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-16 16:17:05 +00:00
Fariborz Jahanian 8574a588fc Patch fixes PR21932 crash on invalid code. Using
property-dot syntax on 'super' with no super
class. Patch by Jason Haslam.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226578 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-20 16:53:34 +00:00
Nico Weber 7b38956489 Address review feedback on r221933.
Remove ObjCMethodList::Count, instead store a "has more than one decl" bit in
the low bit of the ObjCMethodDecl pointer, using a PointerIntPair.

Most of this patch is replacing ".Method" with ".getMethod()".

No intended behavior change.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224876 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-27 03:58:08 +00:00
Fariborz Jahanian bb657de5a6 [Objective-C]. This patch extends objc_bridge attribute to support objc_bridge(id).
This means that a pointer to the struct type to which the attribute appertains 
is a CF type (and therefore an Objective-C object of some type), but not of any 
specific class. rdar://19157264


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224072 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-11 22:56:26 +00:00
Sylvestre Ledru 401135c22d Fix the indentation: Nesting level does not match indentation (CID 1254863)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222152 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-17 18:26:39 +00:00
Fariborz Jahanian 5a9e570023 Objective-C. Fixes a regression caused by implementation
of new warning for deprecated method call for receiver
of type 'id'. This addresses rdar://18960378 where
unintended warnings being issued.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221933 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-13 22:27:05 +00:00
Fariborz Jahanian 90d23dda98 [Objective-C Sema]. Issue availability/deprecated warning when
there is a uinque method found when message is sent to receiver 
of 'id' type. // rdar://18848183


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221562 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-07 23:51:15 +00:00
Fariborz Jahanian 951324d0ef Objective-C. revert patch for rdar://17554063.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220812 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-28 18:28:16 +00:00
Fariborz Jahanian c3ceec3848 [Objective-C]. revert r220740,r220727
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220802 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-28 17:26:21 +00:00
Fariborz Jahanian 23b7656b34 Objective-C ARC [qoi]. Issue diagnostic if __bridge casting
to C type a collection literal. rdar://18768214


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220727 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-27 22:33:06 +00:00
Kaelyn Takata 07ccb0381a Pass around CorrectionCandidateCallbacks as unique_ptrs so
TypoCorrectionConsumer can keep the callback around as long as needed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220693 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-27 18:07:29 +00:00
Fariborz Jahanian d2490044a6 Objective-C. Under a special flag, -Wcstring-format-directive,
off by default, issue a warning if %s directive is used
in formart argument of a function/method declared as
__attribute__((format(CF/NSString, ...)))
To complete rdar://18182443


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217619 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-11 19:13:23 +00:00
Fariborz Jahanian d6d59f0664 Objective-C. Under a special flag, -Wcstring-format-directive,
off by default, issue a warning if %s directive is used in
certain CF/NS formatting APIs, to assist user in deprecating
use of such %s in these APIs. rdar://18182443


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217467 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-09 23:10:54 +00:00
Craig Topper d39a2d4063 Use llvm::makeArrayRef instead of explicitly calling ArrayRef constructor and mentioning the type. This works now that we have a conversion from ArrayRef<T*> to ArrayRef<const T*>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216824 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-30 16:55:39 +00:00
Fariborz Jahanian effffaae3b Objective-C. Allow [super initialize] in an +initialize
implementation but not anywhere else.
rdar://16628028


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216408 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-25 21:27:38 +00:00
Fariborz Jahanian 024d9c65e9 Objective-C. Warn when @encode'ing provides an incomplete
type encoding because in certain cases, such as for vector
types, because we still haven't designed encoding for them.
rdar://9255564


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216301 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-22 23:17:52 +00:00
Fariborz Jahanian 7d38fcd81f Objective-C. Update my previous patch to not warn if
+initialize is called on 'super' in its implementation.
rdar://16628028


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216282 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-22 19:52:49 +00:00
Fariborz Jahanian 99ef95c3fc Objective-C. Warn if user has made explicit call
to +initilize as this results in an extra call
to this method. rdar://16628028


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216271 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-22 16:57:26 +00:00
Fariborz Jahanian b9f1d9e841 Objective-C [qoi]. Provide fix-it hint when sending
class method to an object receiver. rdar://16263395



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216038 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-19 23:39:17 +00:00
Fariborz Jahanian 34db924fa7 Objective-C. Do not warn if user is using property-dox syntax to name a
user provided setter name (as declared in @property attribute declaration).
rdar://18022762


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215736 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-15 17:39:00 +00:00
Fariborz Jahanian cd21fe6e8a Objective-C. Handle case of multiple class methods
found in global pool as well. rdar://16808765


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215603 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-13 23:38:04 +00:00
Fariborz Jahanian dc812ef2ed Objective-C. Minor refactoring of my last patch.
// rdar://16808765


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215581 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-13 21:24:14 +00:00
Fariborz Jahanian 7cdaec7226 Objective-C. This patch is to resolve the method used in method
expression to the best method found in global method pools. 
This is wip.  // rdar://16808765


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215577 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-13 21:07:35 +00:00
Fariborz Jahanian 7c33b6163c Objective-C [qoi]. Patch to not do Fix-It for fixing
a messaging expression except in the simple case
of a unary selector. We cannot reliably provide such a fixit due
to numerous reasons where a matching selector could not be found.
rdar://15756038


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215480 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-12 22:16:41 +00:00
Fariborz Jahanian 6149524f3a Objective-C [qoi]. Issue warning and fixit if property-dot syntax
use mis-cased property name (which is currently accepted silently
due to the way property setters are named). rdar://17911746


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215250 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-08 22:33:24 +00:00
Fariborz Jahanian 25fa83175c Objective-C. Minor refactoring of my previous patch.
rdar://17554063


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215235 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-08 18:29:52 +00:00
Fariborz Jahanian 422dd7b9f7 Objective-C ARC. Use of non-retain/autorelease API
for building Objective-C array literals in ARC
mode. rdar://17554063


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215232 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-08 17:31:14 +00:00
Fariborz Jahanian 62e6156242 Objective-C arc. Switch the Objective-C dictionary literal in ARC mode
to use non-retain/autorelease API variants of ObjC objects. wip.
rdar://17554063


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215146 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-07 20:57:35 +00:00
Fariborz Jahanian cce419586f Objective-C ARC. More code for Objective-C's
new APIs for literals. nfc. wip. rdar://17554063


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215043 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-06 23:40:31 +00:00
Fariborz Jahanian 8d3e43c6b1 Objective-C ARC. First patch toward generating new APIs
for Objective-C's array and dictionary literals.
rdar://17554063. This is wip.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214983 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-06 18:13:46 +00:00
Aaron Ballman 306de08679 Replacing some more complex logic with a helper function call to ObjCMethod::getReturnTypeSourceRange. No functional changes intended.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214511 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-01 13:20:09 +00:00