From 61a5953b7d491729d1635e81126572ebec10f23c Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Fri, 25 Mar 2016 18:43:46 +0000 Subject: [PATCH] [ObjCXX] Warn undeclared identifiers. Instantiation dependence were not being handled correctly for OpqaueValueExpr AST nodes. As a result, if an undeclared identifier was used in a CXXNewExpr that is assigned to a ObjC property, there would be no error during parsing, and there would be a crash during code gen. This patch makes sure that an error will be issued during parsing in this case. Before the fix, if CXXNewExpr has a typo, its InstantiationDependent will be set to true, but if it is wrapped in a OpaqueValueExpr, the OpaqueValueExpr will not be instantiation dependent, causing the TypoExpr not be to resolved. The fix propagates InstantiationDependent to OpaqueValueExpr from its SourceExpr. It also propagates the other instantiation bits. rdar://24975562 Differential Revision: http://reviews.llvm.org/D18461 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264444 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 6 ++++-- include/clang/AST/Stmt.h | 1 + test/SemaObjCXX/typo-correction.mm | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 test/SemaObjCXX/typo-correction.mm diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index bc5dab754c..6b14c60e95 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -847,10 +847,12 @@ public: ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr) : Expr(OpaqueValueExprClass, T, VK, OK, - T->isDependentType(), + T->isDependentType() || + (SourceExpr && SourceExpr->isTypeDependent()), T->isDependentType() || (SourceExpr && SourceExpr->isValueDependent()), - T->isInstantiationDependentType(), + T->isInstantiationDependentType() || + (SourceExpr && SourceExpr->isInstantiationDependent()), false), SourceExpr(SourceExpr), Loc(Loc) { } diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index d3950e92cf..b6ed6c547c 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -115,6 +115,7 @@ protected: friend class OverloadExpr; // ctor friend class PseudoObjectExpr; // ctor friend class AtomicExpr; // ctor + friend class OpaqueValueExpr; // ctor unsigned : NumStmtBits; unsigned ValueKind : 2; diff --git a/test/SemaObjCXX/typo-correction.mm b/test/SemaObjCXX/typo-correction.mm new file mode 100644 index 0000000000..a34a7901e8 --- /dev/null +++ b/test/SemaObjCXX/typo-correction.mm @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +class ClassA {}; + +class ClassB { +public: + ClassB(ClassA* parent=0); + ~ClassB(); +}; + +@interface NSObject +@end + +@interface InterfaceA : NSObject +@property(nonatomic, assign) ClassA *m_prop1; // expected-note {{here}} +@property(nonatomic, assign) ClassB *m_prop2; +@end + +@implementation InterfaceA +- (id)test { + self.m_prop2 = new ClassB(m_prop1); // expected-error {{use of undeclared identifier 'm_prop1'; did you mean '_m_prop1'?}} +} +@end -- 2.40.0