diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp index 0f4cef6221c9472107ac6ee64f666f54018fe284..599c179b5cc9bce90ed3753645fd3c3f57dcd2db 100644 --- a/clang/lib/Sema/SemaCXXScopeSpec.cpp +++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -219,14 +219,19 @@ bool Sema::RequireCompleteDeclContext(CXXScopeSpec &SS, return false; SourceLocation loc = SS.getLastQualifierNameLoc(); - if (loc.isInvalid()) loc = SS.getRange().getBegin(); - if (LangOpts.BSC && loc.isInvalid()) - loc = tag->getBeginLoc(); + if (loc.isInvalid()) { + if (!LangOpts.BSC) + loc = SS.getRange().getBegin(); + else + loc = tag->getBeginLoc(); // FIXME: not same as SS.getRange().getBegin() + } // The type must be complete. if (RequireCompleteType(loc, type, diag::err_incomplete_nested_name_spec, SS.getRange())) { - SS.SetInvalid(SS.getRange()); + // For BSC, SS.getRange() is invalid + if (!LangOpts.BSC) + SS.SetInvalid(SS.getRange()); return true; } diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 163a94d487251b3ad011e79da122ea6811155a0f..ab704fe54b8fcda84b19c1f66da8bd057ecdeed9 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -341,8 +341,8 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, if (dyn_cast_or_null( BasedType->getAsTagDecl())) { LookupCtx = BasedType->getAsTagDecl(); - if (LookupCtx) - RequireCompleteDeclContext(*SS, LookupCtx); + if (LookupCtx && RequireCompleteDeclContext(*SS, LookupCtx)) + return nullptr; } } diff --git a/clang/test/BSC/Generic/GenericTypeMethods/member_func_cc1_coredump.cbs b/clang/test/BSC/Generic/GenericTypeMethods/member_func_cc1_coredump.cbs new file mode 100644 index 0000000000000000000000000000000000000000..3fb1a687455670a99644283bb90ba1d3997360bc --- /dev/null +++ b/clang/test/BSC/Generic/GenericTypeMethods/member_func_cc1_coredump.cbs @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -verify %s + +#include "stdlib.h" // expected-error {{'stdlib.h' file not found}} + +struct PollResult { + _Bool isPending; +}; + +int struct PollResult::completed() { + return 0; +} + +struct _Futureread {}; + +int struct _Futureread::poll(struct _Futureread *this) { + struct PollResult poll_result; + return struct PollResult::completed(); +} + diff --git a/clang/test/BSC/Generic/StructAndFunction/return_type_instantiated_struct1.cbs b/clang/test/BSC/Generic/StructAndFunction/return_type_instantiated_struct1.cbs index 258aa536e75899cab3429754d4fe94df3777af8b..d3f1158ccca70a4ba59f7223914942d5a0e65506 100644 --- a/clang/test/BSC/Generic/StructAndFunction/return_type_instantiated_struct1.cbs +++ b/clang/test/BSC/Generic/StructAndFunction/return_type_instantiated_struct1.cbs @@ -6,12 +6,12 @@ struct PollResult { _Bool isPending; }; -struct PollResult poll() { +struct PollResult int::poll() { struct PollResult s; return s; } -void struct PollResult::foo(struct PollResult *this) { +void struct PollResult::foo(struct PollResult *this) { }