Skip to content

Commit e958456

Browse files
authored
[clang][Interp] Ignore ObjCBoxedExpr subexpr... (#102136)
... if it can't be expressed as a constant initializer.
1 parent de5081c commit e958456

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

clang/lib/AST/Interp/Compiler.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,10 +3161,11 @@ bool Compiler<Emitter>::VisitExtVectorElementExpr(
31613161

31623162
template <class Emitter>
31633163
bool Compiler<Emitter>::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
3164+
const Expr *SubExpr = E->getSubExpr();
31643165
if (!E->isExpressibleAsConstantInitializer())
3165-
return this->emitInvalid(E);
3166+
return this->discard(SubExpr) && this->emitInvalid(E);
31663167

3167-
return this->delegate(E->getSubExpr());
3168+
return this->delegate(SubExpr);
31683169
}
31693170

31703171
template <class Emitter>

clang/test/AST/Interp/objc.mm

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,28 @@ @interface NSString
1111
@end
1212
constexpr NSString *t0 = @"abc";
1313
constexpr NSString *t1 = @("abc");
14+
15+
16+
#if __LP64__
17+
typedef unsigned long NSUInteger;
18+
typedef long NSInteger;
19+
#else
20+
typedef unsigned int NSUInteger;
21+
typedef int NSInteger;
22+
#endif
23+
24+
25+
@class NSNumber;
26+
27+
28+
@interface NSObject
29+
+ (NSObject*)nsobject;
30+
@end
31+
32+
@interface NSNumber : NSObject
33+
+ (NSNumber *)numberWithInt:(int)value;
34+
@end
35+
36+
int main(void) {
37+
NSNumber *bv = @(1391126400 * 1000); // both-warning {{overflow in expression; result is -443'003'904 with type 'int'}}
38+
}

0 commit comments

Comments
 (0)