From: Douglas Gregor Date: Tue, 12 Apr 2011 02:47:21 +0000 (+0000) Subject: Don't suggest dynamic_cast or typeid as code completion results when X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec3310a1e371cc3bfc0f2c355767d1b6653357f2;p=clang 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 . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129346 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 72074ae820..75253b5b30 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -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? } diff --git a/test/CodeCompletion/ordinary-name.cpp b/test/CodeCompletion/ordinary-name.cpp index 6771dd2265..4dbf84dc17 100644 --- a/test/CodeCompletion/ordinary-name.cpp +++ b/test/CodeCompletion/ordinary-name.cpp @@ -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#>)