Index: lib/Sema/SemaExprObjC.cpp =================================================================== --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -218,7 +218,9 @@ S.Diag(Loc, diag::err_undeclared_nsnumber); return nullptr; } - + } + + if (S.NSNumberPointer.isNull()) { // generate the pointer to NSNumber type. QualType NSNumberObject = CX.getObjCInterfaceType(S.NSNumberDecl); S.NSNumberPointer = CX.getObjCObjectPointerType(NSNumberObject); Index: test/SemaObjC/objc-literal-nsnumber.m =================================================================== --- test/SemaObjC/objc-literal-nsnumber.m +++ test/SemaObjC/objc-literal-nsnumber.m @@ -9,6 +9,25 @@ typedef int NSInteger; #endif +void checkNSNumberUnavailableDiagnostic() { + id num = @1000; // expected-error {{NSNumber must be available to use Objective-C literals}} + + int x = 1000; + id num1 = @(x); // expected-error {{NSNumber must be available to use Objective-C literals}}\ + // expected-error {{illegal type 'int' used in a boxed expression}} +} + +@class NSNumber; + +void checkNSNumberFDDiagnostic() { + id num = @1000; // expected-error {{NSNumber must be available to use Objective-C literals}} + + int x = 1000; + id num1 = @(x); // expected-error {{declaration of 'numberWithInt:' is missing in NSNumber class}}\ + // expected-error {{illegal type 'int' used in a boxed expression}} +} + + @interface NSObject + (NSObject*)nsobject; @end