forked from OSchip/llvm-project
Don't suggest dynamic_cast or typeid as code completion results when
RTTI is disabled. Similarly, don't suggest throw or try as code completion results when C++ exceptions are disabled. Fixes <rdar://problem/9193560>. llvm-svn: 129346
This commit is contained in:
parent
fbcd69b96a
commit
c05f657d83
|
@ -1482,7 +1482,8 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
|
|||
case Sema::PCC_Statement: {
|
||||
AddTypedefResult(Results);
|
||||
|
||||
if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns()) {
|
||||
if (SemaRef.getLangOptions().CPlusPlus && Results.includeCodePatterns() &&
|
||||
SemaRef.getLangOptions().CXXExceptions) {
|
||||
Builder.AddTypedTextChunk("try");
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
|
||||
Builder.AddPlaceholderChunk("statements");
|
||||
|
@ -1655,15 +1656,17 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
|
|||
Results.AddResult(Result("true"));
|
||||
Results.AddResult(Result("false"));
|
||||
|
||||
// dynamic_cast < type-id > ( expression )
|
||||
Builder.AddTypedTextChunk("dynamic_cast");
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
|
||||
Builder.AddPlaceholderChunk("type");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightAngle);
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
|
||||
Builder.AddPlaceholderChunk("expression");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightParen);
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
if (SemaRef.getLangOptions().RTTI) {
|
||||
// dynamic_cast < type-id > ( expression )
|
||||
Builder.AddTypedTextChunk("dynamic_cast");
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftAngle);
|
||||
Builder.AddPlaceholderChunk("type");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightAngle);
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
|
||||
Builder.AddPlaceholderChunk("expression");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightParen);
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
}
|
||||
|
||||
// static_cast < type-id > ( expression )
|
||||
Builder.AddTypedTextChunk("static_cast");
|
||||
|
@ -1695,13 +1698,15 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
|
|||
Builder.AddChunk(CodeCompletionString::CK_RightParen);
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
|
||||
// typeid ( expression-or-type )
|
||||
Builder.AddTypedTextChunk("typeid");
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
|
||||
Builder.AddPlaceholderChunk("expression-or-type");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightParen);
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
|
||||
if (SemaRef.getLangOptions().RTTI) {
|
||||
// typeid ( expression-or-type )
|
||||
Builder.AddTypedTextChunk("typeid");
|
||||
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
|
||||
Builder.AddPlaceholderChunk("expression-or-type");
|
||||
Builder.AddChunk(CodeCompletionString::CK_RightParen);
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
}
|
||||
|
||||
// new T ( ... )
|
||||
Builder.AddTypedTextChunk("new");
|
||||
Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
|
||||
|
@ -1738,11 +1743,13 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC,
|
|||
Builder.AddPlaceholderChunk("expression");
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
|
||||
// throw expression
|
||||
Builder.AddTypedTextChunk("throw");
|
||||
Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
|
||||
Builder.AddPlaceholderChunk("expression");
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
if (SemaRef.getLangOptions().CXXExceptions) {
|
||||
// throw expression
|
||||
Builder.AddTypedTextChunk("throw");
|
||||
Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
|
||||
Builder.AddPlaceholderChunk("expression");
|
||||
Results.AddResult(Result(Builder.TakeString()));
|
||||
}
|
||||
|
||||
// FIXME: Rethrow?
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ typedef struct t TYPEDEF;
|
|||
|
||||
void foo() {
|
||||
int y = 17;
|
||||
// RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:6:14 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -code-completion-patterns -code-completion-at=%s:6:14 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// CHECK-CC1: COMPLETION: bool
|
||||
// CHECK-CC1-NEXT: COMPLETION: char
|
||||
// CHECK-CC1-NEXT: COMPLETION: class
|
||||
|
@ -132,7 +132,7 @@ void foo() {
|
|||
// CHECK-CC3-NEXT: COMPLETION: wchar_t
|
||||
// CHECK-CC3-NEXT: COMPLETION: X : X
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:6:11 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -code-completion-patterns -code-completion-at=%s:6:11 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// CHECK-CC4: COMPLETION: bool
|
||||
// CHECK-CC4-NEXT: COMPLETION: char
|
||||
// CHECK-CC4-NEXT: COMPLETION: class
|
||||
|
@ -173,3 +173,57 @@ void foo() {
|
|||
// CHECK-CC4-NEXT: COMPLETION: X : X
|
||||
// CHECK-CC4-NEXT: COMPLETION: y : [#int#]y
|
||||
// CHECK-CC4-NEXT: COMPLETION: z : [#void#]z(<#int#>)
|
||||
|
||||
// RUN: %clang_cc1 -fsyntax-only -fno-rtti -code-completion-patterns -code-completion-at=%s:6:14 %s -o - | FileCheck -check-prefix=CHECK-NO-RTTI %s
|
||||
// CHECK-NO-RTTI: COMPLETION: bool
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: char
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: class
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: const
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : const_cast<<#type#>>(<#expression#>)
|
||||
// CHECK-NO-RTTI: COMPLETION: Pattern : delete <#expression#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : delete [] <#expression#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : do{<#statements#>
|
||||
// CHECK-NO-RTTI: COMPLETION: double
|
||||
// CHECK-NO-RTTI-NOT: dynamic_cast
|
||||
// CHECK-NO-RTTI: COMPLETION: enum
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: extern
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: false
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: float
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: foo : [#void#]foo()
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : for(<#init-statement#>;<#condition#>;<#inc-expression#>){
|
||||
// CHECK-NO-RTTI: COMPLETION: Pattern : goto <#label#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : if(<#condition#>){<#statements#>
|
||||
// CHECK-NO-RTTI: COMPLETION: int
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: long
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>(<#expressions#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : new <#type#>[<#size#>](<#expressions#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: operator
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : reinterpret_cast<<#type#>>(<#expression#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : return
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: short
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: signed
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : sizeof(<#expression-or-type#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: static
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : static_cast<<#type#>>(<#expression#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: struct
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : switch(<#condition#>){
|
||||
// CHECK-NO-RTTI: COMPLETION: t : t
|
||||
// CHECK-NO-RTTI-NOT: throw
|
||||
// CHECK-NO-RTTI: COMPLETION: true
|
||||
// CHECK-NO-RTTI-NOT: try
|
||||
// CHECK-NO-RTTI: COMPLETION: TYPEDEF : TYPEDEF
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typedef <#type#> <#name#>
|
||||
// CHECK-NO-RTTI-NOT: typeid
|
||||
// CHECK-NO-RTTI: COMPLETION: Pattern : typename <#qualifier#>::<#name#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof <#expression#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : typeof(<#type#>)
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: union
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: unsigned
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : using namespace <#identifier#>
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: void
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: volatile
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: wchar_t
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: Pattern : while(<#condition#>){<#statements#>
|
||||
// CHECK-NO-RTTI: COMPLETION: X : X
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: y : [#int#]y
|
||||
// CHECK-NO-RTTI-NEXT: COMPLETION: z : [#void#]z(<#int#>)
|
||||
|
|
Loading…
Reference in New Issue