diff --git a/clang/lib/Sema/BSC/SemaBSCTrait.cpp b/clang/lib/Sema/BSC/SemaBSCTrait.cpp index 31210494b9c493301fd25c6358daf027be8207e3..be4778e7f7d546168b5cbf1beb509da95af0d63d 100644 --- a/clang/lib/Sema/BSC/SemaBSCTrait.cpp +++ b/clang/lib/Sema/BSC/SemaBSCTrait.cpp @@ -371,9 +371,11 @@ static bool IsImplTraitDeclIllegal(Sema &S, QualType TraitQT, QualType &ImplQT, QualType TraitQT = FieldIt->getType()->getPointeeType(); const FunctionProtoType *TraitTy = TraitQT->getAs(); BSCMethodDecl *MD = nullptr; - DeclContext *DC = // The Type's member functions - S.getASTContext() - .BSCDeclContextMap[ImplQT.getCanonicalType().getTypePtr()]; + DeclContext *DC = nullptr; + if(S.getASTContext().BSCDeclContextMap.find(ImplQT.getCanonicalType().getTypePtr()) != + S.getASTContext().BSCDeclContextMap.end()){ + DC = S.getASTContext().BSCDeclContextMap[ImplQT.getCanonicalType().getTypePtr()]; + } if (DC) { DeclContext::lookup_result DR = DC->lookup(FunctionID); for (NamedDecl *D : DR) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 10c488b24d5b174a3d8d4421c23fd66641f42f08..12754defd3fe36821b318d785d9596e833458ed5 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2367,7 +2367,10 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, DeclContext *DC = SS.isEmpty() ? CurContext : nullptr; #if ENABLE_BSC if (!ET.isNull()) { - DC = getASTContext().BSCDeclContextMap[ET.getCanonicalType().getTypePtr()]; + if(getASTContext().BSCDeclContextMap.find(ET.getCanonicalType().getTypePtr()) != + getASTContext().BSCDeclContextMap.end()){ + DC = getASTContext().BSCDeclContextMap[ET.getCanonicalType().getTypePtr()]; + } } #endif while (DC) { diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 112c767a1b045705ce2c956ab0bf306f108a69eb..a2d0f27f55a9a78b88bae13ce86a705204a5ccbf 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1333,9 +1333,10 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, if (!ET.isNull()) { if (const BuiltinType *BTy = ET->getAs()) BuiltinName = BTy->getNameAsCString(getPrintingPolicy()); - else - DC = getASTContext() - .BSCDeclContextMap[ET.getCanonicalType().getTypePtr()]; + else if(getASTContext().BSCDeclContextMap.find(ET.getCanonicalType().getTypePtr()) != + getASTContext().BSCDeclContextMap.end()){ + DC = getASTContext().BSCDeclContextMap[ET.getCanonicalType().getTypePtr()]; + } // If this first parameter is not "this", // it can only be called through '::'. if (!MemberFn->getHasThisParam()) { @@ -1560,6 +1561,8 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, S.getASTContext().BSCDeclContextMap.end()) { auto DeclContext = S.getASTContext().BSCDeclContextMap[BTy]; // TODO: add assert + if(!DeclContext) + return ExprResult(TE); RecordDecl *Rdecl = dyn_cast(DeclContext); const RecordType *RTy = dyn_cast(Rdecl->getTypeForDecl()); if (LookupMemberExprInRecord(S, R, BaseExpr.get(), RTy, OpLoc, IsArrow, diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 624fbb8ea8a31b8b8cdd8012fc02c55dc92cc38c..b7f6ba9761c71b63f28c6a66e3d583ee6b6a99b6 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -2775,8 +2775,11 @@ bool Sema::LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, #if ENABLE_BSC if (!T.isNull() && getLangOpts().BSC) { - DeclContext *DC = - getASTContext().BSCDeclContextMap[T.getCanonicalType().getTypePtr()]; + DeclContext *DC = nullptr; + if(getASTContext().BSCDeclContextMap.find(T.getCanonicalType().getTypePtr()) != + getASTContext().BSCDeclContextMap.end()){ + DC = getASTContext().BSCDeclContextMap[T.getCanonicalType().getTypePtr()]; + } if (DC) return LookupQualifiedName(R, DC); else diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 018f30cc8063cefb95ad5f51b7dceb3fafcc8bea..25e0c1b7df8956cb1193dd6e9f0a107e36352b43 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -494,8 +494,11 @@ bool Sema::LookupTemplateName(LookupResult &Found, } #if ENABLE_BSC if (!T.isNull() && getLangOpts().BSC) { - DeclContext *DC = - getASTContext().BSCDeclContextMap[T.getCanonicalType().getTypePtr()]; + DeclContext *DC = nullptr; + if(getASTContext().BSCDeclContextMap.find(T.getCanonicalType().getTypePtr()) != + getASTContext().BSCDeclContextMap.end()){ + DC = getASTContext().BSCDeclContextMap[T.getCanonicalType().getTypePtr()]; + } if (DC) LookupQualifiedName(Found, DC); } @@ -3213,9 +3216,11 @@ TemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier( T = QualType(SS.getScopeRep()->getAsType(), 0); #if ENABLE_BSC } else if (!ExtendedTy.isNull()) { - DeclContext *DC = - getASTContext() - .BSCDeclContextMap[ExtendedTy.getCanonicalType().getTypePtr()]; + DeclContext *DC = nullptr; + if(getASTContext().BSCDeclContextMap.find(ExtendedTy.getCanonicalType().getTypePtr()) != + getASTContext().BSCDeclContextMap.end()){ + DC = getASTContext().BSCDeclContextMap[ExtendedTy.getCanonicalType().getTypePtr()]; + } if (DC) { if (RecordDecl *Record = dyn_cast_or_null(DC)) T = Context.getTypeDeclType(Record); diff --git a/clang/test/BSC/Negative/Method/BuiltInType/void_member_call/void_member_call.cbs b/clang/test/BSC/Negative/Method/BuiltInType/void_member_call/void_member_call.cbs new file mode 100644 index 0000000000000000000000000000000000000000..75ec1bc9301c12b40e42a9213d98d2eebeff8bcf --- /dev/null +++ b/clang/test/BSC/Negative/Method/BuiltInType/void_member_call/void_member_call.cbs @@ -0,0 +1,43 @@ +// RUN: %clang_cc1 -verify %s + +void * func1() { + void::memvar; // expected-error{{variable has incomplete type 'void'}} expected-error{{use of undeclared identifier 'memvar'}} + void *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'void'}} +} + + +void * func2() { + void *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'void'}} +} + +void * func3() { + void::memfunc(); // expected-error{{variable has incomplete type 'void'}} expected-error{{use of undeclared identifier 'memfunc'}} + void *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'void'}} +} + +void void::memfunc_defined(){ // expected-error{{variable has incomplete type 'void'}} + return; +} +void * func4() { + void::memfunc_defined(); // expected-error{{variable has incomplete type 'void'}} expected-error{{use of undeclared identifier 'memfunc_defined'}} + void *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'void'}} +} + +void int::memfunc_defined(){ + return; +} +void * func5() { + int::memfunc_defined(); + int *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'int'}} +} + +void * func6() { + void int::var; // expected-error{{cannot combine with previous 'void' declaration specifier}} expected-error{{variable has incomplete type 'void'}} expected-error{{use of undeclared identifier 'var'}} + void *ptr; + ptr->var; // expected-error{{no member named 'var' in type 'void'}} +} \ No newline at end of file