[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. herzka added a reviewer: modocache. herzka added a comment. @modocache, should I add a unit test for these aliases or would that be too trivial? I don't see unit tests for all the existing flags. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D71709 Files: clang/include/clang/Driver/CC1Options.td Index: clang/include/clang/Driver/CC1Options.td === --- clang/include/clang/Driver/CC1Options.td +++ clang/include/clang/Driver/CC1Options.td @@ -272,8 +272,10 @@ HelpText<"Four-byte version string for gcov files.">; def test_coverage : Flag<["-"], "test-coverage">, HelpText<"Do not generate coverage files or remove coverage changes from IR">; -def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, +def coverage_mapping_dump : Flag<["-"], "coverage-mapping-dump">, HelpText<"Dump the coverage mapping records, for testing">; +def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, + Alias; def fuse_register_sized_bitfield_access: Flag<["-"], "fuse-register-sized-bitfield-access">, HelpText<"Use register sized accesses to bit-fields, when possible.">; def relaxed_aliasing : Flag<["-"], "relaxed-aliasing">, @@ -559,12 +561,16 @@ def Eonly : Flag<["-"], "Eonly">, HelpText<"Just run preprocessor, no output (for timings)">; -def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, +def raw_tokens_dump : Flag<["-"], "raw-tokens-dump">, HelpText<"Lex file in raw mode and dump raw tokens">; +def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, + Alias; def analyze : Flag<["-"], "analyze">, HelpText<"Run static analysis engine">; -def dump_tokens : Flag<["-"], "dump-tokens">, +def tokens_dump : Flag<["-"], "tokens-dump">, HelpText<"Run preprocessor, dump internal rep of tokens">; +def dump_tokens : Flag<["-"], "dump-tokens">, + Alias; def init_only : Flag<["-"], "init-only">, HelpText<"Only execute frontend initialization">; def fixit : Flag<["-"], "fixit">, @@ -726,8 +732,10 @@ HelpText<"Disable validation of precompiled headers">; def fallow_pch_with_errors : Flag<["-"], "fallow-pch-with-compiler-errors">, HelpText<"Accept a PCH file that was created with compiler errors">; -def dump_deserialized_pch_decls : Flag<["-"], "dump-deserialized-decls">, +def deserialized_pch_decls_dump : Flag<["-"], "deserialized-decls-dump">, HelpText<"Dump declarations that are deserialized from PCH, for testing">; +def dump_deserialized_pch_decls : Flag<["-"], "dump-deserialized-decls">, + Alias; def error_on_deserialized_pch_decl : Separate<["-"], "error-on-deserialized-decl">, HelpText<"Emit error if a specific declaration is deserialized from PCH, for testing">; def error_on_deserialized_pch_decl_EQ : Joined<["-"], "error-on-deserialized-decl=">, Index: clang/include/clang/Driver/CC1Options.td === --- clang/include/clang/Driver/CC1Options.td +++ clang/include/clang/Driver/CC1Options.td @@ -272,8 +272,10 @@ HelpText<"Four-byte version string for gcov files.">; def test_coverage : Flag<["-"], "test-coverage">, HelpText<"Do not generate coverage files or remove coverage changes from IR">; -def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, +def coverage_mapping_dump : Flag<["-"], "coverage-mapping-dump">, HelpText<"Dump the coverage mapping records, for testing">; +def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, + Alias; def fuse_register_sized_bitfield_access: Flag<["-"], "fuse-register-sized-bitfield-access">, HelpText<"Use register sized accesses to bit-fields, when possible.">; def relaxed_aliasing : Flag<["-"], "relaxed-aliasing">, @@ -559,12 +561,16 @@ def Eonly : Flag<["-"], "Eonly">, HelpText<"Just run preprocessor, no output (for timings)">; -def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, +def raw_tokens_dump : Flag<["-"], "raw-tokens-dump">, HelpText<"Lex file in raw mode and dump raw tokens">; +def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, + Alias; def analyze : Flag<["-"], "analyze">, HelpText<"Run static analysis engine">; -def dump_tokens : Flag<["-"], "dump-tokens">, +def tokens_dump : Flag<["-"], "tokens-dump">, HelpText<"Run preprocessor, dump internal rep of tokens">; +def dump_tokens : Flag<["-"], "dump-tokens">, + Alias; def init_only : Flag<["-"], "init-only">, HelpText<"Only execute frontend initialization">; def fixit : Flag<["-"], "fixit">, @@ -726,8 +732,10 @@ HelpText<"Disable validation of precompiled headers">; def fallow_pch_with_errors : Flag<["-"], "fallow-pch-with-compiler-errors">, HelpText<"Accept a PCH file that was created with compiler errors">; -def dump_deserialized_pch_decls : Flag<["-"], "dump-deserialized-decls">, +def deserialized_pch_decls_dump : Flag<["-"], "deserialized-decls
[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka added a comment. @modocache, should I add a unit test for these aliases or would that be too trivial? I don't see unit tests for all the existing flags. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71709/new/ https://reviews.llvm.org/D71709 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka updated this revision to Diff 234746. herzka added a comment. Update argument parsing Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71709/new/ https://reviews.llvm.org/D71709 Files: clang/include/clang/Driver/CC1Options.td clang/lib/Frontend/CompilerInvocation.cpp Index: clang/lib/Frontend/CompilerInvocation.cpp === --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -851,7 +851,7 @@ Opts.CoverageMapping = Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, false); - Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping); + Opts.DumpCoverageMapping = Args.hasArg(OPT_coverage_mapping_dump); Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose); Opts.PreserveAsmComments = !Args.hasArg(OPT_fno_preserve_as_comments); Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); @@ -1725,9 +1725,9 @@ Opts.ProgramAction = frontend::ASTView; break; case OPT_compiler_options_dump: Opts.ProgramAction = frontend::DumpCompilerOptions; break; -case OPT_dump_raw_tokens: +case OPT_raw_tokens_dump: Opts.ProgramAction = frontend::DumpRawTokens; break; -case OPT_dump_tokens: +case OPT_tokens_dump: Opts.ProgramAction = frontend::DumpTokens; break; case OPT_S: Opts.ProgramAction = frontend::EmitAssembly; break; @@ -3340,7 +3340,7 @@ Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch); Opts.AllowPCHWithCompilerErrors = Args.hasArg(OPT_fallow_pch_with_errors); - Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls); + Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_deserialized_pch_decls_dump); for (const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl)) Opts.DeserializedPCHDeclsToErrorOn.insert(A->getValue()); Index: clang/include/clang/Driver/CC1Options.td === --- clang/include/clang/Driver/CC1Options.td +++ clang/include/clang/Driver/CC1Options.td @@ -272,8 +272,10 @@ HelpText<"Four-byte version string for gcov files.">; def test_coverage : Flag<["-"], "test-coverage">, HelpText<"Do not generate coverage files or remove coverage changes from IR">; -def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, +def coverage_mapping_dump : Flag<["-"], "coverage-mapping-dump">, HelpText<"Dump the coverage mapping records, for testing">; +def dump_coverage_mapping : Flag<["-"], "dump-coverage-mapping">, + Alias; def fuse_register_sized_bitfield_access: Flag<["-"], "fuse-register-sized-bitfield-access">, HelpText<"Use register sized accesses to bit-fields, when possible.">; def relaxed_aliasing : Flag<["-"], "relaxed-aliasing">, @@ -559,12 +561,16 @@ def Eonly : Flag<["-"], "Eonly">, HelpText<"Just run preprocessor, no output (for timings)">; -def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, +def raw_tokens_dump : Flag<["-"], "raw-tokens-dump">, HelpText<"Lex file in raw mode and dump raw tokens">; +def dump_raw_tokens : Flag<["-"], "dump-raw-tokens">, + Alias; def analyze : Flag<["-"], "analyze">, HelpText<"Run static analysis engine">; -def dump_tokens : Flag<["-"], "dump-tokens">, +def tokens_dump : Flag<["-"], "tokens-dump">, HelpText<"Run preprocessor, dump internal rep of tokens">; +def dump_tokens : Flag<["-"], "dump-tokens">, + Alias; def init_only : Flag<["-"], "init-only">, HelpText<"Only execute frontend initialization">; def fixit : Flag<["-"], "fixit">, @@ -726,8 +732,10 @@ HelpText<"Disable validation of precompiled headers">; def fallow_pch_with_errors : Flag<["-"], "fallow-pch-with-compiler-errors">, HelpText<"Accept a PCH file that was created with compiler errors">; -def dump_deserialized_pch_decls : Flag<["-"], "dump-deserialized-decls">, +def deserialized_pch_decls_dump : Flag<["-"], "deserialized-decls-dump">, HelpText<"Dump declarations that are deserialized from PCH, for testing">; +def dump_deserialized_pch_decls : Flag<["-"], "dump-deserialized-decls">, + Alias; def error_on_deserialized_pch_decl : Separate<["-"], "error-on-deserialized-decl">, HelpText<"Emit error if a specific declaration is deserialized from PCH, for testing">; def error_on_deserialized_pch_decl_EQ : Joined<["-"], "error-on-deserialized-decl=">, Index: clang/lib/Frontend/CompilerInvocation.cpp === --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -851,7 +851,7 @@ Opts.CoverageMapping = Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, false); - Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping); + Opts.DumpCoverageMapping = Args.hasArg(OPT_coverage_mapping_dump); Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose
[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka added a comment. I worry that repeating all those names in those tests might be noisy. I think I'll switch those to use the new name, but add another test that makes sure both names still work. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71709/new/ https://reviews.llvm.org/D71709 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka updated this revision to Diff 234966. herzka added a comment. Herald added a reviewer: jdoerfert. change flags in tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71709/new/ https://reviews.llvm.org/D71709 Files: clang/lib/Frontend/CompilerInvocation.cpp clang/test/CoverageMapping/block-storage-starts-region.m clang/test/CoverageMapping/break.c clang/test/CoverageMapping/builtinmacro.c clang/test/CoverageMapping/casts.c clang/test/CoverageMapping/classtemplate.cpp clang/test/CoverageMapping/comment-in-macro.c clang/test/CoverageMapping/continue.c clang/test/CoverageMapping/control-flow-macro.c clang/test/CoverageMapping/decl.c clang/test/CoverageMapping/default-method.cpp clang/test/CoverageMapping/deferred-region.cpp clang/test/CoverageMapping/empty-destructor.cpp clang/test/CoverageMapping/header.cpp clang/test/CoverageMapping/if.cpp clang/test/CoverageMapping/implicit-def-in-macro.m clang/test/CoverageMapping/include-macros.c clang/test/CoverageMapping/includehell.cpp clang/test/CoverageMapping/label.cpp clang/test/CoverageMapping/lambda.cpp clang/test/CoverageMapping/logical.cpp clang/test/CoverageMapping/loopmacro.c clang/test/CoverageMapping/loops.cpp clang/test/CoverageMapping/macro-expansion.c clang/test/CoverageMapping/macro-expressions.cpp clang/test/CoverageMapping/macro-stringize-twice.cpp clang/test/CoverageMapping/macroception.c clang/test/CoverageMapping/macroparams.c clang/test/CoverageMapping/macroparams2.c clang/test/CoverageMapping/macros.c clang/test/CoverageMapping/macroscopes.cpp clang/test/CoverageMapping/md.cpp clang/test/CoverageMapping/moremacros.c clang/test/CoverageMapping/nestedclass.cpp clang/test/CoverageMapping/objc.m clang/test/CoverageMapping/openmp.c clang/test/CoverageMapping/pr32679.cpp clang/test/CoverageMapping/preprocessor.c clang/test/CoverageMapping/return.c clang/test/CoverageMapping/switch.cpp clang/test/CoverageMapping/switchmacro.c clang/test/CoverageMapping/system_macro.cpp clang/test/CoverageMapping/templates.cpp clang/test/CoverageMapping/test.c clang/test/CoverageMapping/trycatch.cpp clang/test/CoverageMapping/trymacro.cpp clang/test/CoverageMapping/unreachable-macro.c clang/test/CoverageMapping/unused_function.cpp clang/test/CoverageMapping/while.c clang/test/Lexer/dollar-idents.c clang/test/Preprocessor/dumptokens_phyloc.c clang/utils/token-delta.py Index: clang/utils/token-delta.py === --- clang/utils/token-delta.py +++ clang/utils/token-delta.py @@ -108,7 +108,7 @@ re.DOTALL | re.MULTILINE) def getTokens(path): -p = subprocess.Popen(['clang','-dump-raw-tokens',path], +p = subprocess.Popen(['clang','-raw-tokens-dump',path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) Index: clang/test/Preprocessor/dumptokens_phyloc.c === --- clang/test/Preprocessor/dumptokens_phyloc.c +++ clang/test/Preprocessor/dumptokens_phyloc.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -dump-tokens %s 2>&1 | grep "Spelling=.*dumptokens_phyloc.c:3:20" +// RUN: %clang_cc1 -tokens-dump %s 2>&1 | grep "Spelling=.*dumptokens_phyloc.c:3:20" #define TESTPHYLOC 10 Index: clang/test/Lexer/dollar-idents.c === --- clang/test/Lexer/dollar-idents.c +++ clang/test/Lexer/dollar-idents.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -dump-tokens %s 2>&1 | FileCheck %s -// RUN: %clang_cc1 -dump-tokens -x assembler-with-cpp %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASM +// RUN: %clang_cc1 -tokens-dump %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -tokens-dump -x assembler-with-cpp %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASM // PR3808 // CHECK: identifier '$A' Index: clang/test/CoverageMapping/while.c === --- clang/test/CoverageMapping/while.c +++ clang/test/CoverageMapping/while.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name loops.cpp %s | FileCheck %s +// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -coverage-mapping-dump -emit-llvm-only -main-file-name loops.cpp %s | FileCheck %s // CHECK: main int main() {// CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE+8]]:2 = #0 Index: clang/test/CoverageMapping/unused_function.cpp === --- clang/test/CoverageMapping/unused_function.cpp +++ clang/test/CoverageMapping/unused_function.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapp
[PATCH] D71709: Give frontend dump flags consistent names (*-dump instead of dump-*)
herzka updated this revision to Diff 235188. herzka added a comment. rebase, restore changes to CC1Options.td that I left out of last revision Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71709/new/ https://reviews.llvm.org/D71709 Files: clang/include/clang/Driver/CC1Options.td clang/lib/Frontend/CompilerInvocation.cpp clang/test/CoverageMapping/block-storage-starts-region.m clang/test/CoverageMapping/break.c clang/test/CoverageMapping/builtinmacro.c clang/test/CoverageMapping/casts.c clang/test/CoverageMapping/classtemplate.cpp clang/test/CoverageMapping/comment-in-macro.c clang/test/CoverageMapping/continue.c clang/test/CoverageMapping/control-flow-macro.c clang/test/CoverageMapping/decl.c clang/test/CoverageMapping/default-method.cpp clang/test/CoverageMapping/deferred-region.cpp clang/test/CoverageMapping/empty-destructor.cpp clang/test/CoverageMapping/header.cpp clang/test/CoverageMapping/if.cpp clang/test/CoverageMapping/implicit-def-in-macro.m clang/test/CoverageMapping/include-macros.c clang/test/CoverageMapping/includehell.cpp clang/test/CoverageMapping/label.cpp clang/test/CoverageMapping/lambda.cpp clang/test/CoverageMapping/logical.cpp clang/test/CoverageMapping/loopmacro.c clang/test/CoverageMapping/loops.cpp clang/test/CoverageMapping/macro-expansion.c clang/test/CoverageMapping/macro-expressions.cpp clang/test/CoverageMapping/macro-stringize-twice.cpp clang/test/CoverageMapping/macroception.c clang/test/CoverageMapping/macroparams.c clang/test/CoverageMapping/macroparams2.c clang/test/CoverageMapping/macros.c clang/test/CoverageMapping/macroscopes.cpp clang/test/CoverageMapping/md.cpp clang/test/CoverageMapping/moremacros.c clang/test/CoverageMapping/nestedclass.cpp clang/test/CoverageMapping/objc.m clang/test/CoverageMapping/openmp.c clang/test/CoverageMapping/pr32679.cpp clang/test/CoverageMapping/preprocessor.c clang/test/CoverageMapping/return.c clang/test/CoverageMapping/switch.cpp clang/test/CoverageMapping/switchmacro.c clang/test/CoverageMapping/system_macro.cpp clang/test/CoverageMapping/templates.cpp clang/test/CoverageMapping/test.c clang/test/CoverageMapping/trycatch.cpp clang/test/CoverageMapping/trymacro.cpp clang/test/CoverageMapping/unreachable-macro.c clang/test/CoverageMapping/unused_function.cpp clang/test/CoverageMapping/while.c clang/test/Lexer/dollar-idents.c clang/test/Preprocessor/dumptokens_phyloc.c clang/utils/token-delta.py Index: clang/utils/token-delta.py === --- clang/utils/token-delta.py +++ clang/utils/token-delta.py @@ -108,7 +108,7 @@ re.DOTALL | re.MULTILINE) def getTokens(path): -p = subprocess.Popen(['clang','-dump-raw-tokens',path], +p = subprocess.Popen(['clang','-raw-tokens-dump',path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) Index: clang/test/Preprocessor/dumptokens_phyloc.c === --- clang/test/Preprocessor/dumptokens_phyloc.c +++ clang/test/Preprocessor/dumptokens_phyloc.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -dump-tokens %s 2>&1 | grep "Spelling=.*dumptokens_phyloc.c:3:20" +// RUN: %clang_cc1 -tokens-dump %s 2>&1 | grep "Spelling=.*dumptokens_phyloc.c:3:20" #define TESTPHYLOC 10 Index: clang/test/Lexer/dollar-idents.c === --- clang/test/Lexer/dollar-idents.c +++ clang/test/Lexer/dollar-idents.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -dump-tokens %s 2>&1 | FileCheck %s -// RUN: %clang_cc1 -dump-tokens -x assembler-with-cpp %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASM +// RUN: %clang_cc1 -tokens-dump %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -tokens-dump -x assembler-with-cpp %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASM // PR3808 // CHECK: identifier '$A' Index: clang/test/CoverageMapping/while.c === --- clang/test/CoverageMapping/while.c +++ clang/test/CoverageMapping/while.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name loops.cpp %s | FileCheck %s +// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -coverage-mapping-dump -emit-llvm-only -main-file-name loops.cpp %s | FileCheck %s // CHECK: main int main() {// CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE+8]]:2 = #0 Index: clang/test/CoverageMapping/unused_function.cpp === --- clang/test/CoverageMapping/unused_function.cpp +++ clang/test/CoverageMapping/unused_function.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fprof
[PATCH] D29967: Get class property setter selector from property decl if exists
herzka created this revision. Before this fix, trying to set a class property using dot syntax would always use the constructed name (setX:), which might not match the real selector if the setter is specified via the `setter` property attribute. Now, the setter selector in the declaration has priority over the constructed name, which is consistent with instance properties. https://reviews.llvm.org/D29967 Files: lib/Sema/SemaExprObjC.cpp Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -2000,10 +2000,16 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +SetterSel = PD->getSetterName(); + } else { +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -2000,10 +2000,16 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +SetterSel = PD->getSetterName(); + } else { +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D29967: Get class property setter selector from property decl if exists
herzka planned changes to this revision. herzka added a comment. This issue applies to getters too. I'll make this fix broader. I think the real fix for both is to construct the ObjCPropertyRefExpr using the ObjCPropertyDecl so that it's considered an explicit property. Currently, it still gets considered implicit, which is not true. I don't know what implications changing that may have, though. This fix seems safer. https://reviews.llvm.org/D29967 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka updated this revision to Diff 88448. herzka retitled this revision from "Get class property setter selector from property decl if exists" to "Get class property selectors from property decl if it exists". herzka edited the summary of this revision. https://reviews.llvm.org/D29967 Files: lib/Sema/SemaExprObjC.cpp Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka updated this revision to Diff 88519. herzka edited the summary of this revision. herzka added a comment. Added full context. Sorry about that! This is my first contribution, and I don't know how I completely missed that line while going through the steps. https://reviews.llvm.org/D29967 Files: lib/Sema/SemaExprObjC.cpp Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka updated this revision to Diff 88650. herzka added a comment. Added test, used auto https://reviews.llvm.org/D29967 Files: lib/Sema/SemaExprObjC.cpp test/SemaObjC/objc-class-property.m Index: test/SemaObjC/objc-class-property.m === --- test/SemaObjC/objc-class-property.m +++ test/SemaObjC/objc-class-property.m @@ -21,22 +21,31 @@ @property (class) int c2; // expected-note {{property declared here}} \ // expected-note {{property declared here}} @property (class) int x; +@property (class, setter=customSetA:) int customSetterProperty; +@property (class, getter=customGetB) int customGetterProperty; @end @implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \ // expected-warning {{class property 'c2' requires method 'setC2:' to be defined}} @dynamic x; // refers to the instance property @dynamic (class) x; // refers to the class property @synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}} @dynamic c; // refers to the class property +@dynamic customSetterProperty; +@dynamic customGetterProperty; @end int test() { A *a = [[A alloc] init]; a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}} return a.x + A.c; } +void customSelectors() { + A.customSetterProperty = 1; + (void)A.customGetterProperty; +} + void message_id(id me) { [me y]; } Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (auto PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' Index: test/SemaObjC/objc-class-property.m === --- test/SemaObjC/objc-class-property.m +++ test/SemaObjC/objc-class-property.m @@ -21,22 +21,31 @@ @property (class) int c2; // expected-note {{property declared here}} \ // expected-note {{property declared here}} @property (class) int x; +@property (class, setter=customSetA:) int customSetterProperty; +@property (class, getter=customGetB) int customGetterProperty; @end @implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \ // expected-warning {{class property 'c2' requires method 'setC2:' to be defined}} @dynamic x; // refers to the instance property @dynamic (class) x; // refers to the class property @synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}} @dynamic c; // refers to the class property +@dynamic customSetterProperty; +@dynamic customGetterProperty; @end int test() { A *a = [[A alloc] init]; a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}} return a.x + A.c; } +void customSelectors() { + A.customSetterProperty = 1; + (void)A.customGetterProperty; +} + void message_id(id me) { [me y]; } Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (auto PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class))
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka updated this revision to Diff 88652. herzka added a comment. Rename selectors https://reviews.llvm.org/D29967 Files: lib/Sema/SemaExprObjC.cpp test/SemaObjC/objc-class-property.m Index: test/SemaObjC/objc-class-property.m === --- test/SemaObjC/objc-class-property.m +++ test/SemaObjC/objc-class-property.m @@ -21,22 +21,31 @@ @property (class) int c2; // expected-note {{property declared here}} \ // expected-note {{property declared here}} @property (class) int x; +@property (class, setter=customSet:) int customSetterProperty; +@property (class, getter=customGet) int customGetterProperty; @end @implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \ // expected-warning {{class property 'c2' requires method 'setC2:' to be defined}} @dynamic x; // refers to the instance property @dynamic (class) x; // refers to the class property @synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}} @dynamic c; // refers to the class property +@dynamic customSetterProperty; +@dynamic customGetterProperty; @end int test() { A *a = [[A alloc] init]; a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}} return a.x + A.c; } +void customSelectors() { + A.customSetterProperty = 1; + (void)A.customGetterProperty; +} + void message_id(id me) { [me y]; } Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (auto PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +GetterSel = PD->getGetterName(); +SetterSel = PD->getSetterName(); + } else { +GetterSel = PP.getSelectorTable().getNullarySelector(&propertyName); +SetterSel = + SelectorTable::constructSetterSelector(PP.getIdentifierTable(), + PP.getSelectorTable(), + &propertyName); + } + // Search for a declared property first. - Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); - ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); + ObjCMethodDecl *Getter = IFace->lookupClassMethod(GetterSel); // If this reference is in an @implementation, check for 'private' methods. if (!Getter) -Getter = IFace->lookupPrivateClassMethod(Sel); +Getter = IFace->lookupPrivateClassMethod(GetterSel); if (Getter) { // FIXME: refactor/share with ActOnMemberReference(). @@ -2000,11 +2013,6 @@ } // Look for the matching setter, in case it is needed. - Selector SetterSel = -SelectorTable::constructSetterSelector(PP.getIdentifierTable(), -PP.getSelectorTable(), - &propertyName); - ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); if (!Setter) { // If this reference is in an @implementation, also check for 'private' Index: test/SemaObjC/objc-class-property.m === --- test/SemaObjC/objc-class-property.m +++ test/SemaObjC/objc-class-property.m @@ -21,22 +21,31 @@ @property (class) int c2; // expected-note {{property declared here}} \ // expected-note {{property declared here}} @property (class) int x; +@property (class, setter=customSet:) int customSetterProperty; +@property (class, getter=customGet) int customGetterProperty; @end @implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \ // expected-warning {{class property 'c2' requires method 'setC2:' to be defined}} @dynamic x; // refers to the instance property @dynamic (class) x; // refers to the class property @synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}} @dynamic c; // refers to the class property +@dynamic customSetterProperty; +@dynamic customGetterProperty; @end int test() { A *a = [[A alloc] init]; a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}} return a.x + A.c; } +void customSelectors() { + A.customSetterProperty = 1; + (void)A.customGetterProperty; +} + void message_id(id me) { [me y]; } Index: lib/Sema/SemaExprObjC.cpp === --- lib/Sema/SemaExprObjC.cpp +++ lib/Sema/SemaExprObjC.cpp @@ -1984,13 +1984,26 @@ } } + Selector GetterSel; + Selector SetterSel; + if (auto PD = IFace->FindPropertyDeclaration( + &propertyName, ObjCPropertyQueryKind::OBJC_PR_query_class)) { +G
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka added a comment. Currently, `A.customGetterProperty` would be turned into `[A customGetterProperty]`, which would fail to compile because that selector isn't declared anywhere. With my fix, it does compile because it (correctly) resolves to `[A customGet]`, which does exist. Similarly, `a.customSetterProperty = 1` got turned into `[a setCustomSetterProperty:1]` (another nonexistent selector), but now becomes `[a customSet:1]`. Here are the errors I get when I run the test without my fix: error: 'error' diagnostics seen but not expected: File /Users/herzka/dev/OSS/llvm/tools/clang/test/SemaObjC/objc-class-property.m Line 45: no setter method 'setCustomSetterProperty:' for assignment to property File /Users/herzka/dev/OSS/llvm/tools/clang/test/SemaObjC/objc-class-property.m Line 46: no getter method for read from property 2 errors generated. https://reviews.llvm.org/D29967 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D29967: Get class property selectors from property decl if it exists
herzka added a comment. @compnerd, yes please. I don't have commit access. Thanks for the review! https://reviews.llvm.org/D29967 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits